还记得FC上的敲冰块吗?应该没有人会忘记那打滑的无助吧。
本文将介绍在Godot3中如何简单的添加加速度和摩擦力来模拟打滑。
lerp 双名 linear interpolate(线性插值) 。公式为:
interpolation = A + (B - A) * t
函数定义和文档说明:
Variant lerp(from: Variant, to: Variant, weight: float)
Linearly interpolates between two values by a normalized value.
关于此函数,可以查看文档:Interpolation。 关于线性插值,可以查看:线性插值
首先,要明确一点,因为有摩擦力,所以,在没有力作用的情况下,角色的速度会慢慢变为0,那么,如果在 处理函数中有初始化速度为0的代码需要删除 。
接下来,我们还是从变量开始,先定义摩擦力。这个摩擦力,在 lerp 函数中,就是参数 weight,它的值是0-1,值越小摩擦力越小 。
var speed = 200
var friction = 0.1
来到 _physics_process 函数里:
func _physics_process(delta):
var input_dir = 0
if Input.is_action_pressed('left'):
velocity.x = -speed
input_dir = -1
$Entiy.flip_h = true # 角色的方向,$Entiy是我的节点名,你的可能不同
if Input.is_action_pressed('right'):
velocity.x = speed
input_dir = 1
$Entiy.flip_h = false
if input_dir == 0:
velocity.x = lerp(velocity.x, 0, friction)
lerp(velocity.x, 0, friction) :很好理解,开始的值即为当前的速度值,目标值自然是停止的值0。
运行游戏
可以看到,角色在松开移动键后,产生了一段滑动,最后停下。可以试着增加 friction 的值,改变摩擦力的大小,再看看角色的移动情况。
加速度和摩擦力同理,只是目标值不再是0,而是最大速度值。 lerp 的第三个参数自然就是加速度了,因此,我们先添加一个加速度的变量,同时调整 _physics_process 函数内代码。
var acceleration = 0.01
func _physics_process(delta):
var input_dir = 0
if Input.is_action_pressed('left'):
input_dir = -1
$Entiy.flip_h = true # 角色的方向,$Entiy是我的节点名,你的可能不同
if Input.is_action_pressed('right'):
input_dir = 1
$Entiy.flip_h = false
if input_dir == 0:
velocity.x = lerp(velocity.x, 0, friction)
else:
velocity.x = lerp(velocity.x, input_dir * speed, acceleration)
运行游戏测试:
草地上和冰上的摩擦力肯定是不同的,因此我们对它们进行分别处理。
使用两个 TileMap 节点,一个放草地,一个放冰面。那么我们只需要知道角色站在什么地面上,就可以分别获取对应的摩擦力。还记得之前的 更合理的物理碰撞表现 吗,这里也可以通过同样的方法来获取角色所站的地面类型。
首先,分别对两个地面类型的 TileMap 添加组: grassground 和 iceground 。
然后添加对应变量的摩擦力,再来到 _physics_process 函数,在 move_and_slide 后,添加检测代码:
var friction_grass = 0.1
var friction_ice = 0.01
var friction = 0
for i in get_slide_count():
var collision = get_slide_collision(i)
if collision.collider.is_in_group('grassground'):
friction = friction_grass
if collision.collider.is_in_group('iceground'):
friction = friction_ice
保存后运行游戏测试:
可以看到,在冰上的摩擦力更小,惯性更强,即使按住反方向,角色还要往前滑动一段距离才会转向。是不是有点打滑的意思了?
利用Godot的内置物理函数,加上一点逻辑应用,可以做到非常多不错的效果。探索一下对象的属性,方法和函数的参数,总是能得到一些新的内容。
结束