TÓM TẮT
- 1 Mở Đầu
- 2 1. Tile Map Là Gì? Khái Niệm Cơ Bản
- 3 2. Chuẩn Bị Tài Nguyên: Tạo Tile Set
- 4 3. Công Cụ Vẽ Tile Map
- 5 4. Các Kỹ Thuật Vẽ Tile Map Cơ Bản
- 6 5. Lập Trình Tile Map Trong Các Engine
- 7 6. Kỹ Thuật Nâng Cao
- 8 7. Tối Ưu Hóa Hiệu Suất
- 9 8. Kiểm Tra Và Debug
- 10 9. Thực Hành: Tạo Một Level Đơn Giản
- 11 10. Những Sai Lầm Thường Gặp Khi Vẽ Tile Map
- 12 11. Tổng Kết
Mở Đầu
Trong thế giới phát triển game 2D, tile map (bản đồ ô) là một trong những công cụ quan trọng và phổ biến nhất để xây dựng môi trường trò chơi. Khi nói đến “cách vẽ tile map”, chúng ta không chỉ nói về việc đặt các ô (tile) lên màn hình mà còn bao gồm toàn bộ quy trình từ thiết kế đồ họa, chuẩn bị tài nguyên, đến việc lập trình và tối ưu hoá bản đồ để đạt được hiệu suất tốt nhất. Bài viết này sẽ cung cấp một hướng dẫn chi tiết, sâu rộng và thực tế, giúp bạn – dù là người mới bắt đầu hay đã có kinh nghiệm – có thể tự tin tạo ra những tile map chất lượng cho dự án game của mình.
Lưu ý: Bài viết được chia thành nhiều phần, mỗi phần tập trung vào một khía cạnh cụ thể của quá trình vẽ tile map. Bạn nên đọc theo thứ tự để nắm vững kiến thức nền tảng trước khi tiến tới các kỹ thuật nâng cao.
1. Tile Map Là Gì? Khái Niệm Cơ Bản
1.1 Định Nghĩa Tile và Tile Map
- Tile (ô): Là một hình ảnh vuông (hoặc hình chữ nhật) có kích thước cố định, thường là 16×16, 32×32, 64×64 pixel. Mỗi tile đại diện cho một phần của môi trường, như đất, nước, cỏ, tường, vật phẩm, v.v.
- Tile Set (bộ ô): Tập hợp các tile được sắp xếp trong một hình ảnh duy nhất (spritesheet) để tiện quản lý và truy xuất.
- Tile Map (bản đồ ô): Là một lưới (grid) các ô được sắp xếp theo hàng và cột, tạo thành một khu vực chơi. Mỗi ô trong lưới tham chiếu tới một tile trong tile set.
1.2 Lợi Ích Khi Sử Dụng Tile Map
| Lợi Ích | Mô Tả |
|---|---|
| Tiết kiệm bộ nhớ | Các ô được tái sử dụng, giảm số lượng hình ảnh cần tải. |
| Hiệu suất cao | Khi render, engine chỉ cần vẽ các tile đã được chuẩn bị sẵn, không cần tính toán phức tạp. |
| Dễ chỉnh sửa | Thay đổi một tile trong tile set sẽ ảnh hưởng đến toàn bộ bản đồ. |
| Hỗ trợ công cụ | Nhiều engine (Unity, Godot, Phaser, Cocos2d-x…) có sẵn editor cho tile map. |
| Tái sử dụng nội dung | Một tile set có thể dùng cho nhiều level, giảm công sức tạo nội dung. |
2. Chuẩn Bị Tài Nguyên: Tạo Tile Set
2.1 Quy Định Kích Thước Tile
- Kích thước thông dụng: 16×16, 32×32, 48×48, 64×64 pixel.
- Lựa chọn kích thước: Phụ thuộc vào phong cách đồ họa (pixel art vs vector), độ phân giải màn hình mục tiêu và yêu cầu hiệu suất.
- Khuyến nghị: Đối với game di động, 32×32 hoặc 48×48 là cân bằng tốt giữa chi tiết và hiệu suất.
2.2 Thiết Kế Tile Set

