Traînée de mouvement

Un point qui suit un parcours et un émetteur qui ne tourne que pendant le déplacement. emitting vient de la vitesse mesurée, et local_coords laisse la traînée derrière.

L'éditeur ci-dessus fait tourner ce projet. Changez une ligne et il se recharge.

Classes Godot utilisées

CPUParticles2DLine2DCurve

Le code

scripts/main.gd
extends Node

const SPEED: float = 300.0
const PAUSE: float = 0.8
const MOVING_SPEED: float = 20.0

var mover: Node2D
var trail: CPUParticles2D
var waypoints: PackedVector2Array
var target: int = 1
var wait_left: float = 0.0


func _ready() -> void:
	_add_background()

	var view: Vector2 = get_viewport().get_visible_rect().size

	waypoints = PackedVector2Array([
		Vector2(view.x * 0.16, view.y * 0.24),
		Vector2(view.x * 0.84, view.y * 0.76),
		Vector2(view.x * 0.84, view.y * 0.24),
		Vector2(view.x * 0.16, view.y * 0.76),
	])

	_add_route()

	mover = Node2D.new()
	mover.position = waypoints[0]
	add_child(mover)

	trail = CPUParticles2D.new()
	trail.texture = _make_dot()
	trail.local_coords = false
	trail.amount = 300
	trail.lifetime = 1.1
	trail.spread = 180.0
	trail.initial_velocity_min = 10.0
	trail.initial_velocity_max = 70.0
	trail.gravity = Vector2.ZERO
	trail.damping_min = 40.0
	trail.damping_max = 120.0
	trail.scale_amount_min = 0.7
	trail.scale_amount_max = 1.8
	trail.scale_amount_curve = _make_shrink_curve()
	trail.color_ramp = _make_ramp(
		PackedFloat32Array([0.0, 0.35, 1.0]),
		PackedColorArray([Color('#8eef97'), Color('#8da5f3'), Color(0.4, 0.5, 0.9, 0.0)])
	)
	mover.add_child(trail)

	var head: Polygon2D = Polygon2D.new()
	head.polygon = _make_circle(15.0)
	head.color = Color('#8eef97')
	mover.add_child(head)

	print('the emitter only runs while the dot moves, the trail dries up at every corner')


func _process(delta: float) -> void:
	var previous: Vector2 = mover.position

	if wait_left > 0.0:
		wait_left -= delta
	else:
		mover.position = mover.position.move_toward(waypoints[target], SPEED * delta)

		if mover.position.is_equal_approx(waypoints[target]):
			target = (target + 1) % waypoints.size()
			wait_left = PAUSE

	trail.emitting = (mover.position - previous).length() / delta > MOVING_SPEED


func _add_route() -> void:
	var route: Line2D = Line2D.new()
	route.points = waypoints
	route.add_point(waypoints[0])
	route.width = 3.0
	route.default_color = Color('#2a2f3d')
	add_child(route)


func _make_circle(radius: float) -> PackedVector2Array:
	var points: PackedVector2Array = PackedVector2Array()

	for i in 24:
		points.append(Vector2.RIGHT.rotated(TAU * i / 24.0) * radius)

	return points


func _make_shrink_curve() -> Curve:
	var curve: Curve = Curve.new()
	curve.add_point(Vector2(0.0, 1.0))
	curve.add_point(Vector2(1.0, 0.1))

	return curve


func _make_ramp(offsets: PackedFloat32Array, colors: PackedColorArray) -> Gradient:
	var ramp: Gradient = Gradient.new()
	ramp.offsets = offsets
	ramp.colors = colors

	return ramp


func _make_dot() -> GradientTexture2D:
	var gradient: Gradient = Gradient.new()
	gradient.set_color(0, Color(1, 1, 1, 1))
	gradient.set_color(1, Color(1, 1, 1, 0))

	var dot: GradientTexture2D = GradientTexture2D.new()
	dot.gradient = gradient
	dot.fill = GradientTexture2D.FILL_RADIAL
	dot.fill_from = Vector2(0.5, 0.5)
	dot.fill_to = Vector2(1.0, 0.5)
	dot.width = 32
	dot.height = 32

	return dot


func _add_background() -> void:
	var background: ColorRect = ColorRect.new()
	background.color = Color('#12141a')
	add_child(background)
	background.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT)

Plus d'exemples de Particules