diff --git a/main.py b/main.py index c549e886..d0e529b9 100644 --- a/main.py +++ b/main.py @@ -8107,7 +8107,7 @@ class MyWorld(CoreWorld): else: self.add_info_message("VR未启用或管理器未初始化") -def _get_chinese_font(self): + def _get_chinese_font(self): """获取中文字体""" try: from panda3d.core import TextNode @@ -8144,284 +8144,284 @@ def _get_chinese_font(self): from panda3d.core import TextNode return TextNode.getDefaultFont() - def createGUILabel(self, pos=(0, 0, 0), text="标签", size=0.08): - """创建2D GUI标签""" - try: - if hasattr(self, 'gui_manager') and self.gui_manager: - # 使用简化的创建方法,不依赖QT树形控件 - return self._create_simple_gui_label(pos, text, size) - return None - except Exception as e: - print(f"创建GUI标签失败: {e}") - return None - - def _create_simple_gui_label(self, pos=(0, 0, 0), text="标签", size=0.08): - """创建简单的GUI标签,不依赖QT树形控件""" - try: - from direct.gui.DirectGui import DirectLabel - - # 转换坐标系统 - gui_pos = (pos[0] * 0.1, 0, pos[2] * 0.1) - - # 设置中文字体 - font = self._get_chinese_font() - - # 处理scale参数 - if isinstance(size, (list, tuple)) and len(size) >= 2: - scale_value = size[0] # 使用宽度作为缩放值 - else: - scale_value = size - - # 创建标签 - label = DirectLabel( - text=text, + def createGUILabel(self, pos=(0, 0, 0), text="标签", size=0.08): + """创建2D GUI标签""" + try: + if hasattr(self, 'gui_manager') and self.gui_manager: + # 使用简化的创建方法,不依赖QT树形控件 + return self._create_simple_gui_label(pos, text, size) + return None + except Exception as e: + print(f"创建GUI标签失败: {e}") + return None + + def _create_simple_gui_label(self, pos=(0, 0, 0), text="标签", size=0.08): + """创建简单的GUI标签,不依赖QT树形控件""" + try: + from direct.gui.DirectGui import DirectLabel + + # 转换坐标系统 + gui_pos = (pos[0] * 0.1, 0, pos[2] * 0.1) + + # 设置中文字体 + font = self._get_chinese_font() + + # 处理scale参数 + if isinstance(size, (list, tuple)) and len(size) >= 2: + scale_value = size[0] # 使用宽度作为缩放值 + else: + scale_value = size + + # 创建标签 + label = DirectLabel( + text=text, + pos=gui_pos, + scale=scale_value, + text_font=font, + text_fg=(1, 1, 1, 1) # 白色文字 + ) + + # 创建包装对象 + label_wrapper = type('GUIElement', (), {})() + label_wrapper.node = label + label_wrapper.name = text + label_wrapper.gui_type = "GUI_LABEL" + label_wrapper.position = pos + label_wrapper.size = size + + # 添加到GUI管理器 + self.gui_manager.gui_elements.append(label_wrapper) + + print(f"✓ GUI标签创建成功: {text}") + return label_wrapper + except Exception as e: + print(f"✗ 创建简单GUI标签失败: {e}") + return None + + def createGUIEntry(self, pos=(0, 0, 0), placeholder="输入文本...", size=0.08): + """创建2D GUI文本输入框""" + try: + if hasattr(self, 'gui_manager') and self.gui_manager: + # 使用简化的创建方法,不依赖QT树形控件 + return self._create_simple_gui_entry(pos, placeholder, size) + return None + except Exception as e: + print(f"创建GUI输入框失败: {e}") + return None + + def _create_simple_gui_entry(self, pos=(0, 0, 0), placeholder="输入文本...", size=0.08): + """创建简单的GUI输入框,不依赖QT树形控件""" + try: + from direct.gui.DirectGui import DirectEntry + + # 转换坐标系统 + gui_pos = (pos[0] * 0.1, 0, pos[2] * 0.1) + + # 设置中文字体 + font = self._get_chinese_font() + + # 处理scale参数 + if isinstance(size, (list, tuple)) and len(size) >= 2: + scale_value = size[0] # 使用宽度作为缩放值 + else: + scale_value = size + + # 创建输入框 + entry = DirectEntry( + text=placeholder, + pos=gui_pos, + scale=scale_value, + text_font=font, + width=20, # 字符宽度 + numLines=1, # 行数 + focus=1 # 自动获取焦点 + ) + + # 创建包装对象 + entry_wrapper = type('GUIElement', (), {})() + entry_wrapper.node = entry + entry_wrapper.name = placeholder + entry_wrapper.gui_type = "GUI_ENTRY" + entry_wrapper.position = pos + entry_wrapper.size = size + + # 添加到GUI管理器 + self.gui_manager.gui_elements.append(entry_wrapper) + + print(f"✓ GUI输入框创建成功: {placeholder}") + return entry_wrapper + except Exception as e: + print(f"✗ 创建简单GUI输入框失败: {e}") + return None + + def createGUIImage(self, pos=(0, 0, 0), image_path=None, size=2): + """创建2D GUI图片""" + try: + if hasattr(self, 'gui_manager') and self.gui_manager: + # 使用简化的创建方法,不依赖QT树形控件 + return self._create_simple_gui_image(pos, image_path, size) + return None + except Exception as e: + print(f"创建GUI图片失败: {e}") + return None + + def _create_simple_gui_image(self, pos=(0, 0, 0), image_path=None, size=2): + """创建简单的GUI图片,不依赖QT树形控件""" + try: + from direct.gui.DirectGui import DirectFrame + from panda3d.core import Filename + + # 转换坐标系统 + gui_pos = (pos[0] * 0.1, 0, pos[2] * 0.1) + + # 处理scale参数 + if isinstance(size, (list, tuple)) and len(size) >= 2: + scale_value = size[0] # 使用宽度作为缩放值 + else: + scale_value = size + + # 创建图片框架 + if image_path and os.path.exists(image_path): + # 加载纹理 + tex = self.loader.loadTexture(Filename.fromOsSpecific(image_path)) + image = DirectFrame( + image=tex, pos=gui_pos, - scale=scale_value, - text_font=font, - text_fg=(1, 1, 1, 1) # 白色文字 + scale=scale_value ) - - # 创建包装对象 - label_wrapper = type('GUIElement', (), {})() - label_wrapper.node = label - label_wrapper.name = text - label_wrapper.gui_type = "GUI_LABEL" - label_wrapper.position = pos - label_wrapper.size = size - - # 添加到GUI管理器 - self.gui_manager.gui_elements.append(label_wrapper) - - print(f"✓ GUI标签创建成功: {text}") - return label_wrapper - except Exception as e: - print(f"✗ 创建简单GUI标签失败: {e}") - return None - - def createGUIEntry(self, pos=(0, 0, 0), placeholder="输入文本...", size=0.08): - """创建2D GUI文本输入框""" - try: - if hasattr(self, 'gui_manager') and self.gui_manager: - # 使用简化的创建方法,不依赖QT树形控件 - return self._create_simple_gui_entry(pos, placeholder, size) - return None - except Exception as e: - print(f"创建GUI输入框失败: {e}") - return None - - def _create_simple_gui_entry(self, pos=(0, 0, 0), placeholder="输入文本...", size=0.08): - """创建简单的GUI输入框,不依赖QT树形控件""" - try: - from direct.gui.DirectGui import DirectEntry - - # 转换坐标系统 - gui_pos = (pos[0] * 0.1, 0, pos[2] * 0.1) - - # 设置中文字体 - font = self._get_chinese_font() - - # 处理scale参数 - if isinstance(size, (list, tuple)) and len(size) >= 2: - scale_value = size[0] # 使用宽度作为缩放值 - else: - scale_value = size - - # 创建输入框 - entry = DirectEntry( - text=placeholder, - pos=gui_pos, - scale=scale_value, - text_font=font, - width=20, # 字符宽度 - numLines=1, # 行数 - focus=1 # 自动获取焦点 + image_name = os.path.basename(image_path) + else: + # 创建一个彩色框架作为占位符 + image = DirectFrame( + frameColor=(0.5, 0.5, 0.5, 1.0), # 灰色 + frameSize=(-scale_value, scale_value, -scale_value, scale_value), + pos=gui_pos ) - - # 创建包装对象 - entry_wrapper = type('GUIElement', (), {})() - entry_wrapper.node = entry - entry_wrapper.name = placeholder - entry_wrapper.gui_type = "GUI_ENTRY" - entry_wrapper.position = pos - entry_wrapper.size = size - - # 添加到GUI管理器 - self.gui_manager.gui_elements.append(entry_wrapper) - - print(f"✓ GUI输入框创建成功: {placeholder}") - return entry_wrapper - except Exception as e: - print(f"✗ 创建简单GUI输入框失败: {e}") - return None - - def createGUIImage(self, pos=(0, 0, 0), image_path=None, size=2): - """创建2D GUI图片""" - try: - if hasattr(self, 'gui_manager') and self.gui_manager: - # 使用简化的创建方法,不依赖QT树形控件 - return self._create_simple_gui_image(pos, image_path, size) - return None - except Exception as e: - print(f"创建GUI图片失败: {e}") - return None - - def _create_simple_gui_image(self, pos=(0, 0, 0), image_path=None, size=2): - """创建简单的GUI图片,不依赖QT树形控件""" - try: - from direct.gui.DirectGui import DirectFrame - from panda3d.core import Filename - - # 转换坐标系统 - gui_pos = (pos[0] * 0.1, 0, pos[2] * 0.1) - - # 处理scale参数 - if isinstance(size, (list, tuple)) and len(size) >= 2: - scale_value = size[0] # 使用宽度作为缩放值 - else: - scale_value = size - - # 创建图片框架 - if image_path and os.path.exists(image_path): - # 加载纹理 - tex = self.loader.loadTexture(Filename.fromOsSpecific(image_path)) - image = DirectFrame( - image=tex, - pos=gui_pos, - scale=scale_value - ) - image_name = os.path.basename(image_path) - else: - # 创建一个彩色框架作为占位符 - image = DirectFrame( - frameColor=(0.5, 0.5, 0.5, 1.0), # 灰色 - frameSize=(-scale_value, scale_value, -scale_value, scale_value), - pos=gui_pos - ) - image_name = "占位符图片" - - # 创建包装对象 - image_wrapper = type('GUIElement', (), {})() - image_wrapper.node = image - image_wrapper.name = image_name - image_wrapper.gui_type = "GUI_IMAGE" - image_wrapper.position = pos - image_wrapper.size = size - image_wrapper.image_path = image_path - - # 添加到GUI管理器 - self.gui_manager.gui_elements.append(image_wrapper) - - print(f"✓ GUI图片创建成功: {image_name}") - return image_wrapper - except Exception as e: - print(f"✗ 创建简单GUI图片失败: {e}") - return None - - def createVideoScreen(self, pos=(0, 0, 0), size=1, video_path=None): - """创建视频屏幕""" - try: - if hasattr(self, 'gui_manager') and self.gui_manager: - return self.gui_manager.createVideoScreen(pos, size, video_path) - return None - except Exception as e: - print(f"创建视频屏幕失败: {e}") - return None - - def create2DVideoScreen(self, pos=(0, 0, 0), size=0.2, video_path=None): - """创建2D视频屏幕""" - try: - if hasattr(self, 'gui_manager') and self.gui_manager: - return self.gui_manager.createGUI2DVideoScreen(pos, size, video_path) - return None - except Exception as e: - print(f"创建2D视频屏幕失败: {e}") - return None - - def createSphericalVideo(self, pos=(0, 0, 0), radius=5.0, video_path=None): - """创建360度视频""" - try: - if hasattr(self, 'gui_manager') and self.gui_manager: - return self.gui_manager.createSphericalVideo(pos, radius, video_path) - return None - except Exception as e: - print(f"创建球形视频失败: {e}") - return None - - def createVirtualScreen(self, pos=(0, 0, 0), size=(2, 1), text="虚拟屏幕"): - """创建虚拟屏幕""" - try: - if hasattr(self, 'gui_manager') and self.gui_manager: - return self.gui_manager.createGUIVirtualScreen(pos, size, text) - return None - except Exception as e: - print(f"创建虚拟屏幕失败: {e}") - return None - - # ==================== 光源创建方法 ==================== - - def createSpotLight(self, pos=(0, 0, 5)): - """创建聚光灯""" - try: - if hasattr(self, 'scene_manager') and self.scene_manager: - return self.scene_manager.createSpotLight(pos) - return None - except Exception as e: - print(f"创建聚光灯失败: {e}") - return None - - def createPointLight(self, pos=(0, 0, 5)): - """创建点光源""" - try: - if hasattr(self, 'scene_manager') and self.scene_manager: - return self.scene_manager.createPointLight(pos) - return None - except Exception as e: - print(f"创建点光源失败: {e}") - return None - - # ==================== 地形创建方法 ==================== - - def createFlatTerrain(self, size=(10, 10), resolution=129): - """创建平面地形""" - try: - if hasattr(self, 'terrain_manager') and self.terrain_manager: - return self.terrain_manager.createFlatTerrain(size, resolution) - return None - except Exception as e: - print(f"创建平面地形失败: {e}") - return None - - def createTerrainFromHeightMap(self, heightmap_path, scale=(1.0, 1.0, 10.0)): - """从高度图创建地形""" - try: - if hasattr(self, 'terrain_manager') and self.terrain_manager: - return self.terrain_manager.createTerrainFromHeightMap(heightmap_path, scale) - return None - except Exception as e: - print(f"创建高度图地形失败: {e}") - return None - - # ==================== 脚本创建方法 ==================== - - def createScript(self, script_name, template="basic"): - """创建脚本""" - try: - if hasattr(self, 'script_manager') and self.script_manager: - return self.script_manager.createScript(script_name, template) - return None - except Exception as e: - print(f"创建脚本失败: {e}") - return None - - def loadScript(self, script_path): - """加载脚本""" - try: - if hasattr(self, 'script_manager') and self.script_manager: - return self.script_manager.loadScript(script_path) - return None - except Exception as e: - print(f"加载脚本失败: {e}") - return None + image_name = "占位符图片" + + # 创建包装对象 + image_wrapper = type('GUIElement', (), {})() + image_wrapper.node = image + image_wrapper.name = image_name + image_wrapper.gui_type = "GUI_IMAGE" + image_wrapper.position = pos + image_wrapper.size = size + image_wrapper.image_path = image_path + + # 添加到GUI管理器 + self.gui_manager.gui_elements.append(image_wrapper) + + print(f"✓ GUI图片创建成功: {image_name}") + return image_wrapper + except Exception as e: + print(f"✗ 创建简单GUI图片失败: {e}") + return None + + def createVideoScreen(self, pos=(0, 0, 0), size=1, video_path=None): + """创建视频屏幕""" + try: + if hasattr(self, 'gui_manager') and self.gui_manager: + return self.gui_manager.createVideoScreen(pos, size, video_path) + return None + except Exception as e: + print(f"创建视频屏幕失败: {e}") + return None + + def create2DVideoScreen(self, pos=(0, 0, 0), size=0.2, video_path=None): + """创建2D视频屏幕""" + try: + if hasattr(self, 'gui_manager') and self.gui_manager: + return self.gui_manager.createGUI2DVideoScreen(pos, size, video_path) + return None + except Exception as e: + print(f"创建2D视频屏幕失败: {e}") + return None + + def createSphericalVideo(self, pos=(0, 0, 0), radius=5.0, video_path=None): + """创建360度视频""" + try: + if hasattr(self, 'gui_manager') and self.gui_manager: + return self.gui_manager.createSphericalVideo(pos, radius, video_path) + return None + except Exception as e: + print(f"创建球形视频失败: {e}") + return None + + def createVirtualScreen(self, pos=(0, 0, 0), size=(2, 1), text="虚拟屏幕"): + """创建虚拟屏幕""" + try: + if hasattr(self, 'gui_manager') and self.gui_manager: + return self.gui_manager.createGUIVirtualScreen(pos, size, text) + return None + except Exception as e: + print(f"创建虚拟屏幕失败: {e}") + return None + + # ==================== 光源创建方法 ==================== + + def createSpotLight(self, pos=(0, 0, 5)): + """创建聚光灯""" + try: + if hasattr(self, 'scene_manager') and self.scene_manager: + return self.scene_manager.createSpotLight(pos) + return None + except Exception as e: + print(f"创建聚光灯失败: {e}") + return None + + def createPointLight(self, pos=(0, 0, 5)): + """创建点光源""" + try: + if hasattr(self, 'scene_manager') and self.scene_manager: + return self.scene_manager.createPointLight(pos) + return None + except Exception as e: + print(f"创建点光源失败: {e}") + return None + + # ==================== 地形创建方法 ==================== + + def createFlatTerrain(self, size=(10, 10), resolution=129): + """创建平面地形""" + try: + if hasattr(self, 'terrain_manager') and self.terrain_manager: + return self.terrain_manager.createFlatTerrain(size, resolution) + return None + except Exception as e: + print(f"创建平面地形失败: {e}") + return None + + def createTerrainFromHeightMap(self, heightmap_path, scale=(1.0, 1.0, 10.0)): + """从高度图创建地形""" + try: + if hasattr(self, 'terrain_manager') and self.terrain_manager: + return self.terrain_manager.createTerrainFromHeightMap(heightmap_path, scale) + return None + except Exception as e: + print(f"创建高度图地形失败: {e}") + return None + + # ==================== 脚本创建方法 ==================== + + def createScript(self, script_name, template="basic"): + """创建脚本""" + try: + if hasattr(self, 'script_manager') and self.script_manager: + return self.script_manager.createScript(script_name, template) + return None + except Exception as e: + print(f"创建脚本失败: {e}") + return None + + def loadScript(self, script_path): + """加载脚本""" + try: + if hasattr(self, 'script_manager') and self.script_manager: + return self.script_manager.loadScript(script_path) + return None + except Exception as e: + print(f"加载脚本失败: {e}") + return None demo = MyWorld() demo.run()