gpt4 book ai didi

python - 如何让你的角色移动而不需要反复点击按钮?

转载 作者:太空宇宙 更新时间:2023-11-03 16:16:12 24 4
gpt4 key购买 nike

我正在开发一款赛车游戏。我一直在使用这段代码,但我的玩家只移动一次。我该如何解决这个问题?

change = 7
dist = 7
change_r = 0
change_l = 0
dist_u = 0
dist_d = 0
pygame.display.update()


for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
change_r = True

elif event.key == pygame.K_LEFT:
change_l = True


elif event.key == pygame.K_UP:
dist_u = True

elif event.key == pygame.K_DOWN:
dist_d = True



if event.type == pygame.KEYUP:
if event.key == pygame.K_RIGHT or event.key == pygame.K_LEFT or event.key == pygame.K_UP or event.key == pygame.K_DOWN:
change_r = False
change_l = False
dist_u = False
dist_d = False
clock.tick(60)

if change_r == True:
x += change
if change_l == True:
x -= change
if dist_u == True:
y -= dist
if dist_d == True:
y += dist

最佳答案

您可以通过多种方式使用 Pygame 制作可移动的形状/ Sprite 。您在问题中发布的代码似乎过于复杂。我将为您提供两种更简单、更易于使用的不同方法。使用 Sprite 类,并使用函数。

看起来我并没有回答你的问题,但如果我只是告诉你要在你发布的代码中修复哪些内容,我只是故意引导你走上一条会导致许多问题的道路。 future 的复杂性。

方法一:使用 Sprite 类

要制作赛车 Sprite ,您可以使用如下所示的 Sprite 类。

class Player(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface((50, 50))
self.image.fill((255, 0, 0))
self.rect = self.image.get_rect()
self.rect.x = WIDTH / 2
self.rect.y = HEIGHT / 2
self.vx = 0
self.vy = 0

def update(self):
self.vx = 0
self.vy = 0
key = pygame.key.get_pressed()
if key[pygame.K_LEFT]:
self.vx = -5
elif key[pygame.K_RIGHT]:
self.vx = 5
if key[pygame.K_UP]:
self.vy = -5
elif key[pygame.K_DOWN]:
self.vy = 5
self.rect.x += self.vx
self.rect.y += self.vy

由于您的类继承自 Pygame 的 sprite 类,您必须命名您的图像 self.image 并且您必须为图像命名您的矩形> self.rect。您还可以看到,该类有两个主要方法。一种用于创建 Sprite (__init__),另一种用于更新 Sprite (update)

要使用您的类,请创建一个 Pygame Sprite 组来保存所有 Sprite ,然后将您的玩家对象添加到该组中:

sprites = pygame.sprite.Group()
player = Player()
sprtites.add(player)

要实际将 Sprite 渲染到屏幕上,请在游戏循环中调用 sprites.update()sprites.draw(),在其中更新屏幕:

sprites.update()
window_name.fill((200, 200, 200))
sprites.draw(window_name)
pygame.display.flip()

我强烈推荐使用 Sprite 类的原因是,它会让你的代码看起来更干净,并且更容易维护。您甚至可以将每个 Sprite 类移动到它们自己的单独文件中。

但是,在完全深入研究上述方法之前,您应该阅读 pygame.Rect对象和 pygame.sprite对象,因为您将使用它们。

方法2:使用函数

如果您不想进入 Sprite 类,您可以使用类似于下面的函数来创建游戏实体。

def create_car(surface, x, y, w, h, color):
rect = pygame.Rect(x, y, w, h)
pygame.draw.rect(surface, color, rect)
return rect

如果您仍然想使用 Sprite ,但不想创建类,只需稍微修改上面的函数:

def create_car(surface, x, y, color, path_to_img):
img = pygame.image.load(path_to_img)
rect = img.get_rect()
surface.blit(img, (x, y))

这是我如何使用上面的函数来制作可移动矩形/ Sprite 的示例:

import pygame

WIDTH = 640
HEIGHT = 480
display = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Moving Player Test")
clock = pygame.time.Clock()
FPS = 60

def create_car(surface, x, y, w, h, color):
rect = pygame.Rect(x, y, w, h)
pygame.draw.rect(surface, color, rect)
return rect

running = True
vx = 0
vy = 0
player_x = WIDTH / 2 # middle of screen width
player_y = HEIGHT / 2 # middle of screen height
player_speed = 5
while running:
clock.tick(FPS)
for e in pygame.event.get():
if e.type == pygame.QUIT:
running = False
pygame.quit()
quit()
if e.type == pygame.KEYDOWN:
if e.key == pygame.K_LEFT:
vx = -player_speed
elif e.key == pygame.K_RIGHT:
vx = player_speed
if e.key == pygame.K_UP:
vy = -player_speed
elif e.key == pygame.K_DOWN:
vy = player_speed
if e.type == pygame.KEYUP:
if e.key == pygame.K_LEFT or e.key == pygame.K_RIGHT or\
e.key == pygame.K_UP or e.key == pygame.K_DOWN:
vx = 0
vy = 0

player_x += vx
player_y += vy
display.fill((200, 200, 200))
####make the player#####
player = create_car(display, player_x, player_y, 10, 10, (255, 0, 0))
pygame.display.flip()

正如您在上面所看到的,移动赛车的代码可以得到简化。

我应该注意,我对上面概述的每种方法都做了一些假设。

  1. 您使用圆形、方形或某种类型的 pygame 形状对象。

  2. 或者您使用的是 Sprite 。

如果您当前没有使用上述任何方法,我建议您这样做。一旦您开始构建更大、更复杂的游戏,这样做将使您的代码更容易维护。

关于python - 如何让你的角色移动而不需要反复点击按钮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38933399/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com