<p>必须在进入while循环之前创建playerObj,然后每次只将其绘制到<code>DISPLAY_SURFACE</code>。另外,增加字典的键<code>y</code>也没有帮助,必须改为修改<code>rect</code>。微创解决方案是:</p>
<pre><code>import pygame, sys
from pygame.locals import *
FPS = 30
WIN_WIDTH = 800
WIN_HEIGHT = 600
HALF_WIDTH = int(WIN_WIDTH / 2)
HALF_HEIGHT = int(WIN_HEIGHT / 2)
COLOR = (255, 0, 255)
IMAGE = pygame.image.load('squirrel.png')
STARTSIZE = 25
LEFT = 'left'
def main():
pygame.init()
FPS_CLOCK = pygame.time.Clock()
movement = 1
moveUp = False
DISPLAY_SURFACE = pygame.display.set_mode((WIN_WIDTH, WIN_HEIGHT))
playerObj = {'surface': pygame.transform.scale(IMAGE, (STARTSIZE, STARTSIZE)),
'facing': LEFT,
'size': STARTSIZE,
'x': HALF_WIDTH,
'y': HALF_HEIGHT}
playerObj['rect'] = pygame.Rect( (playerObj['x'], playerObj['y'], playerObj['size'], playerObj['size']) )
while True:
DISPLAY_SURFACE.fill(COLOR)
DISPLAY_SURFACE.blit(playerObj['surface'], playerObj['rect'])
for event in pygame.event.get():
if event.type == KEYDOWN:
if event.key == K_UP:
moveUp = True
if event.type == KEYUP:
if event.key == K_UP:
moveUp = False
elif event.type == QUIT:
pygame.quit()
sys.exit()
if moveUp:
playerObj['rect'].y -= movement
print("moving up")
else:
print('stopped')
pygame.display.update()
FPS_CLOCK.tick(FPS)
if __name__ == '__main__':
main()
</code></pre>
<p>很管用,我自己试过了。但是你应该重构你的代码,不需要在你的字典中携带初始的x,y等值。在</p>
<p><strong>编辑</strong>
在所有四个方向移动时,这将是:</p>
^{pr2}$