6

我在下面有一个基本代码。我正在尝试让玩家不要在斜坡上滑下。我的坡度现在是 45°。如果玩家在斜坡上停止移动,它会滑下来(可能是因为velocity.y += delta * gravity.y)。当玩家在斜坡上时,我可以通过正常获得角度并设置velocity.y = 0它不会滑下。但我不确定这是否是最好的方法。您对我如何实现这一目标有任何想法吗?顺便说一句,有没有办法在 gdscript (即 d efault_gravity)上获取 project_settings 值?

extends KinematicBody2D

var gravity = Vector2(0,700)
var velocity = Vector2()
var hSpeed = 150
var onSlope = false

func _ready():
    set_fixed_process(true)
    pass

func _fixed_process(delta):
    var left = Input.is_action_pressed("ui_left")
    var right = Input.is_action_pressed("ui_right")

    if left:
        velocity.x = -hSpeed
    if right:
        velocity.x = hSpeed
    if !left && ! right:
        velocity.x = 0

    velocity.y += delta * gravity.y
#   if onSlope && !left && !right:
#       velocity.y = 0
#   else:
#       velocity.y += delta * gravity.y

    var movement = delta * velocity
    move(movement)

    if is_colliding():
        var normal = get_collision_normal()
        var angle = getAngleByNormal(normal)

#       I can get the angle here
#       if angle == 0 player is on ground
#       if abs(angle) > 0 && abs(angle) < 90 player is on slope |> onSlope = true

        velocity = normal.slide(velocity)
        movement = normal.slide(movement)
        move(movement)
    pass


func getAngleByNormal(normal):
    var inverseNormal = normal * -1
    var angle = inverseNormal.angle()
    angle = round(rad2deg(angle))
    return angle
    pass
4

2 回答 2

2

如果您使用的是 Godot 3.1 或更高版本(目前为 3.2.1.),则可以使用该move_and_slide_with_snap()方法。这个函数允许一个捕捉向量的参数。这意味着,当角色站在地板上时,它会尽量保持与它的联系。玩家将站在斜坡上,不会滑动。如果不再在地面上,它不会尝试再次捕捉,直到它着地。

# snap 32 pixels down
velocity = move_and_slide_with_snap(velocity, Vector2(0, -1), Vector2(0, 32)) 

当然,您必须确保在角色跳跃时禁用捕捉。跳跃通常通过设置velocity.y为负速度(如 -100)来完成,但如果捕捉处于活动状态,这将不起作用,因为角色会迅速回到地板上。

禁用快照可以通过将长度为 0 ( Vector2()) 的快照传递给move_and_slide_with_snap()或直接调用move_and_slide()来完成。

于 2020-08-05T07:51:27.500 回答
0

基本上,在物理情况下,我们应该将重力视为一种永远存在的力。

但是在游戏中,不需要恒定的重力,因此您可以在玩家接地时停止它,并在跳跃或不再接地时重新开始。

我喜欢使用的方法是仅限制 y 轴上的速度,这样它就不会像你在接地时使用的那样下降,move_and_slide()并且无论如何都允许重力加速度继续影响它。

注意:此答案基于 Godot 3 API,而问题在 Godot 2 中,因为我认为这样会更相关。

于 2018-09-12T17:32:14.810 回答