Подтвердить что ты не робот

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

Это работает слишком хорошо. Корабль движется слишком быстро. Почти невозможно, чтобы он перемещался только в одном месте, влево или вправо. Как я могу сделать так, чтобы корабль двигался только один раз при нажатии клавиши?

4b9b3361

Ответ 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