Pygame调用colliderect报错:'tuple'对象无该Rect属性
搞定Pygame碰撞检测的AttributeError问题
嘿,我立马就发现你代码里的问题啦!
错误原因拆解
你碰到的AttributeError: 'tuple' object has no attribute 'colliderect',核心问题出在tardigrade类的draw方法里:
self.hitbox = (self.x, self.y, self.width, self.height)
虽然你在初始化__init__里正确把hitbox创建成了pygame.Rect对象,但每次调用draw时,你都把hitbox覆盖成了一个普通的元组。而元组根本没有colliderect这个Rect对象专属的方法,自然就报错了。
至于你说打印语句能执行,是因为第一次碰撞检测时hitbox还没被改成元组,后续循环里draw方法执行后,hitbox变成元组,才触发了错误。
修复代码
把draw方法里的赋值语句改成更新Rect对象的属性,而不是替换成元组,有两种简洁的写法:
写法1:逐个更新Rect属性
def draw(self, win): win.blit(self.name, (self.x, self.y)) # 直接更新Rect的位置和尺寸,保持它的Rect对象类型 self.hitbox.x = self.x self.hitbox.y = self.y self.hitbox.width = self.width self.hitbox.height = self.height pygame.draw.rect(win, (0, 0, 255), self.hitbox,2)
写法2:用Rect的update方法(更简洁)
def draw(self, win): win.blit(self.name, (self.x, self.y)) # 用update一次性更新Rect的所有参数 self.hitbox.update(self.x, self.y, self.width, self.height) pygame.draw.rect(win, (0, 0, 255), self.hitbox,2)
这样修改后,hitbox会一直保持pygame.Rect对象的身份,colliderect方法就能正常工作,不会再触发那个属性错误啦。
内容的提问来源于stack exchange,提问作者LAn
相关产品推荐
相关产品推荐

