Game C++ Phần 2 – Bài 3: Kỹ thuật Tile Map trong Game
Hello, chào mừng các bạn đến với chủ đề học lập trình game c++ phần 2.
Bài số 3 này chúng ta sẽ cùng tìm hiểu một kỹ thuật quan trọng trong lập trình game.
Đó là: Kỹ thuật tile map trong lập trình game.
1. Lý thuyết cơ bản về tile map
a. Chia bản đồ thành các ô vuông gọi là các ô tile map
Nếu như ở trong phần 1, tôi giới thiệu tới các bạn dạng game cơ bản đó là máy bay chiến đấu bay trên trời.
Map bản đồ nó đơn giản chỉ là một tấm ảnh background, chưa hề có kỹ thuật tile map
Nhưng khi chúng ta muốn xây dựng các tựa game khác, mà trong đó nhân vật game của chúng ta có thể di chuyển trên mặt đất, nhảy qua vực thẳm, vượt qua các chương ngại vật.
Thì bản đồ của chúng ta phải sử dụng kỹ thuật tile map để giải quyết được vấn đề nêu trên.
Kỹ thuật tile map là kỹ thuật:
Mà người ta chia bản đồ game thành các ô vuông có kích thước bằng nhau. Mỗi ô vuông đó sẽ có một giá trị số thể hiện trạng thái của ô.
Người lập trình viên sẽ dựa vào trạng thái của ô vuông để chèn 1 hình ảnh vào ô vuông đó.
Hãy xem hình minh họa dưới đây:
Người coder sẽ quy định các chỉ số cho từng ô map.
0 là chỉ số không chèn ảnh
ô đất dưới cùng có chỉ số = 1
ô đất trên cùng có cỏ xanh chỉ số = 2
thùng gỗ xanh chỉ số = 7
thùng gỗ nâu chỉ số = 8
đồng tiền vàng chỉ số = 9
các chỉ số 3 4 5 6 có thể là các dạng map khác.
Như vậy thì câu hỏi đặt ra là, các chỉ số này sẽ được lưu ở đâu.
Các bạn nhìn thấy bản đồ được chia thành các ô vuông hệt như một mảng 2 chiều, có số hàng và số cột.
Do đó các chỉ số của từng ô sẽ được lưu trong một file text với đuôi được đặt theo ý người lập trình viên.
Ví dụ : “map.dat”
file map.dat sẽ có dạng như sau:
Các bạn sẽ thấy file dat sẽ mô tả đúng theo trạng thái từng ô của bản đồ.
Bản đồ có bao nhiêu hàng bao nhiêu cột thì trong file dat cũng sẽ có từng đó hàng và cột thể hiện trạng thái của từng ô.
b. Mô hình hóa dữ liệu.
Sẽ có hai đối tượng được mô hình hóa để xử lý cho kỹ thuật tile map
+ Đối tượng hình ảnh để chèn vào các ô tile map, được gọi là lớp TileMat và kế thừa từ lớp baseobject
class TileMat : public BaseObject { public: TileMat() {;} ~TileMat() {;} };
+ Đối tượng GameMap thực hiện các nhiệm vụ như sau:
=> Đọc file dat và lưu trữ trạng thái của từng ô tile map vào một mảng dữ liệu
=> Load các dạng map của bản đồ từ 1 đến 9 theo ví dụ ở trên
vì mỗi ô sẽ có một giá trị tương ứng với loại map được chèn vào, chúng ta có 9 loại thì phải có 9 hình ảnh map tương ứng để đọc vào chèn vào.
=> Thực hiện hàm chèn map vào bản đồ.
typedef struct Map { int start_x_; int start_y_; int max_x_; int max_y_; int tile[MAX_MAP_Y][MAX_MAP_X]; // MAX_MAP_Y = 10, MAX_MAP_X = 400 char* file_name_; } Map; class GameMap { public: GameMap(); ~GameMap(); void LoadMap(char* name); void DrawMap(SDL_Renderer* des); void LoadMapTiles(SDL_Renderer* screen); Map GetMap() const {return game_map_;} void SetMap(const Map& gMap) {game_map_ = gMap;} private: Map game_map_; TileMat tile_mat_[MAX_TILES]; // MAX_TILES = 20 Input input_type_; };
+ cấu trúc map chính là đối tượng lưu trữ trạng thái và vị trí của các ô tile map
+ mảng tile_mat_ là mảng lưu các đối tượng loại map đang được thiết lập tối đa là 20
Ok. đó là lý thuyết thể hiện logic, thuật toán cho kỹ thuật tile map trong game.
Do code xử lý cho kỹ thuật này dài và nhiều đoạn phức tạp, tôi không viết rõ trên blog, mà sẽ mô tả cụ thể qua video thực hành.
Hãy xem video thực hành để bắt đầu.
2. Thực hành kỹ thuật tile map