EG/demo/ray_display_test.py
2025-07-10 09:19:51 +08:00

111 lines
3.7 KiB
Python
Raw 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 -*-
"""
射线显示测试 - 测试鼠标点击射线的可视化功能
使用说明:
1. 运行脚本启动3D编辑器
2. 点击鼠标左键,观察射线显示
3. 按R键切换射线显示开关
4. 射线颜色说明:
- 蓝色:没有碰撞的射线
- 绿色段:从相机到碰撞点
- 红色段:从碰撞点到远处
- 黄色十字:碰撞点标记
"""
import sys
import os
# 添加主目录到Python路径
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
from main import MyWorld
from ui.main_window import setup_main_window
from PyQt5.QtCore import Qt
def setup_ray_display_demo():
"""设置射线显示演示"""
# 创建世界对象
world = MyWorld()
# 使用新的UI模块创建主窗口
app, main_window = setup_main_window(world)
# 设置窗口标题
main_window.setWindowTitle("射线显示测试 - 点击鼠标查看射线按R键切换显示")
# 设置焦点策略,确保主窗口能接收键盘事件
main_window.setFocusPolicy(Qt.StrongFocus)
main_window.setFocus()
# 添加键盘事件处理
def keyPressEvent(event):
print(f"检测到按键: {event.key()}, Qt.Key_R = {Qt.Key_R}")
key = event.key()
if key == Qt.Key_R: # R键
state = world.toggleRayDisplay()
status = "开启" if state else "关闭"
print(f"\n=== 射线显示已{status} ===")
print(f"当前射线显示状态: {world.getRayDisplay()}")
event.accept() # 标记事件已处理
return
# 调用原始的键盘事件处理(如果存在)
if hasattr(main_window, '_original_keyPressEvent'):
main_window._original_keyPressEvent(event)
else:
event.ignore()
# 保存原始的键盘事件处理器(如果存在)
if hasattr(main_window, 'keyPressEvent'):
main_window._original_keyPressEvent = main_window.keyPressEvent
main_window.keyPressEvent = keyPressEvent
# 添加射线显示菜单项(备用方案)
rayMenu = main_window.menuBar().addMenu('射线调试')
toggleRayAction = rayMenu.addAction('切换射线显示 (R)')
toggleRayAction.triggered.connect(lambda: toggle_and_print_ray_status())
def toggle_and_print_ray_status():
state = world.toggleRayDisplay()
status = "开启" if state else "关闭"
print(f"\n=== 射线显示已{status} ===")
print(f"当前射线显示状态: {world.getRayDisplay()}")
# 输出使用说明
print("\n" + "="*60)
print("射线显示测试启动完成!")
print("="*60)
print("使用说明:")
print("1. 默认不显示射线")
print("2. 切换射线显示的两种方式:")
print(" - 按R键切换")
print(" - 或点击菜单 [射线调试] -> [切换射线显示]")
print("3. 点击鼠标左键查看射线(需先开启显示)")
print("4. 射线颜色说明:")
print(" - 蓝色:没有碰撞的射线")
print(" - 绿色段:从相机到碰撞点")
print(" - 红色段:从碰撞点延伸")
print(" - 黄色十字:碰撞点标记")
print("5. 射线会在2秒后自动消失")
print(f"6. 当前射线显示状态: {'开启' if world.getRayDisplay() else '关闭'}")
print("="*60)
return app, main_window, world
if __name__ == "__main__":
try:
app, main_window, world = setup_ray_display_demo()
# 启动应用程序
sys.exit(app.exec_())
except Exception as e:
print(f"启动失败: {str(e)}")
import traceback
traceback.print_exc()