EG/demo/test_gui_edit_mode.py
2025-07-02 09:49:59 +08:00

361 lines
12 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
GUI编辑模式功能测试
验证主程序中的GUI编辑模式是否正常工作
"""
import warnings
warnings.filterwarnings("ignore", category=DeprecationWarning)
import sys
from direct.showbase.ShowBase import ShowBase
from direct.gui.DirectGui import *
from panda3d.core import *
# 配置Panda3D
loadPrcFileData("", """
win-size 800 600
window-title GUI编辑模式测试
framebuffer-multisample 1
multisamples 2
""")
class GUIEditModeTest(ShowBase):
def __init__(self):
ShowBase.__init__(self)
print("=== GUI编辑模式功能测试 ===")
# 设置背景色
self.setBackgroundColor(0.2, 0.2, 0.3)
# 初始化GUI相关变量
self.gui_elements = []
self.guiEditMode = False
self.guiEditPanel = None
self.currentGUITool = None
self.selectedGUI = None
# 尝试加载中文字体
try:
self.chinese_font = self.loader.loadFont('/usr/share/fonts/truetype/wqy/wqy-microhei.ttc')
if not self.chinese_font:
print("警告: 无法加载中文字体,将使用默认字体")
except:
print("警告: 无法加载中文字体,将使用默认字体")
self.chinese_font = None
# 创建测试说明
self.createInstructions()
# 自动进入GUI编辑模式进行测试
self.enterGUIEditMode()
print("\n=== 测试说明 ===")
print("1. 应该能看到右侧的GUI编辑面板")
print("2. 点击面板中的按钮选择不同工具")
print("3. 点击场景中的位置应该能创建相应的GUI元素")
print("4. 按ESC键退出")
# 绑定退出键
self.accept("escape", self.exitTest)
def createInstructions(self):
"""创建说明文本"""
self.title = OnscreenText(
text="GUI编辑模式功能测试",
pos=(0, 0.9),
scale=0.08,
fg=(1, 1, 1, 1),
align=TextNode.ACenter,
font=self.chinese_font if self.chinese_font else None
)
self.instruction = OnscreenText(
text="右侧应该显示GUI编辑面板\n点击面板中的工具然后点击场景创建GUI元素",
pos=(0, -0.8),
scale=0.05,
fg=(1, 1, 0, 1),
align=TextNode.ACenter,
font=self.chinese_font if self.chinese_font else None
)
def enterGUIEditMode(self):
"""进入GUI编辑模式"""
self.guiEditMode = True
print("\n=== 进入GUI编辑模式 ===")
# 创建GUI编辑面板
self.createGUIEditPanel()
print("GUI编辑模式已激活")
def createGUIEditPanel(self):
"""创建GUI编辑面板"""
# 创建主面板
self.guiEditPanel = DirectFrame(
pos=(0.85, 0, 0),
frameSize=(-0.15, 0.15, -0.9, 0.9),
frameColor=(0.1, 0.1, 0.1, 0.8),
text="GUI编辑器",
text_pos=(0, 0.85),
text_scale=0.05,
text_fg=(1, 1, 1, 1),
text_font=self.chinese_font if self.chinese_font else None
)
# 创建工具按钮
y_pos = 0.7
spacing = 0.12
# 2D GUI工具标签
label_2d = DirectLabel(
parent=self.guiEditPanel,
text="2D GUI",
pos=(0, 0, y_pos),
scale=0.04,
text_fg=(1, 1, 0, 1),
frameColor=(0, 0, 0, 0),
text_font=self.chinese_font if self.chinese_font else None
)
y_pos -= 0.08
# 按钮工具
btn_button = DirectButton(
parent=self.guiEditPanel,
text="按钮",
pos=(0, 0, y_pos),
scale=0.04,
command=self.setGUICreateTool,
extraArgs=["button"],
frameColor=(0.2, 0.6, 0.8, 1),
text_font=self.chinese_font if self.chinese_font else None
)
y_pos -= spacing
# 标签工具
btn_label = DirectButton(
parent=self.guiEditPanel,
text="标签",
pos=(0, 0, y_pos),
scale=0.04,
command=self.setGUICreateTool,
extraArgs=["label"],
frameColor=(0.6, 0.8, 0.2, 1),
text_font=self.chinese_font if self.chinese_font else None
)
y_pos -= spacing
# 输入框工具
btn_entry = DirectButton(
parent=self.guiEditPanel,
text="输入框",
pos=(0, 0, y_pos),
scale=0.04,
command=self.setGUICreateTool,
extraArgs=["entry"],
frameColor=(0.8, 0.6, 0.2, 1),
text_font=self.chinese_font if self.chinese_font else None
)
y_pos -= spacing
# 3D GUI工具标签
label_3d = DirectLabel(
parent=self.guiEditPanel,
text="3D GUI",
pos=(0, 0, y_pos),
scale=0.04,
text_fg=(1, 1, 0, 1),
frameColor=(0, 0, 0, 0),
text_font=self.chinese_font if self.chinese_font else None
)
y_pos -= 0.08
# 3D文本工具
btn_3dtext = DirectButton(
parent=self.guiEditPanel,
text="3D文本",
pos=(0, 0, y_pos),
scale=0.04,
command=self.setGUICreateTool,
extraArgs=["3d_text"],
frameColor=(0.8, 0.2, 0.6, 1),
text_font=self.chinese_font if self.chinese_font else None
)
y_pos -= spacing
# 虚拟屏幕工具
btn_screen = DirectButton(
parent=self.guiEditPanel,
text="虚拟屏幕",
pos=(0, 0, y_pos),
scale=0.04,
command=self.setGUICreateTool,
extraArgs=["virtual_screen"],
frameColor=(0.6, 0.2, 0.8, 1),
text_font=self.chinese_font if self.chinese_font else None
)
y_pos -= spacing
# 退出按钮
btn_exit = DirectButton(
parent=self.guiEditPanel,
text="退出测试",
pos=(0, 0, -0.8),
scale=0.04,
command=self.exitTest,
frameColor=(0.8, 0.2, 0.2, 1),
text_font=self.chinese_font if self.chinese_font else None
)
print("✓ GUI编辑面板创建成功")
def setGUICreateTool(self, tool_type):
"""设置GUI创建工具"""
self.currentGUITool = tool_type
print(f"✓ 选择GUI创建工具: {tool_type}")
# 绑定鼠标点击事件
self.accept("mouse1", self.handleMouseClick)
def handleMouseClick(self):
"""处理鼠标点击"""
if not self.guiEditMode or not self.currentGUITool:
return
# 获取鼠标位置
if not base.mouseWatcherNode.hasMouse():
return
mouse_x = base.mouseWatcherNode.getMouseX()
mouse_y = base.mouseWatcherNode.getMouseY()
print(f"鼠标点击位置: ({mouse_x:.2f}, {mouse_y:.2f})")
# 创建GUI元素
if self.currentGUITool == "button":
self.createGUIButton((mouse_x * 10, 0, mouse_y * 10), f"按钮{len(self.gui_elements)}")
elif self.currentGUITool == "label":
self.createGUILabel((mouse_x * 10, 0, mouse_y * 10), f"标签{len(self.gui_elements)}")
elif self.currentGUITool == "entry":
self.createGUIEntry((mouse_x * 10, 0, mouse_y * 10), f"输入框{len(self.gui_elements)}")
elif self.currentGUITool == "3d_text":
self.createGUI3DText((mouse_x * 5, 0, mouse_y * 5), f"3D文本{len(self.gui_elements)}")
elif self.currentGUITool == "virtual_screen":
self.createGUIVirtualScreen((mouse_x * 5, 5, mouse_y * 5), text=f"屏幕{len(self.gui_elements)}")
def createGUIButton(self, pos=(0, 0, 0), text="按钮"):
"""创建2D GUI按钮"""
gui_pos = (pos[0] * 0.1, 0, pos[2] * 0.1)
button = DirectButton(
text=text,
pos=gui_pos,
scale=0.08,
frameColor=(0.2, 0.6, 0.8, 1),
text_font=self.chinese_font if self.chinese_font else None
)
self.gui_elements.append(button)
print(f"✓ 创建GUI按钮: {text} 在位置 {gui_pos}")
return button
def createGUILabel(self, pos=(0, 0, 0), text="标签"):
"""创建2D GUI标签"""
gui_pos = (pos[0] * 0.1, 0, pos[2] * 0.1)
label = DirectLabel(
text=text,
pos=gui_pos,
scale=0.06,
frameColor=(0, 0, 0, 0),
text_fg=(1, 1, 1, 1),
text_font=self.chinese_font if self.chinese_font else None
)
self.gui_elements.append(label)
print(f"✓ 创建GUI标签: {text} 在位置 {gui_pos}")
return label
def createGUIEntry(self, pos=(0, 0, 0), placeholder="输入框"):
"""创建2D GUI输入框"""
gui_pos = (pos[0] * 0.1, 0, pos[2] * 0.1)
entry = DirectEntry(
text="",
pos=gui_pos,
scale=0.05,
initialText=placeholder,
numLines=1,
width=12,
focus=0
)
self.gui_elements.append(entry)
print(f"✓ 创建GUI输入框: {placeholder} 在位置 {gui_pos}")
return entry
def createGUI3DText(self, pos=(0, 0, 0), text="3D文本"):
"""创建3D文本"""
textNode = TextNode(f'3d-text-{len(self.gui_elements)}')
textNode.setText(text)
textNode.setAlign(TextNode.ACenter)
if self.chinese_font:
textNode.setFont(self.chinese_font)
textNodePath = self.render.attachNewNode(textNode)
textNodePath.setPos(*pos)
textNodePath.setScale(0.5)
textNodePath.setColor(1, 1, 0, 1)
textNodePath.setBillboardAxis()
self.gui_elements.append(textNodePath)
print(f"✓ 创建3D文本: {text} 在位置 {pos}")
return textNodePath
def createGUIVirtualScreen(self, pos=(0, 0, 0), text="虚拟屏幕"):
"""创建3D虚拟屏幕"""
from panda3d.core import CardMaker, TransparencyAttrib
cm = CardMaker(f"virtual-screen-{len(self.gui_elements)}")
cm.setFrame(-1, 1, -0.5, 0.5)
virtualScreen = self.render.attachNewNode(cm.generate())
virtualScreen.setPos(*pos)
virtualScreen.setColor(0.2, 0.2, 0.2, 0.8)
virtualScreen.setTransparency(TransparencyAttrib.MAlpha)
# 添加文本
screenText = TextNode(f'screen-text-{len(self.gui_elements)}')
screenText.setText(text)
screenText.setAlign(TextNode.ACenter)
if self.chinese_font:
screenText.setFont(self.chinese_font)
screenTextNP = virtualScreen.attachNewNode(screenText)
screenTextNP.setPos(0, 0.01, 0)
screenTextNP.setScale(0.3)
screenTextNP.setColor(0, 1, 0, 1)
self.gui_elements.append(virtualScreen)
print(f"✓ 创建虚拟屏幕: {text} 在位置 {pos}")
return virtualScreen
def exitTest(self):
"""退出测试"""
print(f"\n=== 测试完成 ===")
print(f"总共创建了 {len(self.gui_elements)} 个GUI元素")
print("如果能看到GUI编辑面板并成功创建元素说明功能正常!")
self.userExit()
def main():
"""主函数"""
print("启动GUI编辑模式功能测试...")
print("这将测试主程序中新增的GUI编辑模式功能")
# 创建并运行测试
app = GUIEditModeTest()
app.run()
if __name__ == "__main__":
main()