This commit is contained in:
Rowland 2026-01-27 15:58:41 +08:00
parent a167767890
commit f07a394d9f

552
main.py
View File

@ -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()