所以,我想用pygame模块在python3中编码pac-man。但是,我不知道一旦按下一个键就如何保持吃豆人运动。目的是例如按下“向上”键,并且即使我松开该键,pac-man仍将继续沿该方向移动直到他碰到边界。截至目前,我还没有编码这些边界,因为我将pac-man的持续移动作为优先事项。我试图嵌套一个本来应该工作的while循环,但这显然给了我一个phat运行时错误。关于如何执行此操作的任何想法?
if keys[pygame.K_UP] and (pac.y - pac.radius) > 0:
pac.y -= pac.speed
pac.direction = "UP"
elif keys[pygame.K_DOWN] and (pac.y + 2*(pac.radius) + pac.speed) < height:
pac.y += pac.speed
pac.direction = "DOWN"
elif keys[pygame.K_LEFT] and (pac.x - pac.radius) > 0:
pac.x -= pac.speed
pac.direction = "LEFT"
left = True
elif keys[pygame.K_RIGHT] and (pac.x + 2*pac.radius + pac.speed) < width:
pac.x += pac.speed
pac.direction = "RIGHT"
right = True
预期结果是输入一个方向,而pac人将自己按此方向移动而无需按住键。实际上,发生的事情是我最终不得不按住键,以使pac男人能够朝想要的方向移动。
答案 0 :(得分:4)
在按下键时直接移动pacman不适用于您的程序。您应该在这里设置pacman的速度或其他东西,然后将每一帧应用到另一个功能中。
def update():
pac.y += pac.yspeed
pac.x += pac.xspeed
while True:
clock.tick(60)
if keys[pygame.K_UP] and (pac.y - pac.radius) > 0:
pac.yspeed = 1
elif keys[pygame.K_DOWN] and (pac.y + 2*(pac.radius) + pac.speed) < height:
pac.yspeed = -1
elif keys[pygame.K_LEFT] and (pac.x - pac.radius) > 0:
pac.xspeed = -1
left = True
elif keys[pygame.K_RIGHT] and (pac.x + 2*pac.radius + pac.speed) < width:
pac.xspeed = 1
right = True
if keys[pygame.K_ESC]:
break
update()
# Do all your other stuff
答案 1 :(得分:2)
我建议您在“吃豆人”类中创建一个对象,以跟踪“吃豆人”的移动方向(基本上是您已经设置的pac.direction
)。对于每次移动迭代,都不必检查您的键映射,而要检查pac.direction
并执行它说的操作。如果您想保持代码的大部分原样,基本上使它看起来与此类似:
if pac.direction == "UP" and (pac.y - pac.radius) > 0:
pac.y -= pac.speed
elif pac.direction == "DOWN" and (pac.y + 2*(pac.radius) + pac.speed) < height:
pac.y += pac.speed
elif pac.direction == "LEFT" and (pac.x - pac.radius) > 0:
pac.x -= pac.speed
left = True
elif pac.direction == "RIGHT" and (pac.x + 2*pac.radius + pac.speed) < width:
pac.x += pac.speed
right = True
然后,在进入代码之前,只需在按下键时将pac.direction
设置为正确的值。我必须承认,我对PyGame不熟悉,所以请留给读者。
或者,您可以通过将格式设置为pac.direction = (xSpeed, ySpeed)
来缩小此范围。然后,您的代码将压缩为(可以在行之前进行边界检查):
pac.x += pac.direction[0] # Could be pac.direction.x if you use an object instead of a tuple
pac.y += pac.direction[1] # Same as above with pac.direction.y
left = pac.direction[0] > 0 # I'm unsure why you're doing left and right separately, so I'll just put left
答案 2 :(得分:0)
您可以使用OR语句检查“吃豆人”是否已获得指示:
if (keys[pygame.K_UP] or pac.direction == "UP") and (pac.y - pac.radius) > 0:
为每个方向的每个if语句重复。
这是假设没有其他代码在改变方向。
答案 3 :(得分:0)
为什么不使用变量来存储最新方向
while True:
if keys[pygame.K_UP] and (pac.y - pac.radius) > 0:
recent_direction = 'UP'
elif keys[pygame.K_DOWN] and (pac.y + 2*(pac.radius) + pac.speed) < height:
recent_direction = 'DOWN'
elif keys[pygame.K_LEFT] and (pac.x - pac.radius) > 0:
recent_direction = 'LEFT'
elif keys[pygame.K_RIGHT] and (pac.x + 2*pac.radius + pac.speed) < width:
recent_direction = 'RIGHT'
while True:
if recent_direction == 'UP':
pac.y -= pac.speed
elif recent_direction == 'DOWN':
pac.y += pac.speed
if recent_direction == 'LEFT':
pac.x -= pac.speed
if recent_direction == 'RIGHT':
pac.x += pac.speed
希望这对您有用