361 lines
12 KiB
Python
361 lines
12 KiB
Python
#!/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() |