В этом туториале мы попробуем восстановить пример игры Dynamic Tilemap Layers на Godot.
Для этого сначала нужно восстановить структуру игры.
Откроем Godot и создадим новый проект с именем Dynamic Tilemap Layers Experiment.
Создадим объект CharacterBody2D и вложим внутрь него узлы Sprite2D и CollisionShape2D. Настроим их следующим образом:
В
Sprite2Dдобавим спрайт куба (в качестве временной иконки можно использоватьicon.svg).В
CollisionShape2Dвыберем прямоугольную форму и растянем её так, чтобы она охватывала спрайт.
После этого сохраним сцену под именем player.tscn.
Создадим новую сцену и добавим в неё следующие узлы:
Node2D (корневой объект);
два узла TileMapLayer;
Camera2D;
Area2D (внутрь него вложим CollisionShape2D).
Для CollisionShape2D выберем прямоугольную форму столкновения. Размер прямоугольника настроим позже.
Теперь встроим в сцену уже сохранённую сцену игрока — player.tscn.
Сохраним полученную сцену под именем world.tscn.
Выберем узел TileMapLayer. Создадим из иконки icon.svg новый тайл, предварительно указав его размер — 128×128. Затем нарисуем три блока в верхней части.
Выберем второй тайловый слой — TileMapLayer2. Проделаем с ним те же действия, что и с TileMapLayer, и создадим подземную часть пещеры, которая будет становиться прозрачной. Также расширим CollisionShape2D, чтобы он перекрывал блоки TileMapLayer2.
Откроем сцену player.tscn и добавим скрипт player.gd к узлу CharacterBody2D.
Для узла CharacterBody2D движок Godot автоматически сгенерирует следующее содержимое скрипта.
extends CharacterBody2D
const SPEED = 300.0
const JUMP_VELOCITY = -400.0
func _physics_process(delta: float) -> void:
# Add the gravity.
if not is_on_floor():
velocity += get_gravity() * delta
# Handle jump.
if Input.is_action_just_pressed("ui_accept") and is_on_floor():
velocity.y = JUMP_VELOCITY
# Get the input direction and handle the movement/deceleration.
# As good practice, you should replace UI actions with custom gameplay actions.
var direction := Input.get_axis("ui_left", "ui_right")
if direction:
velocity.x = direction * SPEED
else:
velocity.x = move_toward(velocity.x, 0, SPEED)
move_and_slide()
Посмотрим, что делает этот скрипт. Запустим сцену world.tscn и проверим игру. Наш игрок проваливается сквозь блоки — это значит, что блоки не имеют физической коллизии. Мы забыли добавить физику в TileMapLayer. Исправим это: выделим TileMapLayer, а в инспекторе в разделе `TileSet» раскроем вкладку Physics Layers.
Для блоков я включил флажок Use Kinematic в разделе физики, и игрок перестал проваливаться сквозь них. Благодаря функции move_and_slide() у CharacterBody2D персонаж теперь плавно скользит по поверхности блоков.
В настройках TileMapLayer2 добавил Z Index = 10 — так блоки пещеры будут отображаться поверх игрока.
Осталось добавить прозрачность для пещеры. Для этого прикрепим к TileMapLayer2 скрипт opacity.gd.
Затем добавим сигналы от узла Area2D — они будут срабатывать при входе игрока в пещеру.
В скрипт opacity.gd я добавил следующий код.
extends TileMapLayer
var flag=false
var opacity=1.0
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
pass # Replace with function body.
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
if(flag==true and opacity>0.3):
opacity-=delta
if(flag==false and opacity<1):
opacity+=delta
self_modulate=Color(1,1,1,opacity)
pass
func _on_area_2d_body_shape_entered(body_rid: RID, body: Node2D, body_shape_index: int, local_shape_index: int) -> void:
flag=true
pass # Replace with function body.
func _on_area_2d_body_shape_exited(body_rid: RID, body: Node2D, body_shape_index: int, local_shape_index: int) -> void:
flag=false
pass # Replace with function body.
Программа работает!
Конец.
В этой статье я описал работу программы Dynamic Tilemap Layers в Godot, которая объединяет работу с тайлами, физику и управление прозрачностью слоёв. Спасибо за внимание.






















