#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
Надеюсь, это сработает для вас