【问题标题】:How can i make a rigid body jump in godot without givign it the ability to fly我怎样才能让刚体在戈多中跳跃而不赋予它飞行的能力
【发布时间】:2021-07-27 19:31:37
【问题描述】:

我会使用运动体,但我想将现实生活中的物理添加到我的 2d 对象,但似乎我可以通过按几次向上键来真正飞行

extends RigidBody2D

var velocity = Vector2.ZERO

const GRAVITY = 35
const SPEED = 1000
const JUMPFORCE = -900

func _process(delta):
    if Input.is_action_just_pressed("ui_right"):
        apply_central_impulse(Vector2(1000,0))
    if Input.is_action_just_pressed("ui_left"):
        apply_central_impulse(Vector2(-1000,0))
    if Input.is_action_just_released("ui_up"):
        apply_central_impulse(Vector2(0,-1000))

【问题讨论】:

    标签: 2d game-engine godot rigid-bodies gdscript


    【解决方案1】:

    test_motion

    我不建议使用 RigidBody2D 碰撞来处理此问题,因为并非每次碰撞都意味着它在地面上(例如可能撞到墙壁或天花板)。

    但是,还有另一种方法:您可以使用test_motion。如果移动会导致碰撞,则返回 true(当然,实际上你没有移动)。

    所以向下使用test_motion,如果检测到碰撞,则表示RigidBody2D在地面上:

    if Input.is_action_just_released("ui_up") and self.test_motion(Vector2(0, 1), false):
        apply_central_impulse(Vector2(0,-1000))
    

    RayCast2D

    另一个简单的设置是使用RayCast2D。将其定位为从RigidBody2DCollisionShape2DCollisionPolygon2D 的底部向下延伸。确保RayCast2D 已启用。然后你可以检查RayCast2D是否正在碰撞来决定RigidBody2D是否可以跳跃:

    if Input.is_action_just_released("ui_up") and $RayCast2D.is_colliding():
        apply_central_impulse(Vector2(0,-1000))
    

    考虑用上述方法,如果RayCast2D 检测不到东西,RigidBody2D 将无法跳转。例如,如果RayCast2D 居中,但RigidBody2D 仅部分位于地面上,则RayCast2D 什么都没有。


    Area2D

    另一种选择是使用Area2D 而不是RayCast2D。其优势在于拥有自己的CollisionShape2DCollisionPolygon2D。您需要统计进入或存在Area2D 的实体数量:

    var on_ground := 0
    
    func _on_Area2D_body_entered(body: Node) -> void:
        on_ground += 1
    
    func _on_Area2D_body_exited(body: Node) -> void:
        on_ground -= 1
    

    当然,在你的检查中使用它来跳转:

    if Input.is_action_just_released("ui_up") and on_ground > 0:
        apply_central_impulse(Vector2(0,-1000))
    

    最后我提醒你,你有碰撞层和碰撞遮罩。使用RayCast2DArea2D 将允许您设置与RigidBody2D 使用的掩码不同的掩码。这是一种指定并非所有 RigidBody2D 碰撞的东西都是它可以跳跃的东西的方法。

    我发现Area2D 更加可靠和通用。但是,设置的工作量更大。

    【讨论】:

      猜你喜欢
      • 2021-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-09
      相关资源
      最近更新 更多