注册2D 360旋转



如何注册一个2D对象的360度旋转?

我将把逻辑添加到更新函数中,当物体从0开始做360度旋转时,我将发出一个信号,表示物体做了360度旋转。

在Godot术语中,我们讨论的是_proces_integrate_forces代替RigidBody2D

我的第一个想法是创建2个角度检查点数组,以及代表角度检查点当前索引的左右360度变量,如果其中一个变量达到最大索引(最后一个角度检查点),那么我可以发出"body did a 360"信号。

是否有更简单的方法来实现这一点?

橡皮鸭来了

我是这样做的。如果你看到如何这可以优化,请张贴答案,我会标记为一个。

与我最初的想法的唯一区别是,因为当旋转太快时,没有检测到角度检查点,所以我将每个检查点设置为一个范围,而不是一个精确的角度

在我的RigidBody2D,一辆车,我把这个代码:

signal Trick360
signal TrickLeft360
signal TrickRight360
const left_360_checkpoints = [[-10,0], [-140,-160], [0,10]]
const right_360_checkpoints = [[10,0], [140,160], [0,-10]]
var left_360_index = 0
var right_360_index = 0
func _process(delta):
var int_rotation = int(rotation_degrees)

for angle_range in left_360_checkpoints:
var min_angle = min(angle_range[0], angle_range[1])
var max_angle = max(angle_range[0], angle_range[1])

if int_rotation > min_angle and int_rotation < max_angle:
var new_index = left_360_checkpoints.find(angle_range)

if abs(new_index - left_360_index) == 1:
left_360_index = new_index

if left_360_index == left_360_checkpoints.size() - 1:
left_360_index = 0
emit_signal("Trick360")
emit_signal("TrickLeft360")

for angle_range in right_360_checkpoints:
var min_angle = min(angle_range[0], angle_range[1])
var max_angle = max(angle_range[0], angle_range[1])

if int_rotation > min_angle and int_rotation < max_angle:
var new_index = right_360_checkpoints.find(angle_range)

if abs(new_index - right_360_index) == 1:
right_360_index = new_index

if right_360_index == right_360_checkpoints.size() - 1:
right_360_index = 0
emit_signal("Trick360")
emit_signal("TrickLeft360")
同样,如果你认为这可以优化,把你的答案写在下面,我会标记它作为这个问题的答案。我认为我的代码是沉重的CPU,即使我没有看到任何延迟或性能损失

最新更新