Files
hello-godot/scripts/ocean.gd
T

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)