godot - 如何限制 RigidBody2D 的旋转?
问题描述
目前我正在制作游戏 Flappy Bird 的克隆以进行练习。我将这只鸟表示为RigidBody2D
.
extends RigidBody2D
func _ready():
pass
func _input(event):
if Input.is_action_just_pressed("input_action_flap"):
bird_flap()
func _physics_process(delta):
print(self.rotation_degrees)
self.rotation_degrees = -45
print(self.rotation_degrees)
func bird_flap():
var des_linear_velocity_x : float = get_linear_velocity().x
var des_linear_velocity_y : float = -750
var des_angular_velocity : float = -3
set_linear_velocity(Vector2(des_linear_velocity_x, des_linear_velocity_y))
set_angular_velocity(des_angular_velocity)
我正在尝试限制节点可能旋转的方法。但是,我遇到了一些问题。
-135.234329
-45
-137.498474
-45
-139.724884
-45
-141.914169
-45
-144.066986
-45
-146.183914
-45
-148.265564
-45
-150.312515
-45
-152.325363
-45
由于 Godot 的内置物理引擎,旋转的值似乎在剧烈闪烁。当我尝试使用该方法时clamp(...)
- 我随后体验到我的角色精灵旋转的狂野闪烁。
self.rotation = clamp(self.rotation, deg2rad(-45), deg2rad(+45))
有谁知道如何解决这一问题?
解决方案
直接改变物理体的状态通常需要在_integrate_forces
方法而不是process
方法中完成。(参见顶部注释:RigidBody2D 文档)
在这里,我正在创建和设置一个新的变换。
func _integrate_forces(state):
var rotation_radians = deg2rad(rotation_degrees)
var new_rotation = clamp(rotation_radians, -0.78, 0.78)
var new_transform = Transform2D(new_rotation, position)
state.transform = new_transform
请记住,angular_velocity
它仍在应用中,这将导致您的身体“坚持”最大/最小旋转。您可以通过调整angular_damp
编辑器或在达到目标时手动更改您angular_velocity
的代码来解决此问题rotation_degrees
。
推荐阅读
- python - Excel自动过滤范围:保持范围不变/避免自动添加行
- python - 在 python 中使用 scipy 和 librosa 读取 wav 文件
- css - 带有渐变叠加和背景图像的 SVG 圆角三角形
- java - Kotlin 父子类初始化顺序
- c++ - 我动态添加了一个按钮,如何在 Qt 的另一个 void 中使用这个按钮?
- java - MongoDB java 列出数据库名称和与之相关的集合
- django - 如何将自定义 Django 表单验证错误显示为标准弹出窗口
- kotlin - 如何有效地阅读/解释这段 Kotlin 代码?
- sql - COALESCE(SUM(...),0) COALESCE(COUNT(...),0) 在我的代码中不起作用
- c# - 如何使用脚本任务声明工作表?