[英]More ideas of how to prevent slope slide down with KinematicBody2D?
我在下面有一个基本代码。 我正在尝试让玩家不要在斜坡上滑落。 我的坡度现在是 45°。 如果玩家在斜坡上停止运动,它会向下滑动(可能是因为velocity.y += delta * gravity.y
)。 我可以通过法线获取角度并设置velocity.y = 0
当玩家在斜坡上并且它不会滑下时。 但我不确定这是否是最好的方法。 您对我如何实现这一目标有任何想法吗? 顺便说一句,有没有办法在efault_gravity
上获取 project_settings 值(即 default_gravity )?
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
如果您使用的是 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()
即可禁用快照。
基本上,在物理情况下,我们应该将引力视为一种永远存在的力。
但在游戏中,不需要恒定的重力,因此您可以在玩家着陆时停止它,并在跳跃时或您不再着陆时重新开始。
我喜欢使用的方法是仅钳制 y 轴上的速度,这样它就不会像您在接地时在move_and_slide()
中使用的那样下降,并且无论如何都允许重力加速度继续影响它。
注意:这个答案是基于 Godot 3 API 而问题是在 Godot 2 因为我认为这样它会更相关。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.