Pygame重力方法报错TypeError: 'float' object is not callable
Pygame 2D平台跳跃游戏重力逻辑类型错误修复
报错信息
File "/Users/josh/Desktop/platformer/player.py", line 39, in update self.gravity() TypeError: 'float' object is not callable
错误原因
核心是实例属性与类方法重名导致的命名冲突:
- 构造方法
__init__中定义了浮点型实例属性self.gravity = 0.8,用于存储重力加速度数值 - 类中同时定义了同名的重力计算方法
def gravity(self) - Python类实例化时,构造方法内赋值的实例属性会覆盖类层面定义的同名方法,执行
self.gravity()时,self.gravity实际指向0.8这个浮点数,浮点数无法作为函数调用,因此触发类型错误。
修复方案
保证实例作用域下属性名和方法名不重复即可,两种可选修改方式:
- 方案1(推荐,语义更清晰):将重力计算方法重命名为
apply_gravity(),同步修改update方法中的调用语句,保留重力数值属性self.gravity = 0.8 - 方案2:修改重力数值属性名,比如将
self.gravity = 0.8改为self.gravity_acc = 0.8,同步修改重力方法内的取值语句,保留gravity()作为方法名
采用方案1修复后的完整可运行代码:
import pygame class Player(pygame.sprite.Sprite): def __init__(self,position): super().__init__() self.image = pygame.Surface((32,60)) self.image.fill('red') self.rect = self.image.get_rect(topleft = position) # 玩家移动参数 self.direction = pygame.math.Vector2(0,0) self.gravity = 0.8 self.jump_speed = -16 self.speed = 5 def get_input(self): keys = pygame.key.get_pressed() if keys[pygame.K_RIGHT]: self.direction.x = 1 elif keys[pygame.K_LEFT]: self.direction.x = -1 else: self.direction.x = 0 if keys[pygame.K_SPACE]: self.jump() def apply_gravity(self): self.direction.y += self.gravity self.rect.y += self.direction.y def jump(self): self.direction.y = self.jump_speed def update(self): self.get_input() self.rect.x += self.direction.x * self.speed self.apply_gravity()
内容的提问来源于stack exchange,提问作者Josh Wenner
相关产品推荐
相关产品推荐

