Pygame图像在使用正确的代码时移动不正确



这是我的pygame空间入侵者代码。现在,我正试图让宇宙飞船的图像移动。这是我的代码

import pygame
pygame.init()
screen = pygame.display.set_mode((1600, 900), pygame.RESIZABLE)
window_width, window_height = screen.get_width(), screen.get_height()
pygame.display.set_caption("space invaders")
icon = pygame.image.load('images/space-invaders.png')
pygame.display.set_icon(icon)
player_image = pygame.image.load('images/player.png')
playerX = window_width / 2 - 50
playerY = (window_height / 2) + (window_height / 3)

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

running = True
while running:
playerX_change = 0
screen.fill((0, 0, 0))
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
#if keystroke is pressed check whether its right or left
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
playerX_change = -5
elif event.key == pygame.K_RIGHT:
playerX_change = 5
playerX += playerX_change
player(playerX, playerY)

当我运行这个代码时,每次我点击箭头键,飞船就会移动。但当我握住它们时,它会向左或向右移动5次,然后不再移动。我该怎么解决这个问题。

您混合了两种不同的方法-eventspygame.key.get_pressed()

当您按下按钮时,系统只发送一个事件,因此您只能设置一次playerX_change = -5,而不能在loop中设置playerX_change = 0。但你也必须使用event.type == pygame.KEYUP来停止移动它

# set start value before loop
playerX_change = 0
running = True
while running:
screen.fill((0, 0, 0))
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
#if keystroke is pressed check whether its right or left
elif event.type == pygame.KEYDOWN:
# set "speed" 
if event.key == pygame.K_LEFT:
playerX_change = -5
elif event.key == pygame.K_RIGHT:
playerX_change = 5
elif event.type == pygame.KEYUP:
# reset "speed"
if event.key == pygame.K_LEFT:
playerX_change = 0
elif event.key == pygame.K_RIGHT:
playerX_change = 0
playerX += playerX_change
player(playerX, playerY)
pygame.display.flip()

使用pygame.key.get_pressed(),您可以在每个循环中检查密钥,然后您必须在每次检查之前设置playerX_change = 0

running = True
while running:
screen.fill((0, 0, 0))
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
playerX_change = 0
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
playerX_change = -5
if keys[pygame.K_RIGHT]:
playerX_change = 5
playerX += playerX_change
player(playerX, playerY)
pygame.display.flip()

最新更新