Как получить ввод с клавиатуры в 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 ваша программа не сломается


вы должны использовать clock.tick(10) Как говорится в docs.


все ответы выше слишком сложны, я бы просто изменил переменные на 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