ziva-sh/godot-tilemaplayer

Corrija código TileMapLayer do Godot 4.3+ - set_cell(coords, source_id, atlas_coords), leitura de células e dados personalizados, apagamento, conversão de coordenadas, terrenos, colisão de tiles através das camadas de física do TileSet, localização do tile atingido por um corpo e migração do nó TileMap obsoleto e sua API baseada em índice de camada. Use ao posicionar, ler ou apagar tiles do GDScript, construir um TileSet em código, gerar níveis proceduralmente, lidar com colisões de tiles ou portar código TileMap do Godot 3 ou Godot 4.0.

O que é godot-tilemaplayer?

Esta skill fornece um guia abrangente e preciso para usar o nó TileMapLayer do Godot 4.3+ em scripts GDScript, substituindo o antigo nó TileMap. Ela cobre desde operações básicas, como configurar células com set_cell() e ler dados personalizados, até tópicos avançados como autotiling com terrenos, detecção de colisão de tiles e construção programática de um TileSet. A skill também aborda a conversão de coordenadas entre espaço global, local e do mapa, além de apresentar uma tabela de migração clara para portar código do Godot 3 ou Godot 4.0 para a nova API. Por fim, lista erros comuns a serem evitados, tornando-se uma referência essencial para qualquer desenvolvedor trabalhando com tiles no Godot.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/ziva-sh/godot-skills/tree/HEAD/skills/godot-tilemaplayer

Installed? Explore more Programação e Desenvolvimento skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

TileMapLayer (Godot 4.3+)

Godot 4.3 adicionou o nó TileMapLayer e tornou TileMap obsoleto. Cada TileMapLayer é uma camada, portanto um nível com chão, paredes e decoração usa três nós TileMapLayer irmãos compartilhando um mesmo TileSet. Não escreva código novo contra TileMap, e nunca use a API do Godot 3 (set_cellv, world_to_map, set_cell(x, y, tile_id)).

A API de célula

Uma célula é identificada por coordenadas inteiras do mapa (Vector2i). Um tile é identificado por três valores:

  • source_id: o ID de uma fonte no TileSet (uma textura de atlas ou uma coleção de cenas). O primeiro atlas geralmente é 0; verifique o editor de TileSet ou o valor de retorno de TileSet.add_source().
  • atlas_coords: a coluna e linha do tile dentro desse atlas, em tiles, não em pixels.
  • alternative_tile: 0 a menos que você tenha criado alternativas espelhadas ou rotacionadas.
extends TileMapLayer

const SOURCE_ID := 0
const GRASS := Vector2i(0, 0)
const WALL := Vector2i(1, 0)


func _ready() -> void:
	for x in range(10):
		set_cell(Vector2i(x, 5), SOURCE_ID, GRASS)
	set_cell(Vector2i(3, 4), SOURCE_ID, WALL)

	var source_id := get_cell_source_id(Vector2i(3, 4))  # -1 quando a célula está vazia
	var atlas := get_cell_atlas_coords(Vector2i(3, 4))  # Vector2i(-1, -1) quando vazia
	print(source_id, atlas)

	erase_cell(Vector2i(3, 4))
	print(get_used_cells().size(), " células, limites ", get_used_rect())


func cell_at_global(global_point: Vector2) -> Vector2i:
	return local_to_map(to_local(global_point))


func center_of_cell(coords: Vector2i) -> Vector2:
	# map_to_local retorna o centro da célula no espaço local desta camada.
	return to_global(map_to_local(coords))

Fatos importantes:

  • set_cell(coords) com os argumentos padrão apaga a célula (source_id padrão é -1). Sempre passe source_id e atlas_coords ao posicionar um tile.
  • Definir atlas_coords que não existem no atlas armazena a célula sem erro (get_cell_source_id() retorna a fonte), e get_cell_tile_data() depois loga The TileSetAtlasSource atlas has no tile at (x, y). e retorna null.
  • local_to_map() e map_to_local() funcionam no espaço local da camada. Converta com to_local() / to_global() quando a camada for movida ou escalada.
  • get_used_cells_by_id(source_id, atlas_coords) encontra todas as células que usam um tile específico.
  • As alterações são agrupadas até o final do quadro. Chame update_internals() se precisar que colisão ou cenas de tiles sejam atualizadas imediatamente.

