Giriş

Godot 4, TileMap sistemini tamamen yeniden yazdı. Godot 3'te TileMap kullandıysanız, neredeyse her şey değişti — TileSet düzenleyicisi, döşemelerin nasıl tanımlandığı, otomatik döşeme (auto-tiling), katmanlar ve GDScript API'si. Bu rehber, yeni mimariyi sıfırdan ele alır.

Godot 3 kullanıcıları: Eski autotile, set_cellv() ve cell_size tamamen kaldırıldı. Sayfanın altındaki Godot 3'ten Geçiş bölümüne bakın.

Yeni TileMap Mimarisi

Godot 4'ün TileMap sistemi iki ana bileşenden oluşur:

  • TileMap düğümü — Sahnenize eklediğiniz düğüm. Bir veya daha fazla katman içerir ve bir TileSet kaynağına referans verir.
  • TileSet kaynağı — Döşemelerin kendisini tanımlar. Kaynakları (atlas, sahne koleksiyonu vb.), fizik katmanlarını, navigasyon katmanlarını, özel veri katmanlarını ve arazi (terrain) setlerini içerir.

Önemli değişiklik: Godot 3'te döşeme boyutu TileMap düğümünde ayarlanıyordu. Godot 4'te döşeme boyutu TileSet kaynağında tanımlanır ve TileMap yalnızca ona referans verir.

TileSet Kaynakları

Bir TileSet birden fazla kaynağa sahip olabilir; bunların her biri bir source_id (tam sayı) ile tanımlanır. Kaynak türleri şunları içerir:

  • TileSetAtlasSource — En yaygın tür. Bir ızgara içinde düzenlenmiş birden fazla döşeme içeren tek bir doku görüntüsü.
  • TileSetScenesCollectionSource — Her döşeme paketlenmiş bir sahnedir; animasyonlu veya etkileşimli döşemeler için kullanışlıdır.

Bir TileSet Kurmak

Adım 1: TileSet Kaynağını Oluşturun

  1. Sahnenize bir TileMap düğümü ekleyin.
  2. Inspector'da Tile Set özelliğine tıklayın ve New TileSet'i seçin.
  3. Tile Size'ı ayarlayın (örn. 16x16 veya 32x32).

Adım 2: Bir Atlas Kaynağı Ekleyin

  1. Alt paneldeki TileSet düzenleyicisini açmak için TileSet'e tıklayın.
  2. + düğmesine tıklayın ve Atlas'ı seçin.
  3. Tileset görüntünüzü Texture özelliğine sürükleyin.
  4. Düzenleyici, döşeme boyutunuza göre onu otomatik olarak döşemelere böler. Doku bölgesini ve kenar boşluklarını ayarlayabilirsiniz.

Adım 3: Döşeme Özelliklerini Yapılandırın

