6.5 KiB
6.5 KiB
🎯 GUI功能实现完整指南
📋 功能概述
我已经为你的test.py程序添加了完整的GUI管理功能,包括:
✨ 核心功能
- GUI元素创建 - 支持多种2D和3D GUI组件
- GUI元素编辑 - 实时属性修改和可视化编辑
- GUI元素删除 - 安全的元素移除机制
- 场景树显示 - GUI元素在层级窗口中的组织
- 属性面板 - 专门的GUI属性编辑界面
🎮 支持的GUI类型
📱 2D GUI组件
-
DirectButton (按钮)
- 可点击的交互按钮
- 支持自定义文本和颜色
- 带有点击事件响应
-
DirectLabel (标签)
- 静态文本显示
- 透明背景
- 可自定义字体和颜色
-
DirectEntry (输入框)
- 文本输入组件
- 支持占位符文本
- 带有提交事件
🌐 3D空间GUI组件
-
3D TextNode (3D文本)
- 3D空间中的文本节点
- Billboard效果(始终面向相机)
- 支持中文字体
-
Virtual Screen (虚拟屏幕)
- 3D空间中的平面屏幕
- 可显示文本内容
- 半透明效果
🛠️ 使用方法
创建GUI元素
方法1: 使用菜单
GUI菜单 → 创建按钮/标签/输入框/3D文本/虚拟屏幕
方法2: 使用工具栏
工具栏 → 创建按钮/创建标签/3D文本
方法3: 程序化创建
# 创建按钮
button = world.createGUIButton(pos=(0, 0, 0.5), text="我的按钮")
# 创建标签
label = world.createGUILabel(pos=(0, 0, 0.3), text="标签文本")
# 创建3D文本
text3d = world.createGUI3DText(pos=(0, 5, 2), text="3D文本")
编辑GUI元素
属性面板编辑
- 在层级窗口选中GUI元素
- 在属性面板中修改:
- 文本内容
- 位置坐标
- 缩放大小
- 颜色属性
右键菜单编辑
- 右键点击场景树中的GUI元素
- 选择"编辑"打开编辑对话框
- 批量修改属性
程序化编辑
# 修改文本
world.editGUIElement(gui_element, "text", "新文本")
# 修改位置
world.editGUIElement(gui_element, "position", [1, 2, 3])
# 修改缩放
world.editGUIElement(gui_element, "scale", 1.5)
删除GUI元素
方法1: 右键删除
场景树中右键GUI元素 → 删除GUI元素
方法2: 程序化删除
world.deleteGUIElement(gui_element)
🎛️ 界面布局
场景树组织
场景
├── 相机
├── 模型
│ └── [所有3D模型]
├── GUI元素
│ ├── button: 按钮文本
│ ├── label: 标签文本
│ ├── 3d_text: 3D文本
│ └── virtual_screen: 屏幕文本
└── 地板
属性面板
- 通用属性: 名称、GUI类型
- 文本属性: 可编辑的文本内容
- 位置属性: X/Y/Z坐标控制
- 缩放属性: 统一缩放控制
- 颜色属性: 2D GUI背景色选择
- 旋转属性: 3D GUI的H/P/R旋转
🔧 高级功能
GUI元素复制
右键GUI元素 → 复制
自动在原位置偏移处创建副本。
批量编辑
通过编辑对话框可以一次性修改多个属性。
事件响应
def onGUIButtonClick(self, button_id):
"""自定义按钮点击处理"""
print(f"按钮 {button_id} 被点击")
# 添加你的自定义逻辑
def onGUIEntrySubmit(self, text, entry_id):
"""自定义输入框提交处理"""
print(f"输入内容: {text}")
# 添加你的自定义逻辑
💡 使用技巧
1. 中文字体支持
程序会自动检测并加载系统中文字体:
- 微米黑体 (wqy-microhei)
- 文泉驿正黑 (wqy-zenhei)
- 文鼎字体系列
2. 3D GUI最佳实践
- 3D文本适合显示场景标注
- 虚拟屏幕适合信息面板
- 合理使用Billboard效果
3. 性能优化
- 避免创建过多GUI元素
- 适时删除不需要的元素
- 使用合适的缩放比例
4. 交互设计
- 按钮提供即时反馈
- 输入框有明确的提示
- 颜色搭配要易于识别
🚀 扩展开发
添加新GUI类型
在MyWorld类中添加新的创建方法:
def createGUISlider(self, pos=(0, 0, 0), range=(0, 100)):
"""创建滑块组件"""
from direct.gui.DirectGui import DirectSlider
slider = DirectSlider(
range=range,
pos=pos,
scale=0.5,
# ... 其他属性
)
slider.setTag("gui_type", "slider")
slider.setTag("gui_id", f"slider_{len(self.gui_elements)}")
self.gui_elements.append(slider)
self.updateSceneTree()
return slider
自定义事件处理
修改事件处理方法来实现特定功能:
def onGUIButtonClick(self, button_id):
"""自定义按钮行为"""
if button_id == "button_0":
# 第一个按钮的特殊行为
self.performSpecialAction()
elif button_id.startswith("menu_"):
# 菜单按钮的处理
self.handleMenuAction(button_id)
🎨 界面定制
主题配置
# 在创建GUI时设置主题色
button = DirectButton(
frameColor=(0.2, 0.6, 0.8, 1), # 蓝色主题
text_fg=(1, 1, 1, 1), # 白色文字
)
布局管理
建议将相关GUI元素进行分组管理:
# 创建UI组
ui_group = {
'main_menu': [],
'game_hud': [],
'settings': []
}
# 按组管理GUI元素
ui_group['main_menu'].append(start_button)
ui_group['main_menu'].append(exit_button)
📚 API参考
核心方法
createGUIButton(pos, text, size)- 创建按钮createGUILabel(pos, text, size)- 创建标签createGUIEntry(pos, placeholder, size)- 创建输入框createGUI3DText(pos, text, size)- 创建3D文本createGUIVirtualScreen(pos, size, text)- 创建虚拟屏幕editGUIElement(element, property, value)- 编辑元素deleteGUIElement(element)- 删除元素duplicateGUIElement(element)- 复制元素
属性类型
"text"- 文本内容"position"- 位置坐标 [x, y, z]"scale"- 缩放大小"color"- 颜色值 [r, g, b, a]
现在你的test.py程序具备了完整的GUI创建、编辑、删除功能!🎉
试试通过菜单或工具栏创建一些GUI元素,然后在属性面板中编辑它们的属性。GUI元素会自动出现在场景树的"GUI元素"分组中,方便管理。