112 lines
3.2 KiB
GDScript
112 lines
3.2 KiB
GDScript
extends SceneTree
|
|
|
|
func _init() -> void:
|
|
# ---------- TileSet ----------
|
|
var ts := TileSet.new()
|
|
ts.tile_size = Vector2i(32, 32)
|
|
ts.add_physics_layer()
|
|
ts.set_physics_layer_collision_layer(0, 1)
|
|
ts.set_physics_layer_collision_mask(0, 0)
|
|
|
|
var src := TileSetAtlasSource.new()
|
|
src.texture = load("res://assets/tiles/tiles.png")
|
|
src.texture_region_size = Vector2i(32, 32)
|
|
src.margins = Vector2i(2, 2)
|
|
src.separation = Vector2i(0, 0)
|
|
for c in range(4):
|
|
for r in range(2):
|
|
src.create_tile(Vector2i(c, r))
|
|
ts.add_source(src, 0)
|
|
|
|
# Solid tiles: grass, brick, question-block => full 32x32 collision polygon
|
|
for atlas in [Vector2i(0, 0), Vector2i(1, 0), Vector2i(2, 0)]:
|
|
var td: TileData = src.get_tile_data(atlas, 0)
|
|
td.set_collision_polygons_count(0, 1)
|
|
td.set_collision_polygon_points(0, 0, PackedVector2Array([
|
|
Vector2(-16, -16), Vector2(16, -16), Vector2(16, 16), Vector2(-16, 16)
|
|
]))
|
|
|
|
ResourceSaver.save(ts, "res://assets/tiles/tileset_stage2.tres")
|
|
print("TileSet saved")
|
|
|
|
# ---------- Level ----------
|
|
var root := Node2D.new()
|
|
root.name = "Level1"
|
|
|
|
# --- Ground TileMapLayer: 2 rows (grass top + dirt) x 60 cols ---
|
|
var ground := TileMapLayer.new()
|
|
ground.name = "Ground"
|
|
ground.tile_set = ts
|
|
ground.set_collision_enabled(true)
|
|
for x in range(60):
|
|
ground.set_cell(Vector2i(x, 0), 0, Vector2i(0, 0))
|
|
ground.set_cell(Vector2i(x, 1), 0, Vector2i(1, 0))
|
|
|
|
# --- Platforms (floating brick rows) ---
|
|
for spec in [
|
|
{"x": 12, "y": -4, "len": 4},
|
|
{"x": 20, "y": -6, "len": 3},
|
|
{"x": 28, "y": -3, "len": 5},
|
|
{"x": 40, "y": -5, "len": 4},
|
|
]:
|
|
for i in range(spec["len"]):
|
|
ground.set_cell(Vector2i(spec["x"] + i, spec["y"]), 0, Vector2i(1, 0))
|
|
|
|
# --- Coin tiles are non-solid: they use the coin atlas cell, no collision ---
|
|
root.add_child(ground)
|
|
ground.owner = root
|
|
|
|
# --- Fox ---
|
|
var fox := CharacterBody2D.new()
|
|
fox.name = "Fox"
|
|
fox.set_script(load("res://scripts/player.gd"))
|
|
fox.collision_layer = 1
|
|
fox.collision_mask = 1
|
|
var fox_col := CollisionShape2D.new()
|
|
fox_col.name = "CollisionShape2D"
|
|
var fox_shape := RectangleShape2D.new()
|
|
fox_shape.size = Vector2(24, 40)
|
|
fox_col.shape = fox_shape
|
|
fox.add_child(fox_col)
|
|
fox_col.owner = root
|
|
fox.position = Vector2(120, 300)
|
|
root.add_child(fox)
|
|
fox.owner = root
|
|
|
|
# --- Camera ---
|
|
var cam := Camera2D.new()
|
|
cam.name = "Camera2D"
|
|
cam.limit_left = 0
|
|
cam.limit_right = 1920
|
|
cam.limit_top = -400
|
|
cam.limit_bottom = 200
|
|
cam.position_smoothing_enabled = true
|
|
cam.position_smoothing_speed = 8.0
|
|
root.add_child(cam)
|
|
cam.owner = root
|
|
|
|
# --- Coins (Area2D, script) ---
|
|
var coin_defs := [Vector2(200, 230), Vector2(240, 230), Vector2(280, 230),
|
|
Vector2(420, 170), Vector2(460, 170), Vector2(900, 180)]
|
|
for p in coin_defs:
|
|
var coin := Area2D.new()
|
|
coin.name = "Coin"
|
|
coin.set_script(load("res://scripts/coin.gd"))
|
|
var cs := CollisionShape2D.new()
|
|
cs.name = "CollisionShape2D"
|
|
var circle := CircleShape2D.new()
|
|
circle.radius = 10.0
|
|
cs.shape = circle
|
|
coin.add_child(cs)
|
|
cs.owner = root
|
|
coin.position = p
|
|
root.add_child(coin)
|
|
coin.owner = root
|
|
|
|
var packed := PackedScene.new()
|
|
var err := packed.pack(root)
|
|
print("pack err=", err)
|
|
var save_err := ResourceSaver.save(packed, "res://scenes/level/level_1.tscn")
|
|
print("save err=", save_err)
|
|
quit()
|