Introduction
Godot 4 a entièrement réécrit le système TileMap. Si tu as utilisé TileMap dans Godot 3, presque tout a changé — l'éditeur de TileSet, la façon dont les tuiles sont définies, l'auto-tiling, les calques et l'API GDScript. Ce guide explique la nouvelle architecture à partir de zéro.
Utilisateurs de Godot 3 : les anciens autotile, set_cellv() et cell_size ont tous disparu. Consulte la section Migration depuis Godot 3 en bas de page.
La nouvelle architecture TileMap
Le système TileMap de Godot 4 se compose de deux éléments principaux :
- Nœud TileMap — le nœud que tu ajoutes à ta scène. Il contient un ou plusieurs calques et référence une ressource TileSet.
- Ressource TileSet — définit les tuiles elles-mêmes. Elle contient des sources (atlas, collection de scènes, etc.), des calques de physique, des calques de navigation, des calques de données personnalisées et des ensembles de terrain.
Changement important : dans Godot 3, la taille des tuiles était définie sur le nœud TileMap. Dans Godot 4, la taille des tuiles est définie dans la ressource TileSet, et la TileMap ne fait que la référencer.
Sources de TileSet
Un TileSet peut avoir plusieurs sources, chacune identifiée par une source_id (entier). Les types de sources incluent :
- TileSetAtlasSource — le type le plus courant. Une seule image de texture contenant plusieurs tuiles disposées en grille.
- TileSetScenesCollectionSource — chaque tuile est une scène empaquetée, utile pour les tuiles animées ou interactives.
Configurer un TileSet
Étape 1 : créer la ressource TileSet
- Ajoute un nœud TileMap à ta scène.
- Dans l'inspecteur, clique sur la propriété Tile Set et choisis New TileSet.
- Définis la Tile Size (par exemple 16x16 ou 32x32).
Étape 2 : ajouter une source d'atlas
- Clique sur le TileSet pour ouvrir l'éditeur de TileSet dans le panneau du bas.
- Clique sur le bouton + et choisis Atlas.
- Glisse ton image de tileset dans la propriété Texture.
- L'éditeur la découpe automatiquement en tuiles selon ta taille de tuile. Tu peux ajuster la région de texture et les marges.
Étape 3 : configurer les propriétés des tuiles
Dans l'éditeur de TileSet, tu peux ajouter différents types de calques qui s'appliquent à toutes les tuiles :
- Physics Layers — formes de collision pour les tuiles
- Navigation Layers — polygones traversables pour la recherche de chemin
- Custom Data Layers — données typées arbitraires (bool, int, float, String, etc.)
- Terrain Sets — pour l'auto-tiling (le remplaçant de l'autotile de Godot 3)
Calques de TileMap
Un seul nœud TileMap peut contenir plusieurs calques. C'est une grande amélioration par rapport à Godot 3, où tu avais besoin de nœuds TileMap séparés pour l'arrière-plan et le premier plan. Chaque calque peut avoir ses propres réglages de z-index, y-sort et modulate.
Configuration de calques courante :
- Layer 0 — arrière-plan (sol, plancher) — z-index : -1
- Layer 1 — terrain (murs, obstacles) — z-index : 0
- Layer 2 — premier plan (décoration au-dessus du joueur) — z-index : 1
API GDScript pour les calques
# 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")
Note sur l'API : le premier paramètre de set_cell() est toujours l'indice de calque (0, 1, 2...). Le deuxième est la position de la cellule sous forme de Vector2i. Le troisième est la source_id, et le quatrième correspond aux atlas_coords sous forme de Vector2i.
Système de terrain (auto-tiling)
Le système de terrain remplace l'autotile de Godot 3. Il sélectionne automatiquement la bonne variante de tuile en fonction des tuiles voisines.
Configurer les terrains
- Dans le TileSet, ajoute un Terrain Set (Inspecteur → Terrain Sets → Add Element).
- Choisis le mode de terrain : Match Corners and Sides (47 tuiles), Match Corners (16 tuiles) ou Match Sides (16 tuiles).
- Ajoute des types de terrain à l'intérieur de l'ensemble (par exemple « Grass », « Dirt », « Water »).
- Dans l'éditeur de TileSet, passe en mode Select, choisis une tuile et peins les bits de peering de terrain sur chaque tuile.
Peindre des terrains
Une fois les terrains configurés, passe à l'éditeur de TileMap et sélectionne l'onglet Terrains. Choisis ton type de terrain et peins directement sur la carte. Godot sélectionne automatiquement la bonne variante de tuile.
# Set terrain programmatically
tilemap.set_cells_terrain_connect(0, [Vector2i(5, 3)], 0, 0)
# Parameters: layer, cells array, terrain_set, terrain index
Physique sur les tuiles
Pour ajouter de la collision aux tuiles :
- Dans l'inspecteur du TileSet, ajoute un Physics Layer.
- Configure quels calque et masque de collision cette couche de physique utilise.
- Dans l'éditeur de TileSet, passe à l'onglet Physics et dessine des polygones de collision sur chaque tuile.
Astuce : tu peux avoir plusieurs couches de physique pour différents types de tuiles. Par exemple, une couche pour les murs (bloque le mouvement) et une autre pour les dangers (déclenche des dégâts via un chevauchement Area2D).
Données personnalisées sur les tuiles
Les calques de données personnalisées te permettent d'attacher des métadonnées typées à chaque tuile. C'est extrêmement utile pour la logique de gameplay.
Configurer des données personnalisées
- Dans l'inspecteur du TileSet, ajoute un Custom Data Layer.
-
Nomme-le (par exemple « is_destructible ») et définis son type (par exemple
bool). - Dans l'éditeur de TileSet, passe à l'onglet Custom Data et définis des valeurs par tuile.
Lire les données personnalisées dans le code
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))
Exemples courants de données personnalisées :
is_destructible: booldamage: intmovement_cost: floattile_type: String(par exemple "water", "lava", "ice")spawn_chance: float
Placement procédural de tuiles
Placer des tuiles par programmation est simple avec la nouvelle API :
# 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()
Conversion des coordonnées monde vers carte
# 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)
Migration depuis Godot 3
| 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 |
Système de terrain (Terrain Sets) |
| Un calque par nœud TileMap | Plusieurs calques dans une seule TileMap |
TileMap.tile_set = preload(...) |
La ressource TileSet est assignée dans l'inspecteur ou par le code |
world_to_map() |
local_to_map() |
map_to_world() |
map_to_local() |
Erreurs courantes
-
Oublier de créer d'abord un TileSet. Le nœud TileMap n'affiche l'éditeur de tuiles que lorsque tu lui assignes une ressource TileSet. Crées-en une dans l'inspecteur.
-
Mauvaise source_id. Si tu n'as qu'une seule source d'atlas, sa
source_idvaut0. Ajouter une deuxième source lui donnesource_id = 1. Vérifie le panneau du bas de l'éditeur de TileSet — chaque onglet de source affiche son ID. -
Confondre atlas_coords avec des ID de tuile. Dans Godot 4, il n'y a pas d'ID de tuile simples. À la place, tu référencies les tuiles par leur position dans la grille d'atlas sous forme de
Vector2i(column, row). -
Ne pas indiquer le paramètre de calque. Chaque opération sur une cellule nécessite un indice de calque comme premier argument. L'oublier provoque des erreurs d'arguments.
-
Utiliser
set_cellv(). Cette méthode n'existe plus. Utiliseset_cell()avec la nouvelle signature.