Как получить ввод с клавиатуры в pygame?
Я делаю игру в pygame 1.9.2.
Это неудачная простая игра, в которой корабль перемещается между пятью колоннами плохих парней, которые атакуют, медленно двигаясь вниз. Я пытаюсь сделать так, чтобы корабль двигался влево и вправо с помощью клавиш со стрелками влево и вправо. Вот мой код:
keys=pygame.key.get_pressed()
if keys[K_LEFT]:
location-=1
if location==-1:
location=0
if keys[K_RIGHT]:
location+=1
if location==5:
location=4
Это работает слишком хорошо. Корабль движется слишком быстро. Почти невозможно, чтобы он перемещался только в одном месте, влево или вправо. Как я могу сделать так, чтобы корабль двигался только один раз при нажатии клавиши?
Ответы
Ответ 1
Вы можете получить события из pygame, а затем следить за событием KEYDOWN
, вместо того, чтобы смотреть на ключи, возвращаемые get_pressed()
(который дает вам клавиши, которые в настоящее время нажаты, тогда как событие KEYDOWN
показывает вы, какие клавиши были нажаты на этот кадр).
Что происходит с вашим кодом прямо сейчас, так это то, что если ваша игра будет рендерить со скоростью 30 кадров в секунду, а вы удерживаете клавишу со стрелкой влево на полсекунды, вы обновляете местоположение 15 раз.
events = pygame.event.get()
for event in events:
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
location -= 1
if event.key == pygame.K_RIGHT:
location += 1
Чтобы поддерживать непрерывное движение во время удерживания клавиши, вам нужно будет установить какое-то ограничение, основанное на принудительной максимальной частоте кадров игрового цикла или счетчиком, который позволяет вам перемещать все так много тики цикла.
move_ticker = 0
keys=pygame.key.get_pressed()
if keys[K_LEFT]:
if move_ticker == 0:
move_ticker = 10
location -= 1
if location == -1:
location = 0
if keys[K_RIGHT]:
if move_ticker == 0:
move_ticker = 10
location+=1
if location == 5:
location = 4
Тогда где-то во время игрового цикла вы сделаете что-то вроде этого:
if move_ticker > 0:
move_ticker -= 1
Это позволит вам перемещаться только раз в 10 кадров (поэтому, если вы переместитесь, тикер будет установлен в 10, а после 10 кадров он позволит вам снова перемещаться)
Ответ 2
import pygame
pygame.init()
pygame.display.set_mode()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit(); #sys.exit() if sys is imported
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_0:
print("Hey, you pressed the key, '0'!")
if event.key == pygame.K_1:
print("Doing whatever")
Обратите внимание, что K_0 и K_1 не являются единственными ключами, чтобы увидеть их все, см. документацию pygame, иначе нажмите tab
после ввода в
Pygame.
(обратите внимание, что после pygame) в простую программу. Обратите внимание, что K должен быть капиталом. Также обратите внимание, что если вы не дадите pygame размер дисплея (не передавайте аргументы), тогда он будет автоматически использовать размер экрана/монитора компьютера. Счастливое кодирование!
Ответ 3
Попробуйте следующее:
keys=pygame.key.get_pressed()
if keys[K_LEFT]:
if count == 10:
location-=1
count=0
else:
count +=1
if location==-1:
location=0
if keys[K_RIGHT]:
if count == 10:
location+=1
count=0
else:
count +=1
if location==5:
location=4
Это означает, что вы перемещаете только 1/10 времени. Если он по-прежнему движется в сторону, вы можете попытаться увеличить значение, которое вы также установили "count".
Ответ 4
Просто fyi, если вы пытаетесь обеспечить, чтобы корабль не покидал экран с помощью
location-=1
if location==-1:
location=0
вы, вероятно, можете лучше использовать
location -= 1
location = max(0, location)
Таким образом, если он пропустит -1, ваша программа не сломает
Ответ 5
Чтобы замедлить игру, используйте pygame.clock.tick(10)
Ответ 6
Вы должны использовать clock.tick(10)
, как указано в docs.
Ответ 7
все приведенные выше ответы слишком сложны, я бы просто изменил переменные на 0,1 вместо 1
это делает корабль в 10 раз медленнее
если это еще слишком быстрое изменение переменных на 0,01
это делает корабль в 100 раз медленнее
попробуйте это
keys=pygame.key.get_pressed()
if keys[K_LEFT]:
location -= 0.1 #or 0.01
if location==-1:
location=0
if keys[K_RIGHT]:
location += 0.1 #or 0.01
if location==5:
location=4