Как получить ввод с клавиатуры в 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
это работает слишком хорошо. Корабль движется слишком быстро. Почти невозможно заставить его двигаться только в одном месте, влево или вправо. Как я могу сделать так, чтобы корабль двигался только один раз каждый раз, когда ключ нажал?
6 ответов
вы можете получить события из pygame, а затем следить за KEYDOWN
событие, вместо того чтобы смотреть на ключи, возвращенные get_pressed()
(что дает вам клавиши, которые в настоящее время нажаты, тогда как KEYDOWN
событие показывает, какие клавиши были нажаты на раму).
что происходит с вашим кодом прямо сейчас, так это то, что если ваша игра рендеринга на 30fps, и вы удерживаете клавишу со стрелкой влево в течение половины секунды, вы обновляете местоположение 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 кадров он позволит вам двигаться снова)
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 размер дисплея (не проходите никаких args), то он будет автоматически использовать размер экрана/монитора компьютера. Удачи в кодировании!
попробуйте это:
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".
просто fyi, если вы пытаетесь убедиться, что корабль не уходит с экрана с
location-=1
if location==-1:
location=0
вы, вероятно, можете лучше использовать
location -= 1
location = max(0, location)
таким образом, если он пропускает -1 ваша программа не сломается
все ответы выше слишком сложны, я бы просто изменил переменные на 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