Panda3D中创建的Block类无标识,如何实现游戏内方块的销毁功能?
解决方案
改造Block类
将模型变量从局部变量改为实例属性,新增内置销毁方法,同时保留坐标信息作为定位标识:
class Block: # 可选:类自增ID,坐标不唯一的场景可作为替代唯一标识 _auto_increment_id = 1 def __init__(self, window, cords: tuple): self.id = Block._auto_increment_id Block._auto_increment_id += 1 self.cords = cords self.window = window # 模型存为实例属性,后续可操作 self.box = window.loader.loadModel('models/box') self.box.set_pos(cords[0], cords[1], cords[2]) self.box.reparent_to(window.render) def destroy(self): # 从Panda3D渲染树中移除模型节点 self.box.remove_node()
新增全局存储、改造方块创建逻辑
用字典存储所有创建的方块实例,以坐标为key直接映射实例,避免无法定位目标对象的问题:
# 全局方块存储容器,key为坐标元组,value为Block实例 block_map = {} def place(window, cords: tuple): # 避免同一坐标重复创建方块 if cords not in block_map: new_block = Block(window, cords) block_map[cords] = new_block return new_block return None
实现销毁函数
封装销毁逻辑,同时清除实例引用避免内存泄漏:
def destroy_block(cords: tuple): if cords in block_map: block_map[cords].destroy() # 从存储中删除实例引用 del block_map[cords] return True return False
业务使用说明
- 批量创建场景:原有嵌套for循环创建逻辑无需修改,直接调用
place()函数即可,所有生成的方块会自动存入block_map - 销毁指定方块:直接传入目标方块的坐标即可触发销毁,比如销毁坐标为
(3, 5, 0)的方块:destroy_block((3, 5, 0)) - 特殊场景适配:如果业务中存在坐标重复的情况,可将
block_map的key改为Block的id属性,创建时返回ID,销毁时传入对应ID即可
内容的提问来源于stack exchange,提问作者error 1044
相关产品推荐
相关产品推荐

