我找到了一个解决方案,可以在按住按键时移动精灵。问题在于它强制编写丑陋的重复代码。我找到的当前解决方案是:
for event in pygame.event.get():
if event.type == KEYDOWN:
keystate = pygame.key.get_pressed()
while keystate[K_RIGHT]:
screen.fill((255,255,255))
pygame.event.get()
for sprite in sprites:
rimage = sprite[1].getimage()
if sprite[2] is None:
x+=3
sprite[1].update(time)
screen.blit(rimage, (x,y))
if sprite[1].isfinished() == True:
sprite[1].reset()
last_dir = "right"
if x >= screen_width - rimage.get_width():
x = screen_width - rimage.get_width()
#update player sprite movement
#update player sprite animation
#update rest of game map
keystate = pygame.key.get_pressed()
time = pygame.time.get_ticks()
pygame.display.update()
问题是while keystate块。必须针对每个方向重复,并且需要在每个块中更新游戏世界。这是需要复制相同代码的五个地方....如果没有按下一个键,则加上4个方向。我可以将它包装在一个函数中,但我想知道是否有更好的方法来处理按下pygame中的按钮。
答案 0 :(得分:5)
pygame中常用的方法是使用事件来更新方向,然后在事件外写下更新位置代码,这样你就不需要复制代码了。
clock = pygame.time.Clock()
direction = (0,0)
while True: # main loop
for event in pygame.event.get():
if event.type == KEYDOWN:
if event.key == K_RIGHT:
direction = (3, 0)
elif event.key == K_LEFT:
direction = (-3, 0)
elif event.key == K_UP:
direction = (0, 3)
elif event.key == K_DOWN:
direction = (0, -3)
else:
print "Unrecognized key"
if event.type == KEYUP:
direction = (0, 0)
screen.fill((255,255,255))
for sprite in sprites:
rimage = sprite[1].getimage()
if sprite[2] is None:
# Check if new position is inside the screen
new_pos = x + direction[0], y + direction[1]
if new_pos[0] + rimage.get_width() < screen_width:
x = new_pos[0]
if new_pos[1] + rimage.get_height() < screen_height:
y = new_pos[1]
# Draw the sprite
sprite[1].update(time)
screen.blit(rimage, (x,y))
if sprite[1].isfinished() == True:
sprite[1].reset()
last_dir = direction
#update player sprite movement
#update player sprite animation
#update rest of game map
time = pygame.time.get_ticks()
pygame.display.update()
clock.tick(40) # Keep game running at 40 fps
如果您愿意,您可以使用keystate实现相同的目标,在这种情况下,您不需要处理关键事件。
答案 1 :(得分:1)
Pygame建议或暗示将程序划分为3个部分:
事件处理,更新和绘图。 正如pmoleri所说,你只需改变运动的方向。 在更新功能中,您应传入增量时间参数,以根据传递的时间移动所有精灵。这非常重要,因为其他技术没有考虑处理器的可变速度。 DOS中的游戏就是以这种方式制作的,所以现在我们需要模拟器来人为地减慢处理器的速度。绘图部分简单地绘制所有精灵。
通过这种方式,您可以在游戏中的这3个不同部分之间进行明确划分:玩家输入,游戏逻辑(移动,碰撞,动作等)和绘图。
答案 2 :(得分:1)
此外,可以使用pygame.key.get_pressed()
。
这将返回当前正在按下的所有键的列表。
keys = pygame.key.get_pressed()
if keys[pygame.K_w]:
# Move Up
if keys[pygame.K_a]:
# Move Down
... etc ...
这不需要在事件部分中,但可能在播放器更新的位置。
这可以使代码更少笨重,并且(可能)更有效率
- 希望我帮忙!