странное поведение pygame при нажатии клавиш - PullRequest
1 голос
/ 16 марта 2020

Я новичок в модуле pygame.

Я отслеживаю нажатия клавиш с терминала через PyCharm IDE.

Для ясности добавляю скриншот рабочей области мой ниже.

enter image description here

Теперь проблема в том, что я обнаружил, что если я нажимаю и удерживаю DOWN и UP в то же время, система может обнаруживать RIGHT нажатий клавиш, но не знать о LEFT нажатиях клавиш.

То же самое относится к удерживанию W и S клавиши вместе и воспринимают T клавиши, но не ощущают E или Q клавиш.

RIGHT & LEFT при удержании, ощущения DOWN не чувствуют UP

Я добавляю полностью готовый к запуску код (за исключением того, что вам нужен установленный модуль pygame) для тех, кто может захотеть попробовать на своем компьютере.

import pygame
#import time

pygame.init()

display_width = 800
display_height = 600

white = (255, 255, 255)
black = (0, 0, 0)
red = (255, 0, 0)
green = (0, 255, 0)
blue = (0, 0, 255)

#carImg = pygame.image.load('raceCar.png')


# def drawCar(x, y):
#    gameDisplay.blit(carImg, (x, y))


x = display_width * 0.45
y = display_height * 0.6
dx = 0
dy = 0

gameDisplay = pygame.display.set_mode((display_width, display_height))
pygame.display.set_caption("MY GAME")

clock = pygame.time.Clock()

crashed = False
Quit = False

i = 0

while not crashed and not Quit:



    for event in pygame.event.get():

        # if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
        #     Quit = True
        #
        # elif event.type == pygame.KEYDOWN:
        #
        #     if event.key == pygame.K_DOWN:
        #         dy += 5
        #     elif event.key == pygame.K_UP:
        #         dy += -5
        #     elif event.key == pygame.K_RIGHT:
        #         dx += 5
        #     elif event.key == pygame.K_LEFT:
        #         dx += -5
        #
        # elif event.type == pygame.KEYUP:
        #
        #     if event.key == pygame.K_DOWN:
        #         dy += -5
        #     elif event.key == pygame.K_UP:
        #         dy += 5
        #     elif event.key == pygame.K_RIGHT:
        #         dx += -5
        #     elif event.key == pygame.K_LEFT:
        #         dx += 5
        #
        # elif event.type == pygame.QUIT:
        #     Quit = True

        i += 1
        print(i, event)

    # x = (x + 1) % display_width
    # y = (y - 1) % display_height
    x += dx
    y += dy
    gameDisplay.fill(white)
    x = x if x <= display_width else -163
    x = x if x+163 >= 0 else display_width
    y = y if y <= display_height else -244
    y = y if y + 244 >= 0 else display_height
    # drawCar(x, y)
    pygame.display.update()
    clock.tick(60)

pygame.quit()
quit()

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

Ответы [ 2 ]

1 голос
/ 17 марта 2020

Я подозреваю, что ваш код обрабатывает нажатия клавиш. Лучше использовать pygame.key.get_pressed(), который возвращает словарь текущего состояния всех клавиш, нажатых в этот момент. Но представленный код (закомментированный раздел), похоже, не имеет проблем, которые могли бы вызвать это.

Ниже приведен пример кода, который демонстрирует обработку нескольких нажатий клавиш. Вы также можете использовать его, чтобы клавиатура правильно работала с несколькими нажатиями. Я ожидаю, что каждая клавиатура может обрабатывать минимум 3 одновременных нажатия клавиш, поскольку в противном случае Ctrl - Alt - Del было бы невозможно.

import pygame

# Window size
WINDOW_WIDTH    = 400
WINDOW_HEIGHT   =  50
WINDOW_SURFACE  = pygame.HWSURFACE|pygame.DOUBLEBUF|pygame.RESIZABLE
DARK_BLUE     = (   3,   5,  54)
WHIPPED_CREAM = ( 251, 252, 214 )

### initialisation
pygame.init()
window = pygame.display.set_mode( ( WINDOW_WIDTH, WINDOW_HEIGHT ), WINDOW_SURFACE )
pygame.display.set_caption("Multi Keys Test")

# We need to write some stuff
default_font = pygame.font.SysFont(None, 40)

### Main Loop
clock = pygame.time.Clock()
done = False
while not done:

    # Handle user-input
    for event in pygame.event.get():
        if ( event.type == pygame.QUIT ):
            done = True

    # Make a string of which arrow-keys are pressed
    # EDIT: Removing the loop, as it seems to be causing some minor confusion  
    currently_pressed = ""
    keys = pygame.key.get_pressed()
    if ( keys[ pygame.K_UP ] ):
        currently_pressed += "up "
    if ( keys[ pygame.K_DOWN ] ):
        currently_pressed += "down "
    if ( keys[ pygame.K_LEFT ] ):
        currently_pressed += "left "
    if ( keys[ pygame.K_RIGHT ] ):
        currently_pressed += "right "
    keys_text = default_font.render( currently_pressed, True, WHIPPED_CREAM )

    # Update the window, but not more than 60fps
    window.fill( DARK_BLUE )
    window.blit( keys_text, ( 10, 10 ) )
    pygame.display.flip()

    # Clamp FPS
    clock.tick_busy_loop(60)

pygame.quit()

Что бы это ни стоило, я могу заставить его показывать "влево-вправо" все вместе.

0 голосов
/ 16 марта 2020

Это, скорее всего, результат аппаратных ограничений. Он называется клавиатурное покрытие и встречается у большинства дешевых коммерческих клавиатур

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...