Có thể bạn quan tâm: Cách Vẽ Tiên Nữ: Hướng Dẫn Chi Tiết Từng Bước Để Tạo Ra Những Kiểu Đồ Đẹp Và Sắc Nét
- Xác định Theme (chủ đề): Rừng, sa mạc, thành phố, không gian, v.v.
- Vẽ các tile cơ bản: Đất, cỏ, đá, nước, nền.
- Thêm các tile đặc biệt: Cây, tảng đá, cửa, bẫy, đối tượng tương tác.
- Sắp xếp tile vào spritesheet: Đặt theo thứ tự logic (đất ở hàng 1, nước ở hàng 2…) để dễ dàng truy xuất.
Mẹo: Sử dụng công cụ như Aseprite, Photoshop, Pyxel Edit để tạo và quản lý tile set. Các công cụ này hỗ trợ xuất spritesheet và bản đồ màu (palette) đồng nhất.
2.3 Xuất Tile Set
- Định dạng: PNG (không nén lossless) hoặc WebP (nếu muốn giảm dung lượng).
- Đặt margin và spacing nếu cần (khoảng cách giữa các tile trong spritesheet). Ví dụ: margin 2px, spacing 1px để tránh hiện tượng “bleeding” khi render.
3. Công Cụ Vẽ Tile Map
3.1 Các Engine Hỗ Trợ
| Engine | Tile Map Editor | Ngôn ngữ | Platform |
|---|---|---|---|
| Unity | Tilemap (2D Tilemap) | C# | Windows, macOS, Linux, Mobile, Web |
| Godot | TileMap Node | GDScript, C# | Windows, macOS, Linux, Mobile, Web |
| Unreal Engine | Paper2D (TileMap) | C++/Blueprint | Windows, macOS, Linux, Console |
| Phaser | Tiled (import) | JavaScript | Web |
| Cocos2d-x | TMX (Tiled) | C++, Lua, JavaScript | Mobile, Desktop, Web |
| Tiled | Standalone editor | N/A | Windows, macOS, Linux |
3.2 Giới Thiệu Ngắn Gọn Về Tiled (Phổ Biến Nhất)
- Tiled là một trình chỉnh sửa bản đồ dạng ô mã nguồn mở, hỗ trợ xuất ra định dạng TMX (XML) và JSON.
- Tính năng nổi bật: layer (lớp) đa dạng, object layer, autotiling, terrain, collision shapes.
- Dễ dàng tích hợp vào hầu hết các engine thông qua plugin hoặc parser.
3.3 Cài Đặt Và Bắt Đầu Với Tiled
- Tải về: https://www.mapeditor.org/
- Cài đặt: Chạy installer cho Windows/macOS/Linux.
- Tạo dự án mới:
- Chọn File → New.
- Đặt kích thước map (ví dụ: 100×50 tiles).
- Chọn Tile Size (32×32) và Orientation (Orthogonal cho game 2D truyền thống).
- Thêm Tileset:
- Map → New Tileset → Select Image → Chọn file PNG tile set.
- Đặt Tile Width/Height và Spacing/Margin đúng với file.
- Bắt đầu vẽ:
- Chọn công cụ Stamp để đặt tile.
- Sử dụng Bucket Fill để tô nhanh vùng lớn.
- Tạo Layers (Background, Collision, Objects) để quản lý.
4. Các Kỹ Thuật Vẽ Tile Map Cơ Bản
4.1 Vẽ Bản Đồ Nền (Background Layer)

