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