Files
foxfox/tmp/build_level.gd

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()