Capas de parallax
Tres capas Parallax2D con distinto scroll_scale, repetidas por repeat_size para que las crestas nunca se acaben mientras la cámara avanza.
El editor de arriba está ejecutando este proyecto. Cambia una línea y se recarga.
Clases de Godot usadas
Parallax2DCamera2DPolygon2D
El código
scripts/main.gd
extends Node
const SPAN: float = 512.0
const SPEED: float = 140.0
var camera: Camera2D
func _ready() -> void:
_add_background()
var view: Vector2 = get_viewport().get_visible_rect().size
_add_layer(0.15, Color('#2a2f3d'), view.y * 0.58, 230.0, 3)
_add_layer(0.4, Color('#12141a').lerp(Color('#8da5f3'), 0.34), view.y * 0.74, 160.0, 4)
_add_layer(0.8, Color('#12141a').lerp(Color('#8eef97'), 0.5), view.y * 0.92, 120.0, 6)
camera = Camera2D.new()
camera.position = view * 0.5
add_child(camera)
camera.make_current()
_add_hud()
print('the camera pans on its own, hold left or right to drive it')
func _process(delta: float) -> void:
var drive: float = float(Input.is_key_pressed(KEY_RIGHT)) - float(Input.is_key_pressed(KEY_LEFT))
camera.position.x += (SPEED if is_zero_approx(drive) else drive * SPEED * 4.0) * delta
func _add_layer(scroll: float, color: Color, base_y: float, height: float, peaks: int) -> void:
var layer: Parallax2D = Parallax2D.new()
layer.scroll_scale = Vector2(scroll, scroll)
layer.repeat_size = Vector2(SPAN, 0)
layer.repeat_times = 12
layer.add_child(_make_ridge(base_y, height, peaks, color))
add_child(layer)
func _make_ridge(base_y: float, height: float, peaks: int, color: Color) -> Polygon2D:
var step: float = SPAN / peaks
var points: PackedVector2Array = PackedVector2Array()
for i in peaks:
points.append(Vector2(i * step, base_y))
points.append(Vector2(i * step + step * 0.5, base_y - height * (0.6 + 0.4 * sin(i * 2.3))))
points.append(Vector2(SPAN, base_y))
points.append(Vector2(SPAN, base_y + 600.0))
points.append(Vector2(0, base_y + 600.0))
var ridge: Polygon2D = Polygon2D.new()
ridge.polygon = points
ridge.color = color
return ridge
func _add_hud() -> void:
var hud: CanvasLayer = CanvasLayer.new()
add_child(hud)
var label: Label = Label.new()
label.text = 'scroll_scale far 0.15 mid 0.40 near 0.80'
label.add_theme_font_size_override('font_size', 22)
label.add_theme_color_override('font_color', Color('#f3d48d'))
label.position = Vector2(40, 36)
hud.add_child(label)
func _add_background() -> void:
var layer: CanvasLayer = CanvasLayer.new()
layer.layer = -1
add_child(layer)
var background: ColorRect = ColorRect.new()
background.color = Color('#12141a')
layer.add_child(background)
background.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT)