Skip to content

Latest commit

 

History

History
95 lines (60 loc) · 4.33 KB

2020110502.如何制作追踪导弹-Godot3-2D教程.md

File metadata and controls

95 lines (60 loc) · 4.33 KB

如何制作追踪导弹 - Godot3-2D教程

简单来讲,追踪就朝着目标移动的过程。因为目标是移动的,所以在这个过程中,每一个物理帧都需要获取目标的位置,来计算并变换方向。

本文将介绍一个简单方法与一个改进方法。

首先,我们将需要的场景和节点都创建好。用到的素材

关于如何创建场景,Sprite,碰撞等等,本文就不讲了。如果还不知道,可以先看看我翻译的:使用Godot制作你的第一款游戏,或者查看DEMO

简单实现

解决追踪就是追,因此,在每一个物理帧中,只要我们获取到导弹当前的位置和目标位置的向量值,就等于是有了方向。关于这一点,Godot有一个直接的方法可以使用。

Vector2 direction_to(b: Vector2) :返回当前位置到位置B的归一化向量。

so,基于此方法,我们就可以轻松拿到这个导弹到目标的向量。

func _physics_process(delta):
	var target = $Player.position # 请自行替换目录节点
	var velocity = position.direction_to(target) * speed
	move_and_slide(velocity)

看看效果:

这显然有个问题,就是导弹并没有盯着目标,效果很差,所以,Godot也提供了一个方法用于此。

void look_at(point: Vector2) :作用就是旋转对象,面朝目标。

这里要讲一下,在Godot中,正面就是正X轴的方向,look_at就是将正x轴指向目标。因此,如果Sprite的正面不是在正X轴上,需要将它转向正X轴方向,不管是做图也好,还是在编辑器里设置,甚至是在代码控制都是可以的。

那么加上look_at的代码:

func _physics_process(delta):
	var target = $Player.position # 请自行替换目录节点
	var velocity = position.direction_to(target) * speed
	look_at(target)
	move_and_slide(velocity)

运行效果:

效果还不错,但仍然可以发现一个问题,就是导弹转向太灵敏,正常情况下是不可能转向这么快的,很不自然。因此,接下来,我们看看改进方法。

改进方法

为了让导弹的转向自然一些,我们需要为它增加一个转向的向量,这个向量的长度等于 当前导弹位置和目标位置的向量差 - 导弹当前向量

在每一个物理帧中,都需要实时计算它,因此,调整一下代码:

var velocity = Vector2(100, 0) # 给导弹一个初始的向量
var acceleration = Vector2.ZERO # 转向的向量,因为是累加的过程,所以等于是一个加速度
var r_speed = 50 # 转向速度

func _physics_process(delta):
	var line_velocity = Vector2.ZERO
	line_velocity = (target.position - position).normalized() * speed
	var rv = (line_velocity - velocity).normalized() * r_speed
	acceleration += rv
	velocity += acceleration * delta
	velocity = velocity.clamped(speed)
	rotation = velocity.angle()
	move_and_slide(velocity)
  • acceleration * delta:为了让这下速度更平稳。
  • velocity.clamped(speed):可能转向后的速度超过导弹的固有速度,所以,使用clamped返回和speed的最大值。意思是这个速度不会越过speed。
  • rotation = velocity.angle():这里,没有再使用look_at(),因为在转向的过程中,导弹不会总是对着目标。

看看效果:

这样看上去是不是就自然多了。多加一点导弹:


结束