#!/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()