TileSet düzenleyicisinde, tüm döşemelere uygulanan çeşitli katman türleri ekleyebilirsiniz:

  • Physics Layers — Döşemeler için çarpışma şekilleri
  • Navigation Layers — Yol bulma için yürünebilir poligonlar
  • Custom Data Layers — Rastgele türlenmiş veriler (bool, int, float, String vb.)
  • Terrain Sets — Otomatik döşeme için (Godot 3 autotile'ın yerini alır)

TileMap Katmanları

Tek bir TileMap düğümü birden fazla katman içerebilir. Bu, arka plan ve ön plan için ayrı TileMap düğümlerine ihtiyaç duyduğunuz Godot 3'e göre büyük bir gelişmedir. Her katmanın kendi z-index, y-sort ve modulate ayarları olabilir.

Yaygın katman yapılandırması:

  • Layer 0 — Arka plan (zemin, taban) — z-index: -1
  • Layer 1 — Arazi (duvarlar, engeller) — z-index: 0
  • Layer 2 — Ön plan (oyuncunun üzerindeki dekorasyon) — z-index: 1

Katmanlar için GDScript API'si

# Set a cell on layer 0
tilemap.set_cell(0, Vector2i(5, 3), source_id, atlas_coords)

# Get cell info
var source = tilemap.get_cell_source_id(0, Vector2i(5, 3))
var coords = tilemap.get_cell_atlas_coords(0, Vector2i(5, 3))

# Erase a cell
tilemap.erase_cell(0, Vector2i(5, 3))

# Check if a cell is occupied
if tilemap.get_cell_source_id(0, Vector2i(5, 3)) != -1:
    print("Cell has a tile")

API notu: set_cell() içindeki ilk parametre her zaman katman dizinidir (0, 1, 2...). İkincisi Vector2i olarak hücre konumudur. Üçüncüsü source_id, dördüncüsü ise Vector2i olarak atlas_coords'tur.

Arazi Sistemi (Otomatik Döşeme)

Arazi (terrain) sistemi, Godot 3'ün autotile'ının yerini alır. Komşu döşemelere göre doğru döşeme varyantını otomatik olarak seçer.

Arazileri Kurmak

  1. TileSet'te bir Terrain Set ekleyin (Inspector → Terrain Sets → Add Element).
  2. Arazi modunu seçin: Match Corners and Sides (47 döşeme), Match Corners (16 döşeme) veya Match Sides (16 döşeme).
  3. Set içine arazi türleri ekleyin (örn. "Grass", "Dirt", "Water").
  4. TileSet düzenleyicisinde Select moduna geçin, bir döşeme seçin ve arazi eşleşme bitlerini (peering bits) her döşemeye boyayın.

Arazileri Boyamak

Araziler yapılandırıldıktan sonra TileMap düzenleyicisine geçin ve Terrains sekmesini seçin. Arazi türünüzü seçin ve doğrudan harita üzerine boyayın. Godot, doğru döşeme varyantını otomatik olarak seçecektir.

# Set terrain programmatically
tilemap.set_cells_terrain_connect(0, [Vector2i(5, 3)], 0, 0)
# Parameters: layer, cells array, terrain_set, terrain index

Döşemelerde Fizik

Döşemelere çarpışma eklemek için:

  1. TileSet Inspector'ında bir Physics Layer ekleyin.
  2. Bu fizik katmanının hangi çarpışma katmanını ve maskesini kullandığını yapılandırın.
  3. TileSet düzenleyicisinde Physics sekmesine geçin ve her döşemeye çarpışma poligonları çizin.

İpucu: Farklı döşeme türleri için birden fazla fizik katmanına sahip olabilirsiniz. Örneğin, bir katman duvarlar için (hareketi engeller), bir diğeri tehlikeler için (Area2D örtüşmesi yoluyla hasarı tetikler).

Döşemelerde Özel Veriler

Özel veri katmanları, herhangi bir döşemeye türlenmiş meta verileri iliştirmenize olanak tanır. Bu, oynanış mantığı için son derece kullanışlıdır.

Özel Verileri Kurmak

  1. TileSet Inspector'ında bir Custom Data Layer ekleyin.
  2. Ona bir ad verin (örn. "is_destructible") ve türü ayarlayın (örn. bool).
  3. TileSet düzenleyicisinde Custom Data sekmesine geçin ve döşeme başına değerler ayarlayın.

Kodda Özel Verileri Okumak

var tile_data = tilemap.get_cell_tile_data(0, Vector2i(5, 3))
if tile_data:
    var is_destructible = tile_data.get_custom_data("is_destructible")
    var damage = tile_data.get_custom_data("damage")
    if is_destructible:
        destroy_tile(Vector2i(5, 3))

Yaygın özel veri örnekleri:

  • is_destructible: bool
  • damage: int
  • movement_cost: float
  • tile_type: String (örn. "water", "lava", "ice")
  • spawn_chance: float

Prosedürel Döşeme Yerleştirme

Yeni API ile döşemeleri programlı olarak yerleştirmek basittir:

# Fill a rectangular area
for x in range(20):
    for y in range(10):
        tilemap.set_cell(0, Vector2i(x, y), 0, Vector2i(0, 0))

# Random tile placement
for x in range(50):
    for y in range(50):
        if randf() > 0.7:
            tilemap.set_cell(0, Vector2i(x, y), 0, Vector2i(1, 0))
        else:
            tilemap.set_cell(0, Vector2i(x, y), 0, Vector2i(0, 0))

# Get all used cells on a layer
var used_cells: Array[Vector2i] = tilemap.get_used_cells(0)
print("Layer 0 has ", used_cells.size(), " tiles")

# Clear all tiles on a layer
tilemap.clear_layer(0)

# Clear everything
tilemap.clear()

Dünya-Harita Koordinat Dönüşümü

# Convert world position to map coordinates
var map_pos: Vector2i = tilemap.local_to_map(world_position)

# Convert map coordinates to world position (center of tile)
var world_pos: Vector2 = tilemap.map_to_local(Vector2i(5, 3))

# Example: check what tile the player is standing on
var player_tile = tilemap.local_to_map(tilemap.to_local(player.global_position))
var tile_data = tilemap.get_cell_tile_data(0, player_tile)
if tile_data:
    var tile_type = tile_data.get_custom_data("tile_type")
    print("Player is on: ", tile_type)

Godot 3'ten Geçiş

Godot 3 Godot 4
TileMap.cell_size TileSet.tile_size
set_cellv(pos, tile_id) set_cell(layer, pos, source_id, atlas_coords)
get_cellv(pos) get_cell_source_id(layer, pos)
autotile Arazi sistemi (Terrain Sets)
TileMap düğümü başına tek katman Tek bir TileMap'te birden fazla katman
TileMap.tile_set = preload(...) TileSet kaynağı Inspector'da veya kod aracılığıyla atanır
world_to_map() local_to_map()
map_to_world() map_to_local()

Yaygın Hatalar

  1. Önce bir TileSet oluşturmayı unutmak. Bir TileSet kaynağı atayana kadar TileMap düğümü döşeme düzenleyicisini göstermez. Inspector'da bir tane oluşturun.

  2. Yanlış source_id. Yalnızca tek bir atlas kaynağınız varsa, onun source_id değeri 0'dır. İkinci bir kaynak eklemek ona source_id = 1 verir. TileSet düzenleyicisinin alt panelini kontrol edin — her kaynak sekmesi kendi kimliğini gösterir.

  3. atlas_coords'u döşeme kimlikleriyle karıştırmak. Godot 4'te basit döşeme kimlikleri yoktur. Bunun yerine, döşemelere atlas ızgarasındaki konumları üzerinden Vector2i(column, row) olarak referans verirsiniz.

  4. Katman parametresini belirtmemek. Her hücre işlemi ilk argüman olarak bir katman dizini gerektirir. Bunu unutmak argüman hatalarına neden olur.

  5. set_cellv() kullanmak. Bu metot artık mevcut değil. Yeni imza ile set_cell()'i kullanın.