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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 07:27:00