Có thể bạn quan tâm: Cách Vẽ Tia Ló Đẹp, Sắc Nét Và Ấn Tượng: Hướng Dẫn Từng Bước Cho Người Mới Bắt Đầu
- Mục tiêu: Tạo nền đẹp, không gây “đứt đoạn” khi di chuyển.
- Cách làm:
- Sử dụng autotiling (công cụ tự động chọn tile dựa vào xung quanh) để tránh các đường viền không liền mạch.
- Đặt các tile nền (đất, cỏ) một cách ngẫu nhiên nhưng giữ nguyên tần suất để tránh lặp quá nhiều.
4.2 Tạo Lớp Va Chạm (Collision Layer)
- Mục đích: Xác định các ô không cho phép nhân vật đi qua (đá, tường, nước).
- Cách thực hiện:
- Tạo một Tile Layer riêng dành cho collision.
- Gắn Collision Shapes (hình chữ nhật, đa giác) cho mỗi tile có tính chất cản trở.
- Khi export, chỉ cần đọc dữ liệu collision để thiết lập physics bodies trong engine.
4.3 Thêm Đối Tượng (Object Layer)
- Sử dụng: Đặt spawn points, NPC, item, trigger.
- Cách:
- Tạo Object Layer trong Tiled.
- Thêm Rectangle, Polygon, Ellipse hoặc Tile Object.
- Gán Properties (key-value) cho mỗi object (ví dụ:
type=enemy,id=spawner_01).
4 4.4 Sử Dụng Terrain (Địa Hình)
- Terrain trong Tiled cho phép định nghĩa các loại địa hình (đất, nước, đá) và tạo transitions mượt mà.
- Bước thực hiện:
- Vào Tileset → Edit Tileset → Terrain.
- Định nghĩa từng loại terrain (có màu và tên).
- Gán terrain cho các tile.
- Khi vẽ, Tiled sẽ tự động chọn tile phù hợp để tạo transition.
5. Lập Trình Tile Map Trong Các Engine
5.1 Unity
5.1.1 Thiết Lập Tilemap
using UnityEngine;
using UnityEngine.Tilemaps; public class MapGenerator : MonoBehaviour
{ public Tilemap groundTilemap; public TileBase groundTiles; // mảng các TileBase đã import void Start() { GenerateGround(); } void GenerateGround() { int width = 100; int height = 50; for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { // Chọn ngẫu nhiên tile TileBase tile = groundTilesRandom.Range(0, groundTiles.Length); groundTilemap.SetTile(new Vector3Int(x, y, 0), tile); } } }
}
5.1.2 Collision
- Đánh dấu Tilemap Collider 2D trên component
Tilemap. - Thêm Composite Collider 2D và Rigidbody2D (Static) để tối ưu hoá va chạm.
5.1.3 Export/Import Tiled Map
- Sử dụng Tiled2Unity hoặc SuperTiled2Unity để import file
.tmxtrực tiếp vào Unity. - Các layer sẽ được chuyển thành các Tilemap tương ứng.
5.2 Godot
5.2.1 Tạo TileMap Node
extends TileMap func _ready(): var map_width = 120 var map_height = 60 for x in range(map_width): for y in range(map_height): var tile_id = randi() % 5 # giả sử có 5 loại tile set_cell(x, y, tile_id)
5.2.2 Collision Shapes
- Khi tạo TileSet, mở Collision tab và vẽ Collision Polygons cho từng tile.
- Godot sẽ tự động tạo
CollisionShape2Dcho TileMap khi bật Collision.
5.2.3 Import Tiled
- Godot hỗ trợ import
.tscnvà.tres. Đối với.tmx, dùng Tiled Import Plugin hoặc chuyển sang JSON.
5.3 Phaser (JavaScript)
5.3.1 Load Tilemap
function preload () { this.load.image('tiles', 'assets/tileset.png'); this.load.tilemapTiledJSON('map', 'assets/level1.json');
} function create () { const map = this.make.tilemap({ key: 'map' }); const tileset = map.addTilesetImage('tileset_name_in_tiled', 'tiles'); const groundLayer = map.createLayer('Ground', tileset, 0, 0); const collisionLayer = map.createLayer('Collision', tileset, 0, 0); collisionLayer.setCollisionByProperty({ collides: true });
}
5.3.2 Tối Ưu
- Sử dụng culling để chỉ render các tile trong viewport.
- Bật static bodies cho collision layer để giảm tính toán physics.
6. Kỹ Thuật Nâng Cao
6.1 Autotiling (Tile Auto-Placement)

