如何调用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 = FalsePlayer类的重力逻辑重复书写了两次,一帧内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
相关产品推荐
相关产品推荐

