Pygame开发中如何删除安全区外Dot类实例及复制类实例
解答
删除安全区外的Dot实例
你目前把所有Dot实例存储在alldots列表中,只要将安全区外的实例从该列表中移除,Python的引用计数机制会自动回收没有被引用的实例,即可完成实际删除,无需仅做不渲染的处理。
注意不要直接在遍历alldots的过程中删除元素,会导致索引错乱遗漏元素,可按如下方案修改:
- 调整
population函数逻辑,更新所有点的位置后仅保留安全区内的点,返回符合要求的新列表 - 主循环中用
population的返回值替换原alldots列表
修改后的population函数示例:
def population(dots): retained_dots = [] for dot in dots: dot.spawnX += random.choice(dot.vel) dot.spawnY += random.choice(dot.vel) # 边界碰撞处理逻辑保持不变 if dot.spawnX >= 800: dot.spawnX -= 5 if dot.spawnY >= 600: dot.spawnY -= 5 if dot.spawnX <= 0: dot.spawnX += 5 if dot.spawnY <= 0: dot.spawnY += 5 # 安全区为y坐标小于100的区域,符合条件的点才会被保留 if dot.spawnY < 100: retained_dots.append(dot) drawdot(dot) return retained_dots
主循环中的调用逻辑修改为:
alldots = population(alldots)
创建类实例的副本
有两种常用实现方案,你的Dot类属性都是基础数值和简单列表,两种方案都适用:
- 方案1:给Dot类新增自定义拷贝方法,可精准控制拷贝的属性
class Dot: # 原有__init__逻辑保持不变 def copy(self): new_dot = Dot() # 直接复用原实例的属性,避免初始化时随机生成新参数 new_dot.spawnX = self.spawnX new_dot.spawnY = self.spawnY new_dot.r = self.r new_dot.g = self.g new_dot.b = self.b new_dot.vel = self.vel.copy() # 可变列表单独拷贝,避免新旧实例共用同一列表 new_dot.spd = self.spd new_dot.fertility = self.fertility return new_dot
调用方式:new_dot = 原有dot实例.copy()
- 方案2:使用Python标准库
copy模块
首先导入模块:import copy
浅拷贝(适合当前场景,属性无嵌套可变对象)调用方式:new_dot = copy.copy(原有dot实例)
如果后续新增了嵌套可变对象的属性,需要完全独立的副本可使用深拷贝:new_dot = copy.deepcopy(原有dot实例)
内容的提问来源于stack exchange,提问作者WaffleKyle
相关产品推荐
相关产品推荐

