#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 脚本系统演示 展示如何使用脚本系统创建、加载、挂载和管理脚本 """ import sys import os sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from main import MyWorld def test_script_system(): """测试脚本系统的所有功能""" print("=== 脚本系统演示开始 ===\n") # 创建世界实例 world = MyWorld() # 1. 启动脚本系统 print("1. 启动脚本系统") world.startScriptSystem() print() # 2. 创建测试脚本 print("2. 创建测试脚本") script_path1 = world.createScript("test_rotation", "basic") script_path2 = world.createScript("test_movement", "movement") print(f"创建的脚本文件:") print(f" - {script_path1}") print(f" - {script_path2}") print() # 3. 加载脚本 print("3. 加载脚本") world.loadAllScripts() # 显示可用脚本 available_scripts = world.getAvailableScripts() print(f"可用脚本: {available_scripts}") print() # 4. 创建测试对象 print("4. 创建测试对象") test_object1 = world.render.attachNewNode("TestObject1") test_object1.setPos(0, 10, 0) test_object2 = world.render.attachNewNode("TestObject2") test_object2.setPos(5, 10, 0) print(f"创建测试对象: {test_object1.getName()}, {test_object2.getName()}") print() # 5. 为对象添加脚本 print("5. 为对象添加脚本") if "ExampleScript" in available_scripts: script_comp1 = world.addScript(test_object1, "ExampleScript") print(f"为 {test_object1.getName()} 添加 ExampleScript") if "TestRotation" in available_scripts: script_comp2 = world.addScript(test_object2, "TestRotation") print(f"为 {test_object2.getName()} 添加 TestRotation") print() # 6. 查看脚本信息 print("6. 查看脚本信息") for script_name in available_scripts: script_info = world.getScriptInfo(script_name) if script_info: print(f"脚本: {script_name}") print(f" 文档: {script_info.get('doc', '无')}") print(f" 文件: {script_info.get('file', '无')}") print(f" 方法: {script_info.get('methods', [])}") print() # 7. 检查对象上的脚本 print("7. 检查对象上的脚本") scripts_on_obj1 = world.getScripts(test_object1) scripts_on_obj2 = world.getScripts(test_object2) print(f"{test_object1.getName()} 上的脚本数量: {len(scripts_on_obj1)}") for script_comp in scripts_on_obj1: script_name = script_comp.script_instance.__class__.__name__ print(f" - {script_name} (启用: {script_comp.enabled})") print(f"{test_object2.getName()} 上的脚本数量: {len(scripts_on_obj2)}") for script_comp in scripts_on_obj2: script_name = script_comp.script_instance.__class__.__name__ print(f" - {script_name} (启用: {script_comp.enabled})") print() # 8. 列出所有脚本状态 print("8. 脚本系统整体状态") world.listAllScripts() # 9. 模拟运行一段时间(让脚本执行) print("9. 模拟脚本运行(5秒)") print("观察控制台输出...") import time start_time = time.time() # 手动调用几次更新来模拟游戏循环 for i in range(10): # 模拟脚本更新 dt = 0.5 # 假设每次0.5秒 for script_comp in world.script_manager.engine.script_components: if not script_comp._started: script_comp.start() script_comp.update(dt) time.sleep(0.5) print(f" 更新 {i+1}/10 完成") print() # 10. 脚本控制演示 print("10. 脚本控制演示") if scripts_on_obj1: script_comp = scripts_on_obj1[0] print(f"禁用脚本: {script_comp.script_instance.__class__.__name__}") script_comp.set_enabled(False) time.sleep(1) print(f"重新启用脚本: {script_comp.script_instance.__class__.__name__}") script_comp.set_enabled(True) print() # 11. 移除脚本 print("11. 移除脚本") if scripts_on_obj1: script_name = scripts_on_obj1[0].script_instance.__class__.__name__ success = world.removeScript(test_object1, script_name) print(f"从 {test_object1.getName()} 移除 {script_name}: {'成功' if success else '失败'}") print() # 12. 热重载演示 print("12. 热重载演示") print("热重载功能已启用,修改scripts目录中的.py文件会自动重新加载") print("当前热重载状态:", "启用" if world.script_manager.hot_reload_enabled else "禁用") print() # 13. 清理 print("13. 清理和停止") world.stopScriptSystem() print("=== 脚本系统演示完成 ===") def create_custom_script_example(): """创建自定义脚本示例""" print("\n=== 创建自定义脚本示例 ===") # 确保scripts目录存在 scripts_dir = "scripts" if not os.path.exists(scripts_dir): os.makedirs(scripts_dir) # 创建一个更复杂的示例脚本 custom_script_content = '''#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Custom Script - 自定义复杂脚本示例 展示脚本的高级功能 """ from core.script_system import ScriptBase import math class CustomScript(ScriptBase): """自定义脚本类 - 展示高级功能""" def __init__(self): super().__init__() self.time = 0.0 self.amplitude = 2.0 # 振幅 self.frequency = 1.0 # 频率 self.original_pos = None self.rotation_speed = 45.0 # 旋转速度(度/秒) def start(self): """脚本开始时调用""" self.log("CustomScript 开始运行!") if self.transform: self.original_pos = self.transform.getPos() self.log(f"记录原始位置: {self.original_pos}") def update(self, dt): """每帧更新 - 实现复杂的运动模式""" if not self.transform or not self.original_pos: return self.time += dt # 正弦波运动 + 旋转 offset_y = math.sin(self.time * self.frequency) * self.amplitude offset_z = math.cos(self.time * self.frequency * 0.5) * self.amplitude * 0.5 # 更新位置 new_pos = ( self.original_pos.x, self.original_pos.y + offset_y, self.original_pos.z + offset_z ) self.transform.setPos(*new_pos) # 旋转 current_h = self.transform.getH() new_h = current_h + self.rotation_speed * dt self.transform.setH(new_h) # 每5秒输出一次状态 if int(self.time) % 5 == 0 and int(self.time * 10) % 10 == 0: self.log(f"运行时间: {self.time:.1f}s, 位置: {new_pos}") def on_destroy(self): """脚本销毁时调用""" self.log("CustomScript 被销毁") # 恢复原始位置 if self.transform and self.original_pos: self.transform.setPos(self.original_pos) self.log("已恢复原始位置") def on_enable(self): """脚本启用时调用""" self.log("CustomScript 被启用") def on_disable(self): """脚本禁用时调用""" self.log("CustomScript 被禁用") ''' script_path = os.path.join(scripts_dir, "custom_script.py") with open(script_path, 'w', encoding='utf-8') as f: f.write(custom_script_content) print(f"✓ 创建自定义脚本: {script_path}") return script_path def usage_examples(): """使用示例""" print("\n=== 脚本系统使用示例 ===") print(""" # 基本使用流程: 1. 启动脚本系统 world.startScriptSystem() 2. 创建脚本文件 script_path = world.createScript("my_script", "basic") 3. 加载脚本 world.loadAllScripts() 4. 为对象添加脚本 my_object = world.render.attachNewNode("MyObject") world.addScript(my_object, "MyScript") 5. 管理脚本 scripts = world.getScripts(my_object) world.removeScript(my_object, "MyScript") # 高级功能: - 热重载:修改脚本文件会自动重新加载 - 脚本调试:通过控制台查看脚本状态 - 脚本模板:支持多种脚本模板 - 生命周期管理:完整的start/update/destroy循环 """) if __name__ == "__main__": # 创建自定义脚本示例 create_custom_script_example() # 运行演示 test_script_system() # 显示使用示例 usage_examples()