Lập trình game với SDL

Lập trình game với SDL

Bài viết này mình sẽ giới thiệu về thư viện lập trình SDL

SDL là gì?

  1. Simple DirectMedia Layer (SDL):là một thư viện đa nền tảng, bao gồm các API để thao tác với âm thanh, bàn phím, chuột, joystick, graphics hardware thông qua OpenGL và Direct3D.
  2. Thư viện SDL được viết bằng C chuẩn, nhưng hỗ trợ tốt với C++ và nhiều ngôn ngữ lập trình khác như:C#,Java, Pascal, PHP, Python,...

  3. SDL hỗ trợ trên các hệ điều hành như: Windows, Mac OS X, Linux, iOS và Android.

  4. Các game sử dụng thư viện SDL như: Syberia II, 7 Grands Step, Secret Maryo Chronicles,…

Một số hình ảnh về game được tạo bởi thư viện SDL

Các bạn có thể tải thư viện: Tại đây

Cách khởi tạo thư viện SDL

#include "SDL.h" //Khai báo thư viện(Các bạn nhớ cài đặt thư viện)

//lưu ý: các biến trong hàm main là bắt buộc để chạy thư viện SDL
int main(int argc, char* argv[])
{
 //Khởi tạo thư viện(Khởi động)
    if(SDL_Init(SDL_INIT_EVERYTHING) == -1)
    {
        return(1);
    }  

 // Đợi 5 giây trước khi đóng màn hình SDL
    SDL_Delay(5000);

 // Thoát khỏi SDL
    SDL_Quit();

    return 0;
}

Thực hành

Mình sẽ hướng dẫn các bạn viết chương trình tải một hình ảnh lên màn hình (hình ảnh này có thể được làm nền của game).

Các lệnh sử dụng trong chương trình:

    • SDL_Surface: có thể hiểu nó là một kiểu dữ liệu để chứa ảnh.
    • SDL_FreeSurface: Giải phóng các tài nguyên được sử dụng bởi SDL_Sunface được tạo trước đó.
    • SDL_DisplayFormat: Chuyển đổi ảnh nhận được sang định dạng hiển thị.
    • IMG_Load: sẽ thực hiện đọc file ảnh và trả về kết quả là kiểu dữ liệu SDL_Surface.
    • SDL_SetVideoMode: định dạng màn hình được hiển thị với (chiều rộng)x(chiều dài), pixel, và Uint32 flags (kick vào tiêu đề để xem thêm về flags).
    • SDL_BlitSurface: ở đây mình truyền tải dữ liệu có trong image đã được định dạng trong hàm LoadImage vào màn hình screen để load lên màn hình.
    • SDL_Flip: Load ảnh lên màn hình SDL.
    #include<windows.h>
    #include<string>
    #include<SDL_image.h>
    #include<SDL.h>
    
    #undef main
    
    //hàm nhận tên của ảnh, đọc ảnh và trả về kiểu SDL_Surface
    SDL_Surface* LoadImage(std::string file_path)
    {
    	SDL_Surface* load_image = NULL;
    	SDL_Surface* optimize_image = NULL;
    
    //lưu ý: vị trí lưu ảnh phải cùng với vị trí lưu chương trình chính của các bạn để hàm IMG_Load đọc được ảnh
    	load_image = IMG_Load(file_path.c_str());
    	if (load_image != NULL)
    	{
    //hàm định dạng hiển thị tối ưu hóa kiểu dữ liệu cho phù hợp
    		optimize_image = SDL_DisplayFormat(load_image);
    //dữ liệu đã được đưa vào optimize_image nên load_image không cần nữa, ta giải phóng load_image
    		SDL_FreeSurface(load_image);
    	}
    	return optimize_image;
    }
    
    int main(int arc, char* argv[])
    {
    	SDL_Surface* screen;
    	SDL_Surface* image;
    
    	if (SDL_Init(SDL_INIT_EVERYTHING) == -1)   //khởi tạo màn hình SDL
    		return 1;
    
    	screen = SDL_SetVideoMode(1000, 625, 32, SDL_SWSURFACE); //định dạng màn hình
    	image = LoadImage("bk_2dgame.jpg");
    
    	SDL_BlitSurface(image, NULL, screen, NULL); //tải ảnh vào screen
    
    	SDL_Flip(screen);  //hiển thị ảnh lên màn hình
    	SDL_Delay(10000);  //dừng 10s trước khi đóng chương trình
    	SDL_FreeSurface(image); //giải phóng dữ liệu vì image đã được tải vào screen
    	SDL_Quit();  //thoát khỏi SDL
    
    	return 0;
    }

    Nếu chạy thành công thì kết quả sẽ hiển thị hình ảnh trên màn hình SDL (các bạn có thể tải một Background trên internet hoặc một hình nào đó tùy thích).

    Đoạn kết trên mình tham khảo "Tại đây" vì mình thấy nó khá là dễ hiểu và dễ hình dung, hi vọng các bạn có thể làm quen và sử dụng được thư viện này.

    Tìm hiểu thêm cách cài đặt thư viện: http://eitguide.net/khoi-tao-moi-truong-lap-trinh-game-su-dung-thu-vien-sdl-simple-directmedia-layer/

    Kết luận

    Theo mình thấy thì thư viện này cũng hỗ trợ khá tốt cho việc lập trình game, các bạn có thể tìm hiểu thêm và tạo một game cho riêng mình. Tuy nhiên, nếu các bạn muốn nâng cao khả năng lập trình thì hãy sử dụng thư viện này, còn nếu muốn theo hướng chuyên nghiệp thì vẫn nên sử dụng các app hỗ trợ cho việc lập trình game như: Unity, Cocos2d-x, ....

    Chúc các bạn thành công!