133 lines
5.0 KiB
Python
133 lines
5.0 KiB
Python
#!/usr/bin/env python3
|
||
# -*- coding: utf-8 -*-
|
||
|
||
"""
|
||
旋转脚本 - 让对象持续旋转
|
||
"""
|
||
|
||
from core.script_system import ScriptBase
|
||
|
||
|
||
class RotatorScript(ScriptBase):
|
||
"""旋转脚本类"""
|
||
|
||
def __init__(self):
|
||
super().__init__()
|
||
self.rotation_speed_y = 30.0 # Y轴旋转速度 (度/秒)
|
||
self.max_angle = 30.0 # 最大旋转角度(相对于初始角度)
|
||
self.direction = 1
|
||
self.current_offset = 0.0 # 当前相对于初始角度的偏移
|
||
self.initial_angle = None # 模型的初始角度
|
||
self.is_rotating = True # 是否正在旋转
|
||
|
||
def start(self):
|
||
"""脚本开始时调用"""
|
||
self.log("旋转脚本启动!")
|
||
self.log(f"旋转速度: {self.rotation_speed_y}度/秒")
|
||
self.log(f"最大旋转角度: ±{self.max_angle}度")
|
||
|
||
# 记录模型的初始角度
|
||
if self.gameObject:
|
||
initial_hpr = self.gameObject.getHpr()
|
||
self.initial_angle = initial_hpr.getZ() # 记录Z轴的初始角度
|
||
self.log(f"模型初始角度: {self.initial_angle}度")
|
||
self.log(f"旋转范围: {self.initial_angle - self.max_angle}° 到 {self.initial_angle + self.max_angle}°")
|
||
else:
|
||
self.log("⚠️ 无法获取游戏对象,使用默认初始角度0")
|
||
self.initial_angle = 0.0
|
||
|
||
def update(self, dt):
|
||
"""每帧更新"""
|
||
if not self.is_rotating or self.initial_angle is None:
|
||
return
|
||
|
||
# 计算角度变化量
|
||
delta_angle = self.rotation_speed_y * dt * self.direction
|
||
self.current_offset += delta_angle
|
||
|
||
# 如果超出角度范围,则反向并限制在边界
|
||
if self.current_offset > self.max_angle:
|
||
self.current_offset = self.max_angle
|
||
self.direction *= -1
|
||
elif self.current_offset < -self.max_angle:
|
||
self.current_offset = -self.max_angle
|
||
self.direction *= -1
|
||
|
||
# 计算最终角度(初始角度 + 偏移量)
|
||
final_angle = self.initial_angle + self.current_offset
|
||
|
||
# 设置新的旋转(只改变Z轴,保持其他不变)
|
||
current_hpr = self.gameObject.getHpr()
|
||
self.gameObject.setHpr(current_hpr.getX(), final_angle, current_hpr.getZ())
|
||
|
||
# if not self.is_rotating:
|
||
# return
|
||
#
|
||
# # 获取当前旋转并应用增量
|
||
# current_hpr = self.gameObject.getHpr()
|
||
# new_r = current_hpr.getZ() + self.rotation_speed_y * dt
|
||
# self.gameObject.setHpr(current_hpr.getX(), current_hpr.getY(), new_r)
|
||
|
||
def on_destroy(self):
|
||
"""脚本销毁时调用"""
|
||
self.log("旋转脚本停止")
|
||
|
||
# ==================== 控制方法 ====================
|
||
|
||
def set_max_angle(self, new_max_angle):
|
||
"""
|
||
设置新的最大旋转角度
|
||
|
||
Args:
|
||
new_max_angle: 新的最大角度值
|
||
"""
|
||
self.max_angle = new_max_angle
|
||
self.log(f"最大旋转角度已设置为: ±{self.max_angle}度")
|
||
if self.initial_angle is not None:
|
||
self.log(f"新的旋转范围: {self.initial_angle - self.max_angle}° 到 {self.initial_angle + self.max_angle}°")
|
||
|
||
def set_rotation_speed(self, new_speed):
|
||
"""
|
||
设置新的旋转速度
|
||
|
||
Args:
|
||
new_speed: 新的旋转速度(度/秒)
|
||
"""
|
||
self.rotation_speed_y = new_speed
|
||
self.log(f"旋转速度已设置为: {self.rotation_speed_y}度/秒")
|
||
|
||
def pause_rotation(self):
|
||
"""暂停旋转"""
|
||
self.is_rotating = False
|
||
self.log("旋转已暂停")
|
||
|
||
def resume_rotation(self):
|
||
"""恢复旋转"""
|
||
self.is_rotating = True
|
||
self.log("旋转已恢复")
|
||
|
||
def reset_to_initial_angle(self):
|
||
"""重置到初始角度"""
|
||
if self.initial_angle is not None and self.gameObject:
|
||
current_hpr = self.gameObject.getHpr()
|
||
self.gameObject.setHpr(current_hpr.getX(), current_hpr.getY(), self.initial_angle)
|
||
self.current_offset = 0.0
|
||
self.direction = 1
|
||
self.log(f"已重置到初始角度: {self.initial_angle}度")
|
||
|
||
def get_current_info(self):
|
||
"""获取当前旋转信息"""
|
||
if self.gameObject and self.initial_angle is not None:
|
||
current_hpr = self.gameObject.getHpr()
|
||
current_angle = current_hpr.getZ()
|
||
self.log("=== 当前旋转信息 ===")
|
||
self.log(f"初始角度: {self.initial_angle}度")
|
||
self.log(f"当前角度: {current_angle}度")
|
||
self.log(f"偏移量: {self.current_offset}度")
|
||
self.log(f"最大角度: ±{self.max_angle}度")
|
||
self.log(f"旋转速度: {self.rotation_speed_y}度/秒")
|
||
self.log(f"旋转方向: {'正向' if self.direction > 0 else '反向'}")
|
||
self.log(f"旋转状态: {'运行中' if self.is_rotating else '已暂停'}")
|
||
self.log("=== 信息结束 ===")
|
||
else:
|
||
self.log("无法获取旋转信息") |