<p>你的事件循环真的一团糟,应该重组。<code>keys = pygame.key.get_pressed()</code>不应在事件循环中调用,而应在外部while循环中调用。我有一个最小的例子来展示一种进行移动和事件处理的方法(只使用事件循环而不使用<code>key.get_pressed</code>)。在</p>
<pre><code>import sys
import pygame
pygame.init()
screen = pygame.display.set_mode((700, 600))
clock = pygame.time.Clock()
player = pygame.Surface((30, 30))
player.fill((120, 240, 90))
px = 100
py = 200
x_speed = 0
y_speed = 0
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
# If player is on the ground, jump (in more advanced
# games you need collision detection instead >= 480).
if event.key == pygame.K_UP and py >= 480:
y_speed = -20
elif event.key == pygame.K_RIGHT:
x_speed = 10
elif event.key == pygame.K_LEFT:
x_speed = -10
elif event.type == pygame.KEYUP:
# If player is moving right, stop him.
if event.key == pygame.K_RIGHT and x_speed > 0:
x_speed = 0
# If player is moving left, stop him.
elif event.key == pygame.K_LEFT and x_speed < 0:
x_speed = 0
# Don't jump too high.
if py <= 200:
y_speed = 20
# Don't go below y = 480.
if py >= 480:
py = 480
# Move the player.
px += x_speed
py += y_speed
# The Wall.
if px <= 0:
px = 0
if px >= 630:
px = 630
screen.fill((50, 50, 50))
screen.blit(player, (px, py))
pygame.display.flip()
clock.tick(30)
</code></pre>