Нажатия клавиш не регистрируются в Python / Pygame?

#python #python-3.x #pygame

#python #python-3.x #pygame

Вопрос:

Я новичок в Python и особенно новичок в Pygame. Работал над базовой игрой типа space invader, чтобы попытаться узнать больше о Pygame, но я не могу понять код для перемещения пользовательского корабля. Просмотрел несколько руководств по этому вопросу, и я ДУМАЮ, что мой код выглядит хорошо, но, возможно, я что-то просматриваю. Я нахожусь в Python версии 3.8 и Pygame версии 1.9.6.

 '''
This script is creating a space invader type game with the Pygame module.

Tutorial following YT video from  freecodecamp.org
(https://www.youtube.com/watch?v=FfWpgLFMI7wamp;ab_channel=freeCodeCamp.org)
'''

import sys
import pygame

# Initializing Pygame
# (ALWAYS REQUIRED)
pygame.init()

# Screen Dimensions
width = 800
height = 600
screen = pygame.display.set_mode((width, height))

# Other Game Settings
framerate = pygame.time.Clock()
framerate.tick(60)

# Setting Title and Images
pygame.display.set_caption('Space Invaders')
icon = pygame.image.load('spaceship.png')
pygame.display.set_icon(icon)
player_ship =  pygame.image.load('space-invaders.png')

def player(x,y):
    '''
    Draws the player's ship on the screen at (x,y) coordinates.
    '''
    screen.blit(player_ship,(x, y))

# Game Function
def game():
    '''
    Actual code for the game itself.
    '''
    # Sets the starting position for the player's ship
    playerX = 368 # Middle of Screen (on x-axis)
    playerY = 506 # 30px off bottom of the screen (y-axis)

    x_change = 0

    # Game Loop
    game_exit = False
    while not game_exit:

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                game_exit = True
            elif event.type == pygame.KEYDOWN:
                if event.type == pygame.K_ESCAPE:
                    game_exit = True
                elif event.type == pygame.K_d:
                    x_change = 5
                elif event.type == pygame.K_a:
                    x_change = -5
            elif event.type == pygame.KEYUP:
                if event.key == pygame.K_d or event.key == pygame.K_a:
                    x_change = 0

            playerX  = x_change

            print(x_change) # Using this to see if the script is recognizing the user keystrokes

        # Setting Screen RGB
        screen.fill((0,0,0))

        player(playerX, playerY)

        # Screen Update
        # (ALWAYS REQUIRED)
        pygame.display.update()

game()

pygame.quit()
sys.exit()
  

Спасибо за вашу помощь!

Комментарии:

1. Игра откроется и отобразит черный фон с изображением корабля пользователя, как я хочу, но затем, когда я использую клавиши «A» или «D» для перемещения корабля из стороны в сторону, он остается на месте и выводит значение x_change 0, как будто я ненажатие клавиш. Я попытался поменять местами ‘A’ и ‘D’ для разных буквенных клавиш, а также клавиш со стрелками, но это ничего не меняет, заставляя меня поверить, что это просто проблема с самим кодом, а не с конкретными клавишами, которые я использую для управления кораблем.

Ответ №1:

Проблема в том, что вы проверяете наличие event.type of pygame.K_d и т. Д.

     for event in pygame.event.get():
        if event.type == pygame.QUIT:
            game_exit = True
        elif event.type == pygame.KEYDOWN:
            if event.type == pygame.K_ESCAPE:      # <-- HERE
                game_exit = True
            elif event.type == pygame.K_d:         # <-- HERE
                x_change = 5
            elif event.type == pygame.K_a:         # <-- AND HERE
                x_change = -5
  

event.type Не может быть равно обоим pygame.KEYDOWN и pygame.K_d одновременно!. Если вы проверите документацию по событию, обратите внимание, что отправляется код ключа event.key , так что это простое исправление.

Клавиша нажатия клавиш, мод, юникод,
клавиша ввода сканкодов, мод

     for event in pygame.event.get():
        if event.type == pygame.QUIT:
            game_exit = True
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:      # <-- FIX HERE
                game_exit = True
            elif event.key == pygame.K_d:         # <-- FIX HERE
                x_change = 5
            elif event.key == pygame.K_a:         # <-- AND FIX HERE
                x_change = -5
  

Комментарии:

1. Большое вам спасибо! Я знал, что это должно быть что-то, что пролетело у меня над головой. Я только что предположил, что у меня уже было правильное фактическое условие, и это была проблема с чем-то другим. Мне нужно убедиться, что я проверяю все в следующий раз. Ты спаситель!