3c6f31b503
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
60 lines
1.6 KiB
GDScript
60 lines
1.6 KiB
GDScript
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)
|