ui替换
This commit is contained in:
parent
a167767890
commit
f07a394d9f
552
main.py
552
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()
|
||||
|
||||
Loading…
Reference in New Issue
Block a user