Dados personalizados por tile

Adicione uma camada de dados personalizados no TileSet (Inspetor > TileSet > Camadas de Dados Personalizados, por exemplo dano do tipo int), pinte valores no editor de TileSet e depois leia-os:

extends TileMapLayer


func dano_em(coords: Vector2i) -> int:
	var data := get_cell_tile_data(coords)
	if data == null:
		return 0
	return data.get_custom_data("dano")

get_cell_tile_data() retorna null para células vazias e para tiles de coleção de cenas, portanto verifique antes de chamar métodos nele.

Terrenos (autotiling)

As máscaras de bits de autotile do Godot 3 se tornaram conjuntos de terrenos. No TileSet, adicione um conjunto de terrenos e um terreno, depois pinte os bits de vizinhança de cada tile no editor de TileSet. Em código, passe todas as células que deseja preencher:

extends TileMapLayer

const CONJUNTO_TERRENO := 0
const TERRA := 0


func pintar_sala(rect: Rect2i) -> void:
	var cells: Array[Vector2i] = []
	for x in range(rect.position.x, rect.end.x):
		for y in range(rect.position.y, rect.end.y):
			cells.append(Vector2i(x, y))
	set_cells_terrain_connect(cells, CONJUNTO_TERRENO, TERRA)

set_cells_terrain_connect() escolhe tiles para que as bordas se conectem; set_cells_terrain_path() é para estradas e rios desenhados como um caminho. Se o resultado mostrar tiles errados ou ausentes, os bits de vizinhança no TileSet estão incompletos; código não pode corrigir isso.

Colisão

Tiles colidem apenas quando o TileSet tem uma camada de física (Inspetor do TileSet > Camadas de Física > Adicionar Elemento) e o tile tem um polígono de colisão nessa camada (editor de TileSet, selecione o tile, Física > Camada de Física 0; pressione F para um retângulo de tile inteiro). A propriedade collision_enabled da camada está ativada por padrão. As camadas de física também carregam collision_layer e collision_mask, definidos no TileSet, não no nó.

Para descobrir qual tile um CharacterBody2D tocou, use o ponto de colisão. get_coords_for_body_rid() retorna as coordenadas de um quadrante de física, não de uma célula, a menos que physics_quadrant_size seja 1 (Godot 4.5+ mescla até 16x16 células em um corpo por padrão):

extends CharacterBody2D

@export var nivel: TileMapLayer


func _physics_process(delta: float) -> void:
	velocity += get_gravity() * delta
	move_and_slide()
	for i in get_slide_collision_count():
		var colisao := get_slide_collision(i)
		if colisao.get_collider() == nivel:
			# Avance levemente para dentro do tile, pois o ponto de contato está na borda.
			var dentro := colisao.get_position() - colisao.get_normal()
			var coords := nivel.local_to_map(nivel.to_local(dentro))
			print("Tocando tile ", coords)

Construindo um TileSet em código

Útil para níveis processuais e para testes que não podem usar o editor de TileSet. Os pontos do polígono de colisão são relativos ao centro do tile.

extends Node2D


func _ready() -> void:
	var tile_set := TileSet.new()
	tile_set.tile_size = Vector2i(16, 16)
	tile_set.add_physics_layer()

	var source := TileSetAtlasSource.new()
	source.texture = load("res://tiles.png") as Texture2D
	source.texture_region_size = Vector2i(16, 16)
	source.create_tile(Vector2i(0, 0))
	var source_id := tile_set.add_source(source)

	var data := source.get_tile_data(Vector2i(0, 0), 0)
	data.add_collision_polygon(0)
	data.set_collision_polygon_points(0, 0, PackedVector2Array([
		Vector2(-8, -8), Vector2(8, -8), Vector2(8, 8), Vector2(-8, 8),
	]))

	var layer := TileMapLayer.new()
	layer.tile_set = tile_set
	add_child(layer)
	layer.set_cell(Vector2i(0, 0), source_id, Vector2i(0, 0))

