吃豆人-按下并释放一个键后,保持吃豆人向一个方向移动

时间:2019-03-25 18:51:27

标签: python pygame pacman

所以,我想用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男人能够朝想要的方向移动。

4 个答案:

答案 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

希望这对您有用