Pygame玩家对象移动异常:Rect位置更新但图像不移动
问题解决:Pygame玩家图像不随坐标移动
问题根源
你在movement方法中仅更新了self.pos列表的值,但用于绘制玩家的self.player_rect对象的位置并未同步更新。player_rect在初始化时基于pos创建,之后pos的变化不会自动反映到player_rect上,导致绘制的位置始终停留在初始状态。
解决方案
推荐直接操作player_rect的x和y属性(或top、left等),无需单独维护pos变量,这更符合Pygame的设计逻辑,也能避免同步问题。
修改后的代码
# Imports import pygame import sys from pygame.locals import * # Init Pygame pygame.init() # Screen Info FPS = 120 fps_clock = pygame.time.Clock() WINDOW_SIZE = 400, 400 screen = pygame.display.set_mode(WINDOW_SIZE, 0, 32) pygame.display.set_caption("Sanctified Being") # Colors BG_COLOR = 170, 170, 170 PLAYER_NORMAL_COLOR = 0, 255, 0 PLAYER_DAMAGED_COLOR = 255, 0, 0 # Quit Game Function def quit_game(): pygame.quit() sys.exit() # Player Class class Player: def __init__(self): self.dimension = [50, 50] # 直接初始化rect,无需单独pos变量 self.player_rect = pygame.Rect(200, 200, self.dimension[0], self.dimension[1]) self.current_state = "normal" self.color = PLAYER_NORMAL_COLOR self.speed = 1 def draw(self): pygame.draw.rect(screen, self.color, self.player_rect) def movement(self): key_pressed = pygame.key.get_pressed() # 直接修改rect的x/y属性 if key_pressed[K_LEFT]: self.player_rect.x -= self.speed if key_pressed[K_RIGHT]: self.player_rect.x += self.speed if key_pressed[K_UP]: self.player_rect.y -= self.speed if key_pressed[K_DOWN]: self.player_rect.y += self.speed # Player player_one = Player() # Game Loop while True: # Background Color screen.fill(BG_COLOR) # 先处理移动,再绘制(逻辑更合理) player_one.movement() player_one.draw() # Check For Events for event in pygame.event.get(): if event.type == QUIT: quit_game() if event.type == KEYDOWN: if event.key == K_ESCAPE: quit_game() # 打印rect的坐标,而非旧的pos print("X:", player_one.player_rect.x) print("Y:", player_one.player_rect.y) # Update The Screen Every Frame pygame.display.update() fps_clock.tick(FPS)
额外优化点
- 将
movement方法中的elif改为if,允许玩家同时按下多个方向键实现斜向移动 - 调整游戏循环中
movement和draw的顺序,先更新位置再绘制,逻辑更顺畅 - 移除了冗余的
pos变量,直接通过player_rect管理位置
内容的提问来源于stack exchange,提问作者TAJ
相关产品推荐
相关产品推荐