Có thể bạn quan tâm: Cách Vẽ Thỏ Đi: Hướng Dẫn Từng Bước Để Tạo Ra Những Bức Tranh Đáng Yêu Và Sinh Động
- Mục tiêu: Tự động chọn tile phù hợp dựa trên vị trí xung quanh, giảm công sức vẽ thủ công.
- Cách hoạt động:
- Mỗi tile có bitmask (8 bit) đại diện cho các ô lân cận (trên, dưới, trái, phải, các góc).
- Khi vẽ, engine tính bitmask và chọn tile tương ứng.
- Triển khai:
- Trong Tiled, bật “Enable Autotiling” và cấu hình Wang Tiles.
- Trong Unity, sử dụng Rule Tile (có sẵn trong 2D Extras) để định nghĩa các quy tắc.
6.2 Parallax Scrolling (Cuộn Nhiều Lớp)
- Khái niệm: Các lớp nền di chuyển với tốc độ khác nhau để tạo cảm giác chiều sâu.
- Cách thực hiện:
- Tạo nhiều Tilemap layer (Background, Midground, Foreground).
- Khi camera di chuyển, cập nhật vị trí của mỗi layer với hệ số tốc độ (parallax factor) khác nhau.
- Mã mẫu Unity:
public class Parallax : MonoBehaviour
{ public Transform layers; public float parallaxFactors; private Vector3 previousCamPos; void Start() { previousCamPos = Camera.main.transform.position; } void LateUpdate() { Vector3 delta = Camera.main.transform.position - previousCamPos; for (int i = 0; i < layers.Length; i++) { layersi.position += delta parallaxFactorsi; } previousCamPos = Camera.main.transform.position; }
}
6.3 Dynamic Tile Changing (Thay Đổi Tile Thời Gian Thực)
- Ứng dụng: Đổi trạng thái nền (đất → bùn), mở cửa, phá hủy môi trường.
- Cách làm:
- Lưu trữ Tilemap reference.
- Khi sự kiện xảy ra, gọi
SetTile(Unity) hoặcset_cell(Godot) để thay đổi tile. - Ví dụ (Godot):
func break_tile(pos): var tile_id = get_cellv(pos) if tile_id == CRACKED_TILE_ID: set_cellv(pos, BROKEN_TILE_ID)
6.4 Procedural Generation (Sinh Ngẫu Nhiên)
- Mục tiêu: Tạo map tự động dựa trên thuật toán (Perlin Noise, Cellular Automata).
- Quy trình:
- Tạo ma trận 2D lưu trữ giá trị độ cao hoặc loại địa hình.
- Dựa trên giá trị, gán tile phù hợp (đất, nước, núi).
- Mã mẫu Unity (Perlin Noise):
void GenerateProcedural()
{ int width = 200, height = 100; float scale = 20f; for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { float heightValue = Mathf.PerlinNoise(x / scale, y / scale); TileBase tile = heightValue > 0.5f ? waterTile : grassTile; groundTilemap.SetTile(new Vector3Int(x, y, 0), tile); } }
}
6.5 Lưu Trữ Và Load Map
- Định dạng: TMX (XML), JSON, Binary (custom).
- Kỹ thuật:
- Khi map lớn, chia thành chunks (đoạn) để load/dải tải khi player di chuyển.
- Sử dụng object pooling cho các tile động để giảm tạo/destroy.
7. Tối Ưu Hóa Hiệu Suất
7.1 Culling và Chunking
- Culling: Chỉ render các tile trong viewport.
- Chunking: Chia map thành các khối (ví dụ 32×32 tiles). Khi khối ra ngoài phạm vi nhìn, không tính toán.
7.2 Atlas và Sprite Packing
- Đảm bảo tile set được pack vào Sprite Atlas để giảm số lần draw call.
- Trong Unity, bật Sprite Atlas và đặt Packing Tag cho tất cả các sprite.
7.3 Sử Dụng Static Batching

