pygame开发:继承Item父类的游戏对象移动速度不一致异常
问题根因
物品移动速度随机不一致,核心bug是列表中重复存储了同一个实例的引用,没有创建独立的新物品对象:
- 你在定义
item_types字典时就提前创建了3个物品实例,全局始终只有这3个实际存在的物品对象 - 后续循环10次填充
items列表时,只是随机把这3个已有实例的引用重复加进列表,没有生成新实例 - 主循环每帧遍历列表调用
movement()时,同一个实例如果在列表里出现了N次,一帧内就会被执行N次self.x += self.dx,实际移动速度就是设定值的N倍,远快于只出现1次的实例 - 由于每次随机选取引用的结果完全随机,哪个类的实例被重复添加的次数多没有固定规律,对应到子类的颜色也就随机,和你观察到的现象完全吻合。
修复方法
把item_types字典里存储的提前创建好的实例,替换为类本身的引用;在循环生成物品列表时,每次选中对应类后再传入参数创建全新的独立实例,保证列表里每个元素都是互不干扰的单独对象,每个实例每帧只会执行一次移动逻辑。
需要替换的代码段如下:
# 字典存储类引用,不要提前实例化 item_types = {0: GravUp, 1: GravDown, 2: AgilUp} items = [] for i in range(10): # 选中类后单独创建新实例 selected_item_class = item_types[randint(0, 2)] items.append(selected_item_class(WIDTH + randint(0, 500)))
替换原有对应代码后,所有物品每帧仅移动一次,速度会统一为dx设定的-2,不会再出现随机的速度差。
可选优化
你当前的物品重置判断条件if self.x < 0 - WIDTH会让物品完全飞出屏幕左侧近800像素后才回到右侧,视觉上会有很长时间看不到物品,可以调整为if self.x < -self.radius,让物品刚完全移出左边界就重置到屏幕右侧,显示逻辑更合理。
内容的提问来源于stack exchange,提问作者RJrules64
相关产品推荐
相关产品推荐

