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

如何调用Python类内变量?Pygame开发几何冲刺类游戏求助

核心问题解答

你遇到的img_rect.x无法在类外/其他方法调用的问题,确实是变量作用域导致的:img_rect是World类__init__方法中嵌套for循环的局部变量,作用域仅在单次循环内部,循环结束后局部变量就会销毁,自然无法直接访问。
不过你已经把所有地块的img_rect存储到了类属性self.tile_list中(每个元素为(图片对象, rect对象)的元组),只要遍历这个列表就能修改/访问所有地块的坐标,比如要实现世界向左滚动的需求,给World类添加update方法即可:

class World():
    # 省略原有__init__、draw方法
    def update(self, scroll_speed):
        # 遍历所有地块,x坐标减去滚动速度实现左移
        for tile in self.tile_list:
            tile[1].x -= scroll_speed
        # 可选优化:移出屏幕左侧的地块直接删除,节省性能
        self.tile_list = [tile for tile in self.tile_list if tile[1].right > 0]

在主循环的world.draw()前调用world.update(2)即可实现世界滚动,数字2为滚动速度可自行调整。

其他代码优化建议

  • Player类的__init__方法中没有初始化self.jumped属性,直接在update中访问会触发属性不存在的报错,需要在__init__中添加一行self.jumped = False
  • Player类的重力逻辑重复书写了两次,一帧内vel_y累计加了13,数值不合理会导致手感怪异,删掉其中一段重力逻辑即可,正常重力每帧加1~2就足够
  • World类的draw方法定义的data形参完全没有被使用,可以直接删掉,调用时也不需要传入world_data
  • 你的需求是玩家x坐标固定,所以可以直接删掉Player类中所有dx相关的逻辑,不用修改玩家的x坐标即可保持固定位置
  • 当前fps设置为20会导致游戏卡顿明显,建议调整为60,同步把跳跃力度、重力数值调小即可获得流畅的手感,比如跳跃初始vel_y设为-8,重力每帧加0.8
  • 尖刺当前和普通方块的碰撞逻辑完全一致,没有死亡判定,后续可以给self.tile_list的元素加上类型标记,比如存为(地块类型id, 图片, rect),碰到类型为2的尖刺时触发死亡逻辑即可
  • 加载图片时建议加上convert_alpha()优化渲染性能,比如pygame.image.load('middle_block.png').convert_alpha()

内容的提问来源于stack exchange,提问作者Colt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 11:36:02