gpt4 book ai didi

game-physics - 关于如何使用 KinematicBody2D 防止斜坡滑落的更多想法?

转载 作者:行者123 更新时间:2023-12-03 14:44:34 30 4
gpt4 key购买 nike

我在下面有一个基本代码。我正在尝试让玩家不要在斜坡上滑下来。我现在的坡度是 45°。如果玩家在斜坡上停止移动,它会滑下(可能是因为 velocity.y += delta * gravity.y )。我可以通过法线获取角度并设置 velocity.y = 0当玩家在斜坡上时,它不会滑下。但我不确定这是否是最好的方法。您对我如何实现这一目标有任何想法吗?顺便说一句,有没有办法在 gdscript 上获取 project_settings 值(即 d efault_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()方法。 This function允许捕捉向量的参数。这意味着,当角色站在地板上时,它会尝试保持与地板对齐。玩家将站在斜坡上而不会滑动。如果不再在地面上,它在触地之前不会再次尝试折断。

# snap 32 pixels down
velocity = move_and_slide_with_snap(velocity, Vector2(0, -1), Vector2(0, 32))
当然,您必须确保在角色跳跃时禁用捕捉。跳转通常通过设置 velocity.y 来完成到负速度(如 -100),但如果捕捉处于事件状态,这将不起作用,因为角色将弹回地板。
只需将长度为 0 ( Vector2() ) 的 snap 传递给 move_and_slide_with_snap() 即可禁用 snap或只需调用 move_and_slide()反而。

关于game-physics - 关于如何使用 KinematicBody2D 防止斜坡滑落的更多想法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45377142/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com