gci*_*ico 6 game-physics gdscript godot
我在下面有一个基本代码。我正在尝试让玩家不要在斜坡上滑下来。我现在的坡度是 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
Run Code Online (Sandbox Code Playgroud)
小智 0
基本上,在物理情况下,我们应该将重力视为一种永远存在的力。
但在游戏中,不需要恒定的重力,因此您可以在玩家接地时停止重力,并在跳跃或不再接地时重新开始。
我喜欢使用的方法是仅限制 y 轴上的速度,这样它就不会像您在move_and_slide()接地时使用的那样下降,并允许重力加速度继续影响它。
注意:这个答案是基于 Godot 3 API,而问题是在 Godot 2 中,因为我认为这样会更相关。
| 归档时间: |
|
| 查看次数: |
665 次 |
| 最近记录: |