Migrando do TileMap

No editor: selecione o TileMap, abra o painel inferior TileMap, clique no ícone de caixa de ferramentas e escolha "Extrair camadas do TileMap como nós TileMapLayer individuais". Depois atualize os scripts: todo método de TileMap que recebia um índice de layer vira um método no nó daquela camada, sem o índice.

Código antigoTileMapLayer
tile_map.set_cell(0, coords, source_id, atlas_coords)ground.set_cell(coords, source_id, atlas_coords)
tile_map.get_cell_source_id(1, coords)walls.get_cell_source_id(coords)
tile_map.get_used_cells(0)ground.get_used_cells()
tile_map.set_layer_enabled(2, false)decoration.enabled = false
tile_map.set_layer_z_index(1, 5)walls.z_index = 5
Godot 3 set_cellv(pos, id), world_to_map(p), map_to_world(c)set_cell(coords, source_id, atlas_coords), local_to_map(p), map_to_local(c)

Erros comuns

  • Passar posições em pixels para set_cell(). Converta com local_to_map() primeiro.
  • Chamar set_cell(coords, tile_index) com um único número: o segundo argumento é o source ID, e atlas_coords padrão é Vector2i(-1, -1), que apaga a célula.
  • Esperar colisões de um TileSet que não tem camada de física, ou de tiles sem polígono pintado.
  • Usar get_coords_for_body_rid() com o physics_quadrant_size padrão e obter uma coordenada de quadrante.
  • Chamar métodos em get_cell_tile_data() sem verificar se é null.
  • Adicionar um nó TileMap para trabalho novo porque tutoriais antigos fazem isso. Use um TileMapLayer por camada.

Individual skills in this repo

This repo contains 4 individual skills — each has its own dedicated page.

ziva-sh/godot-4-api-pitfalls

Fixes Godot 3 APIs and GDScript syntax that AI assistants write into Godot 4 projects, such as KinematicBody2D, move_and_slide(velocity), export, onready, setget, yield, string connect(), instance(), rand_range, the Tween node, File, change_scene, Spatial, rect_* properties, Pool*Array, OS time functions and the old TileMap API. Use when writing, reviewing or porting GDScript for Godot 4.x, when a script fails with "not declared", "not found in base", "was removed in Godot 4" or "is not present

ziva-sh/godot-control-layout

Builds Godot 4 Control UIs that resize instead of clipping or overlapping - containers versus anchors, anchor presets from code, size flags, custom_minimum_size, MarginContainer margins, Label wrapping, mouse_filter, CanvasLayer HUDs, Godot 4 theme override names (add_theme_color_override and friends) and the display/window/stretch settings for multiple resolutions. Use when creating or fixing menus, HUDs, dialogs and inventory screens, when UI elements are cut off, zero-sized, overlapping, igno

ziva-sh/godot-scene-organization

Structures Godot 4 projects so scenes stay reusable and references do not break - when to make a scene, a script or a Resource, instancing with @export PackedScene, preload and load, @onready and %UniqueName node access, _ready order, groups, autoloads, class_name, and resource UIDs with the .uid files added in Godot 4.4, including how to move or rename files safely. Use when creating new scenes or scripts, deciding how nodes find each other, adding global state or an event bus, moving or renami

ziva-sh/godot-signals

Godot 4 signal patterns and their failure modes - declaring typed signals, emit(), connect() and disconnect() with Callables, bind() and unbind(), lambdas, CONNECT_ONE_SHOT and CONNECT_DEFERRED, await on signals and timers, editor-made connections stored in .tscn files, and the call down, signal up rule. Use when wiring UI buttons, timers, Area2D or body events and custom game events, when replacing Godot 3 connect("signal", self, "method") or yield code, or when debugging "already connected", "

Habilidades Relacionadas