This commit is contained in:
Rowland 2026-01-23 17:38:13 +08:00
parent 99d4979af8
commit 385103e252
2 changed files with 69 additions and 11 deletions

View File

@ -630,7 +630,7 @@ class CoreWorld(Meta3DWorld):
if hasattr(self, 'win') and self.win:
width = self.win.getXSize()
height = self.win.getYSize()
print(f"从Panda3D窗口获取尺寸!!!!!!!!!!!!!!!!!!!!!: {width} x {height}")
# print(f"从Panda3D窗口获取尺寸!!!!!!!!!!!!!!!!!!!!!: {width} x {height}")
return width, height
# 最后的默认值

78
demo.py
View File

@ -830,14 +830,14 @@ class MyWorld(CoreWorld):
imgui.menu_item("材质编辑器", "", False, True)
imgui.menu_item("脚本编辑器", "", False, True)
# 窗口菜单
with imgui_ctx.begin_menu("窗口") as window_menu:
if window_menu:
_, self.showDemoWindow = imgui.menu_item("ImGui演示", "", self.showDemoWindow, True)
if self.testTexture:
imgui.menu_item("关闭纹理测试", "", False, True)
else:
imgui.menu_item("显示纹理测试", "", False, True)
# 窗口菜单 - 已隐藏
# with imgui_ctx.begin_menu("窗口") as window_menu:
# if window_menu:
# _, self.showDemoWindow = imgui.menu_item("ImGui演示", "", self.showDemoWindow, True)
# if self.testTexture:
# imgui.menu_item("关闭纹理测试", "", False, True)
# else:
# imgui.menu_item("显示纹理测试", "", False, True)
# 帮助菜单
with imgui_ctx.begin_menu("帮助") as help_menu:
@ -5076,7 +5076,7 @@ class MyWorld(CoreWorld):
self.clipboard_mode = "cut"
# 删除原节点
self.scene_manager.deleteNode(selected_node)
self._delete_node(selected_node)
self.selection.clearSelection()
self.add_success_message(f"已剪切节点: {node_name}")
@ -5145,7 +5145,7 @@ class MyWorld(CoreWorld):
# 删除节点
if hasattr(self, 'scene_manager') and self.scene_manager:
self.scene_manager.deleteNode(selected_node)
self._delete_node(selected_node)
self.selection.clearSelection()
self.add_success_message(f"已删除节点: {node_name}")
else:
@ -5153,6 +5153,64 @@ class MyWorld(CoreWorld):
except Exception as e:
self.add_error_message(f"删除操作失败: {e}")
def _delete_node(self, node):
"""删除节点的通用方法"""
try:
if not node or node.isEmpty():
return False
node_name = node.getName() or "未命名节点"
# 从场景管理器的模型列表中移除(如果是模型)
if hasattr(self, 'scene_manager') and self.scene_manager:
if node in self.scene_manager.models:
self.scene_manager.models.remove(node)
print(f"[场景管理器] 从模型列表移除: {node_name}")
# 停止所有与该节点相关的脚本
if hasattr(self, 'script_manager') and self.script_manager:
try:
# 移除该节点上的所有脚本
if node in self.script_manager.object_scripts:
del self.script_manager.object_scripts[node]
print(f"[脚本系统] 移除节点 {node_name} 的所有脚本")
except Exception as e:
print(f"[脚本系统] 移除脚本失败: {e}")
# 清理碰撞体
if hasattr(self, 'collision_manager') and self.collision_manager:
try:
self.collision_manager.remove_collision_for_node(node)
print(f"[碰撞系统] 移除节点 {node_name} 的碰撞体")
except Exception as e:
print(f"[碰撞系统] 移除碰撞体失败: {e}")
# 清理Actor缓存如果有动画
if hasattr(self, '_actor_cache') and node in self._actor_cache:
actor = self._actor_cache[node]
try:
# 清理相关任务
taskMgr.remove(f"maintain_anim_pos_{id(actor)}")
# 清理Actor
if not actor.isEmpty():
actor.cleanup()
actor.removeNode()
print(f"[动画系统] 清理节点 {node_name} 的Actor缓存")
except Exception as e:
print(f"[动画系统] 清理Actor缓存失败: {e}")
finally:
del self._actor_cache[node]
# 从父节点中移除
node.removeNode()
print(f"[删除] 成功删除节点: {node_name}")
return True
except Exception as e:
print(f"[删除] 删除节点失败: {e}")
return False
# ==================== 对话框绘制函数 ====================
def _draw_new_project_dialog(self):