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