Pygame矩形X轴移动报错:'tuple'对象无'x'属性求助
问题分析与解决
错误原因
错误出在你的update方法里:你先通过self.rect.x += self.dx修改了Pygame Rect对象的位置,随后又把self.rect赋值成了一个元组(self.x, self.y, self.width, self.height)。元组是没有.x、.y这类属性的,所以下一次调用update时,执行self.rect.x += self.dx就会触发AttributeError。
另外你的代码同时维护了self.x/self.y和self.rect两套位置数据,这完全冗余,还容易造成数据不一致。Pygame的Rect对象本身就可以直接管理位置和尺寸,没必要单独存储x、y变量。
修复后的代码
import pygame class Player(): def __init__(self, x, y, width, height, color): self.color = color # 仅保留Rect对象,用它统一管理位置与尺寸 self.rect = pygame.Rect(x, y, width, height) self.vel = 3 self.dx = 0 self.dy = 0 self.jump = False def draw(self, win): pygame.draw.rect(win, self.color, self.rect) def move(self, screen_width, screen_height): SPEED = 10 keys = pygame.key.get_pressed() # 先重置dx,避免松开方向键后玩家持续移动 self.dx = 0 if keys[pygame.K_LEFT]: self.dx = -SPEED if keys[pygame.K_RIGHT]: self.dx = SPEED self.update() def update(self): # 直接操作Rect对象的x/y属性更新位置 self.rect.x += self.dx self.rect.y += self.dy # 可选:添加屏幕边界限制,防止玩家移出屏幕 self.rect.clamp_ip(pygame.Rect(0, 0, screen_width, screen_height)) self.dx = 0 self.dy = 0
关键修改说明
- 移除了
__init__中冗余的self.x/self.y/self.width/self.height变量,所有位置与尺寸操作均通过self.rect完成。 - 删除了
update方法中把self.rect转为元组的错误代码,确保self.rect始终是Pygame的Rect对象。 - 在
move方法中先重置self.dx,修复了原代码中松开方向键后玩家仍持续移动的问题。 - 可选添加
clamp_ip方法,限制玩家在屏幕范围内移动(根据需求可删除)。
内容的提问来源于stack exchange,提问作者coldflows
相关产品推荐
相关产品推荐

