Couches de parallaxe

Trois couches Parallax2D avec des scroll_scale différents, répétées par repeat_size pour que les crêtes ne manquent jamais pendant le déplacement.

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

Classes Godot utilisées

Parallax2DCamera2DPolygon2D

Le code

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)

Plus d'exemples de Caméra