- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在开发一款赛车游戏。我一直在使用这段代码,但我的玩家只移动一次。我该如何解决这个问题?
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 类。
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对象,因为您将使用它们。
如果您不想进入 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()
正如您在上面所看到的,移动赛车的代码可以得到简化。
我应该注意,我对上面概述的每种方法都做了一些假设。
您使用圆形、方形或某种类型的 pygame 形状对象。
或者您使用的是 Sprite 。
如果您当前没有使用上述任何方法,我建议您这样做。一旦您开始构建更大、更复杂的游戏,这样做将使您的代码更容易维护。
关于python - 如何让你的角色移动而不需要反复点击按钮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38933399/
我有一个小心理障碍:我有一个 html 中的 javascript 函数,可以在按下某个键时写入键码。我已经将它连接到一个函数,该函数可以准确地告诉我按下了什么字符和键码(不包括在内)。 我的问题是如
我上网已经有一段时间了,现在正试图解决这个问题。可以找到正在发生的事情的视频: https://i.gyazo.com/59fc489b6099b513c41aedeed482b8d2.mp4 $(d
我有一个 Python 程序,其中一个函数导入另一个脚本并运行它。但是脚本仅在第一次函数被调用时运行。 def Open_Generator(事件): 导入密码生成器 有什么建议吗? *该函数在 tk
我正在尝试在 git 中创建两个包含二进制文件的分支 - 一个“开发”分支和一个“稳定”分支。在我想将它们“发布”到稳定分支之前,开发分支可以对这些文件进行一些更改(并且稳定分支已重命名这些文件,以防
我在 IBM BlueMix 中的 Node Red 应用程序反复崩溃 - 每小时一次 - 除了“exited with status: 1.”之外没有任何真正的错误消息 如何解决此问题? 是否有来自
我是一名优秀的程序员,十分优秀!