Мой космический корабль продолжает двигаться, даже когда я не нажимаю боковые клавиши

#python #python-3.x #pygame

#python #python-3.x #pygame

Вопрос:

 import pygame
#initialize the screen
pygame.init()

#create the screen
screen = pygame.display.set_mode((800, 700))

#tile and icon
pygame.display.set_caption("Space Invaders")
icon = pygame.image.load("spaceship.png")
pygame.display.set_icon(icon)

#Player
playerImg = pygame.image.load("player.png")
playerx = 370
playery = 600
playerx_change = 0.39

def player(x,y):
    screen.blit(playerImg, (x,y))

running = True
while running:

    screen.fill((0,0,0))
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

        #keystroke
        if event.type == pygame.KEYDOWN:
           if event.key == pygame.K_LEFT:
                playerx_change = -0.39
           if event.key== pygame.K_RIGHT:
                playerx_change = 0.39
           if event.type == pygame.KEYUP:
                if event.key == pygame.K_LEFT or event.type == pygame.K_RIGHT:
                    playerx_change = 0
            

    playerx  = playerx_change
    player(playerx,playery)
    pygame.display.update() 
  

Мой космический корабль продолжает двигаться, даже когда я не нажимаю боковые клавиши. я создаю space invaders, используя python и pygame.корабль не останавливается, как это должно было быть в соответствии с кодом. я использую версию Visual Studio 2019 для сообщества.

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

1. Я попробовал ваш метод, но когда я меняю его с key на type, я не могу переместить свой космический корабль в правую сторону, и он все еще не останавливается даже после того, как я отпускаю клавиши

Ответ №1:

В вашем коде есть опечатка, event.key == pygame.K_RIGHT а не event.type == pygame.K_RIGHT .
Более того, существует проблема с отступом:

 running = True
while running:
    # [...]  

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

        #keystroke
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                playerx_change = -0.39
            if event.key== pygame.K_RIGHT:
                playerx_change = 0.39
        
        #<--| INDENTATION
        if event.type == pygame.KEYUP:
           if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                playerx_change = 0
  

В любом случае я рекомендую использовать pygame.key.get_pressed() , а не ключевые события для движения:

 running = True
while running:

    screen.fill((0,0,0))
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:        
        playerx -= 0.39
    if keys[pygame.K_RIGHT]:        
        playerx  = 0.39

    player(playerx,playery)
    pygame.display.update() 
  

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