feat: 场景与核心玩法脚本(双机型/波次/Boss/道具/炸弹/地面单位/浮游炮激光)

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
2026-08-31 00:31:29 +08:00
parent 024447fbda
commit 3c6f31b503
36 changed files with 1692 additions and 0 deletions
+59
View File
@@ -0,0 +1,59 @@
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)