Pac-Man — заставляет pacman двигаться в определенном направлении после нажатия и отпускания одной клавиши

#python #pygame #pacman

#python #pygame #pacman

Вопрос:

Итак, я хочу закодировать pac-man на python3 с помощью модуля pygame. Однако я не знаю, как заставить pac-man двигаться после нажатия одной клавиши. Цель состоит в том, чтобы нажать, например, клавишу «вверх», и pac-man продолжит двигаться в этом направлении, пока не достигнет границы, даже если я отпущу клавишу. На данный момент я не кодировал эти границы, поскольку я отдаю приоритет непрерывному движению pac-man. Я попытался вложить цикл while, который должен был сработать, но это, очевидно, выдало мне огромную ошибку во время выполнения. Есть идеи о том, как я могу это сделать?

 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 man будет двигаться в этом направлении самостоятельно, без необходимости удерживать клавишу нажатой. На самом деле происходит то, что мне в конечном итоге приходится удерживать клавишу нажатой, чтобы pac man двигался в нужном направлении.

Комментарии:

1. Не могли бы вы, пожалуйста, добавить еще немного своего кода вокруг инструкции if.

2. В настоящее время вы перемещаете pacman (например, pac.x = pac.speed ) только при нажатии клавиши (например, elif keys[pygame.K_RIGHT]... ). Вы должны сохранять информацию о направлении при нажатии клавиши и помещать код перемещения в какое-либо место, которое периодически выполняется (например, использовать таймер).

Ответ №1:

Прямое перемещение вашего 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. Точно. Но поскольку вы зашли так далеко, ответ был бы полным, если бы он показывал, как вызывать update на каждом временном шаге.

2. Это сработало действительно хорошо, мне пришлось внести некоторые незначительные корректировки, чтобы гарантировать, что pac-man перемещается только в направлении x или y за раз, поэтому я использовал несколько операторов if. Но это было абсолютно идеально, спасибо

Ответ №2:

Я бы рекомендовал создать объект в вашем классе Pac-Man, который отслеживает направление, в котором должен двигаться Pac-Man (в основном, ваше, которое 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

  

Ответ №3:

Вы могли бы использовать оператор OR, чтобы проверить, было ли Pac Man уже задано направление:

if (keys[pygame.K_UP] or pac.direction == "UP") and (pac.y - pac.radius) > 0:

Повторите для каждого оператора if в каждом направлении.

Это предполагает, что никакой другой код не меняет направление.

Ответ №4:

Почему бы не использовать переменную для сохранения самого последнего направления

 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
  

Надеюсь, это сработает для вас