You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 11:30:54