Estela de movimiento
Un punto recorriendo una ruta y un emisor que solo funciona mientras se mueve. emitting sale de la velocidad medida, y local_coords deja la estela atrás.
El editor de arriba está ejecutando este proyecto. Cambia una línea y se recarga.
Clases de Godot usadas
CPUParticles2DLine2DCurve
El código
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)