class_name OceanScroll extends Node2D ## 滚动海面:三贴图循环 + 岛屿装饰随机飘过。 ## 视口 540x960,贴图世界尺寸 540:3 块连续贴图在任意滚动相位下 ## 都能覆盖 [0,960],2 块会在屏幕底部留缺口。 const TILE := preload("res://assets/svg/ocean_tile.svg") const ISLAND := preload("res://assets/svg/island.svg") const SPEED := 120.0 const TILE_WORLD := 540.0 const CENTER_X := 270.0 const TILE_COUNT := 3 var _offset := 0.0 var _tiles: Array[Sprite2D] = [] var _islands: Array[Sprite2D] = [] var _island_timer := 4.0 func _ready() -> void: var tile_scale := TILE_WORLD / 256.0 for i in TILE_COUNT: var tile := Sprite2D.new() tile.texture = TILE tile.scale = Vector2(tile_scale, tile_scale) tile.position.x = CENTER_X add_child(tile) _tiles.append(tile) func _process(delta: float) -> void: _offset = fmod(_offset + SPEED * delta, TILE_WORLD) for i in TILE_COUNT: _tiles[i].position.y = _offset - TILE_WORLD * 0.5 + TILE_WORLD * float(i) _update_islands(delta) func _update_islands(delta: float) -> void: _island_timer -= delta if _island_timer <= 0.0: _island_timer = randf_range(5.0, 9.0) if _islands.size() < 3: _spawn_island() for island in _islands: island.position.y += SPEED * delta for island in _islands.duplicate(): if island.position.y > 1060.0: _islands.erase(island) island.queue_free() func _spawn_island() -> void: var island := Sprite2D.new() island.texture = ISLAND island.position = Vector2(randf_range(90.0, 450.0), -90.0) island.scale = Vector2.ONE * randf_range(0.7, 1.15) add_child(island) _islands.append(island)