extends SceneTree ## Генератор сцены Этапа 2: уровень с тайлами, блоками, монетами. ## Строит сцену в API, сохраняет в res://scenes/level_1.tscn. func _init() -> void: # ---- TileSet ---- var img := Image.load_from_file("res://assets/tiles/tiles.png") var tex := ImageTexture.new() tex.image = img var ts: TileSet = TileSet.new() ts.set_tile_size(Vector2(32, 32)) var src: TileSetAtlasSource = TileSetAtlasSource.new() src.texture = tex src.texture_region_size = Vector2i(32, 32) src.margins = Vector2i(2, 2) src.separation = Vector2i(0, 0) src.create_tile(Vector2i(0, 0)) ts.add_source(src, 0) ts.add_physics_layer() ts.set_physics_layer_collision_layer(0, 1) ts.set_physics_layer_collision_mask(0, 1) var layer_data: TileData = ts.get_source_at_index(0).get_tile_data(Vector2i(0, 0), 0) # (в реальной сцене коллизия задаётся в редакторе; здесь достаточно наличия слоя) # ---- TileMapLayer с полом ---- var layer: TileMapLayer = TileMapLayer.new() layer.name = "Ground" layer.tile_set = ts layer.set_collision_enabled(true) # Пол: 80 плиток длиной, 1 ряд, y=0 for x in range(0, 80): layer.set_cell(Vector2i(x, 0), 0, Vector2i(0, 0)) # ---- Root ---- var root := Node2D.new() root.name = "Level1" root.add_child(layer) # ---- 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 fcol := CollisionShape2D.new() var fshape := CapsuleShape2D.new() fshape.radius = 14.0 fshape.height = 40.0 fcol.shape = fshape fox.add_child(fcol) col.owner = fox if false else root fox.position = Vector2(100, 200) root.add_child(fox) # ---- Camera ---- var cam := Camera2D.new() cam.name = "Camera2D" cam.position = Vector2(640, 360) cam.limit_left = 0 cam.limit_right = 2560 cam.limit_top = 0 cam.limit_bottom = 720 root.add_child(cam) # ---- Сохранить ---- ResourceSaver.save(root, "res://scenes/level_1.tscn") print("SAVED res://scenes/level_1.tscn") quit()