Skip to content

Latest commit

 

History

History
125 lines (83 loc) · 4.56 KB

2021010601.如何添加加速度和摩擦力-Godot3-2D教程.md

File metadata and controls

125 lines (83 loc) · 4.56 KB

如何添加加速度和摩擦力-Godot3-2D教程

还记得FC上的敲冰块吗?应该没有人会忘记那打滑的无助吧。

本文将介绍在Godot3中如何简单的添加加速度和摩擦力来模拟打滑。

关于lerp函数

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 添加组: grassgroundiceground

然后添加对应变量的摩擦力,再来到 _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的内置物理函数,加上一点逻辑应用,可以做到非常多不错的效果。探索一下对象的属性,方法和函数的参数,总是能得到一些新的内容。


结束