Có thể bạn quan tâm: Cách Vẽ Thỏ Tuzki Đầy Đủ Từ Cơ Bản Đến Nâng Cao
- Khi tile không thay đổi, đánh dấu chúng là static để engine gộp chúng thành một mesh.
7.4 Giảm Overdraw
- Tránh đặt nhiều layer tile chồng lên nhau nếu không cần thiết.
- Sắp xếp layer theo thứ tự từ nền tới foreground.
8. Kiểm Tra Và Debug
8.1 Kiểm Tra Collision
- Sử dụng debug draw (vẽ các collider màu đỏ) để xác nhận vị trí.
- Trong Unity, bật Gizmos → Tilemap Collider.
8.2 Kiểm Tra Độ Nhỏ Gọn
- Đảm bảo không có tile “rỗng” (null) trong các layer quan trọng, tránh lỗi khi truy xuất.
8.3 Kiểm Tra Tính Nhất Quán
- Kiểm tra các transition tile để không có “khe hở” giữa các loại địa hình.
9. Thực Hành: Tạo Một Level Đơn Giản
9.1 Bước 1: Chuẩn Bị Tile Set
- Kích thước: 32×32.
- Bao gồm: Đất (3 biến thể), Cỏ, Đá, Nước, Cây.
9.2 Bước 2: Thiết Kế Map Trong Tiled

- Tạo map 80×30 tiles.
- Thêm 3 layer:
Background,Collision,Objects. - Vẽ nền bằng autotiling cho đất và cỏ.
- Đánh dấu các tile đá trong
Collisionlayer. - Thêm một object
PlayerSpawntrongObjectslayer.
9.3 Bước 3: Export và Import
- Export file
level1.tmx. - Sử dụng SuperTiled2Unity để import vào Unity.
- Kiểm tra các layer đã được tạo thành các Tilemap component.
9.4 Bước 4: Thêm Script Điều Khiển Nhân Vật
public class PlayerController : MonoBehaviour
{ public float speed = 5f; private Rigidbody2D rb; private Vector2 movement; void Awake() => rb = GetComponent<Rigidbody2D>(); void Update() { movement.x = Input.GetAxisRaw("Horizontal"); movement.y = Input.GetAxisRaw("Vertical"); } void FixedUpdate() { rb.MovePosition(rb.position + movement speed Time.fixedDeltaTime); }
}
9.5 Bước 5: Kiểm Tra
- Chạy game, nhân vật di chuyển, không đi qua đá, có thể bơi qua nước nếu thêm logic.
- Kiểm tra camera follow và parallax nếu có.
10. Những Sai Lầm Thường Gặp Khi Vẽ Tile Map
| Sai Lầm | Nguyên Nhân | Cách Khắc Phục |
|---|---|---|
| Tile không khớp | Không dùng autotiling hoặc không đồng bộ tile set | Sử dụng Rule Tile (Unity) hoặc Wang Tiles (Tiled) |
| Collision không hoạt động | Không gán collider cho tile hoặc không bật Tilemap Collider | Đánh dấu Collision trong Tileset, bật Tilemap Collider 2D |
| Map chậm | Render toàn bộ map, không culling | Kích hoạt Chunking và Culling |
| Tile set quá lớn | Đặt quá nhiều tile trong một spritesheet | Chia thành nhiều atlas, hoặc giảm số tile |
| Lỗi vị trí spawn | Đặt object ở vị trí không đúng grid | Kiểm tra tọa độ trong Object Layer, dùng Snap to Grid |
11. Tổng Kết
Việc vẽ tile map không chỉ là công việc nghệ thuật mà còn đòi hỏi kiến thức kỹ thuật sâu rộng để đảm bảo hiệu suất và tính năng cho game. Từ việc chuẩn bị tile set, sử dụng công cụ như Tiled hoặc các editor tích hợp trong engine, tới việc lập trình các layer, collision, và tối ưu hoá, mỗi bước đều có những lưu ý quan trọng. Khi đã nắm vững các nguyên tắc cơ bản và các kỹ thuật nâng cao như autotiling, parallax, dynamic tile changing, và procedural generation, bạn sẽ có khả năng tạo ra những môi trường game phong phú, mượt mà và dễ bảo trì.
Hãy bắt tay vào thực hành ngay hôm nay: tạo một tile set đơn giản, vẽ một level trong Tiled, import vào engine yêu thích và thử nghiệm các tính năng đã học. Với sự kiên nhẫn và luyện tập, bạn sẽ nhanh chóng trở thành một “maestro” của tile map, mở ra cánh cửa cho những dự án game 2D sáng tạo hơn.
Chúc bạn thành công! Nếu còn thắc mắc hoặc muốn chia sẻ dự án của mình, đừng ngần ngại để lại bình luận hoặc tham gia cộng đồng phát triển game để học hỏi thêm.
