1
0
forked from Rowland/EG
EG/demo/GUI_IMPLEMENTATION_GUIDE.md
2025-07-02 09:49:59 +08:00

6.3 KiB
Raw Blame History

🎯 GUI功能实现完整指南

📋 功能概述

我已经为你的test.py程序添加了完整的GUI管理功能包括

核心功能

  • GUI元素创建 - 支持多种2D和3D GUI组件
  • GUI元素编辑 - 实时属性修改和可视化编辑
  • GUI元素删除 - 安全的元素移除机制
  • 场景树显示 - GUI元素在层级窗口中的组织
  • 属性面板 - 专门的GUI属性编辑界面

🎮 支持的GUI类型

📱 2D GUI组件

  1. DirectButton (按钮)

    • 可点击的交互按钮
    • 支持自定义文本和颜色
    • 带有点击事件响应
  2. DirectLabel (标签)

    • 静态文本显示
    • 透明背景
    • 可自定义字体和颜色
  3. DirectEntry (输入框)

    • 文本输入组件
    • 支持占位符文本
    • 带有提交事件

🌐 3D空间GUI组件

  1. 3D TextNode (3D文本)

    • 3D空间中的文本节点
    • Billboard效果始终面向相机
    • 支持中文字体
  2. 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元素

属性面板编辑

  1. 在层级窗口选中GUI元素
  2. 在属性面板中修改:
    • 文本内容
    • 位置坐标
    • 缩放大小
    • 颜色属性

右键菜单编辑

  1. 右键点击场景树中的GUI元素
  2. 选择"编辑"打开编辑对话框
  3. 批量修改属性

程序化编辑

# 修改文本
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元素"分组中,方便管理。