Quá trình xây dựng engine game cần một số thư viện cung cấp những hàm API để thao tác với hệ thống cấp thấp bên dưới như âm thanh, bàn phím, chuột và các hệ thống khác. Thư viện SDL (Simple DirectMedia Layer) cung cấp đầu đủ những hàm API để làm được những việc đó.
Tổng quan về thư viện SDL
- SDL (Simple DirectMedia Layer) là 1 thư viện đa phương tiệ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, 3D hardware thông qua OpenGL, and 2D video.
- SDL hỗ trợ các nền tảng như Linux, Windows, Windows CE, BeOS, MacOS, Mac OS X, FreeBSD, NetBSD, OpenBSD, BSD/OS, Solaris, IRIX, and QNX.
- SDL được viết bằng C nhưng hỗ trợ tốt với C++ và hiện tại cũng đã hỗ trợ các ngôn ngữ khác như Ada, C#, Lua, Ocaml, Pascal và Python.
- Các game sử dụng thư viện SDL như Syberia II, 7 Grands Step, Secret Maryo Chronicles, ...
Download và tích hợp SDL vào project
Download thư viện
Download thư viện SDL tại đây, ở mục Development Libraries có các thư viện hỗ trợ các nền tảng như Windows, Mac OS X, Linux, iOS và Android. Ví dụ trên nền tảng windows, chọn SDL2-devel-2.0.12-VC.zip (Visual C++ 32/64-bit) để download hoặc có thể download tại đây.
Tích hợp thư viện vào Visual Studio
Mở Visual Studio, tạo 1 Empty Project bằng cách vào File > New > Project, sau đó chọn Empty Project, đặt tên và nhấn OK để tạo Project.
![ss_1(1)](https://resources.stdio.vn/content/article/5ef62d795ef9e26f89a5c77b/resources/res-1601134653-1601134653979.png)
Tiếp theo, tạo 2 thư mục Lib và Output để chứa thư viện SDL và file thực thực thi *.exe cùng cấp với file .sln.
Sau đó copy 2 thư mục là include và lib được download ở trên để vào thư mục Lib vừa tạo và file SDL2.dll nằm trong thư mục lib/x86 vào thư mục Output chứa file thực thi.
Nhấn chuột phải (Right click) vào Project để mở hộp thoại Properties. Chọn C/C++ > General và mở hộp thoại Additional Include Directories để thêm đường dẫn tới thư mục header của SDL là thư mục include:
![ss_2](https://resources.stdio.vn/content/article/5ef62d795ef9e26f89a5c77b/resources/res-1601134669-1601134669285.png)
Tương tự, chọn Linker/General mở hộp thoại Additional Library Directories để thêm đường dẫn tới các file thư viện của SDL nằm trong thư mục lib:
![ss_3](https://resources.stdio.vn/content/article/5ef62d795ef9e26f89a5c77b/resources/res-1601134681-1601134681065.png)
Ở mục Linker chọn Input và mở hộp thoại Additional Dependencies thêm vào SDL2.lib và SDL2main.lib:
![ss_4](https://resources.stdio.vn/content/article/5ef62d795ef9e26f89a5c77b/resources/res-1601134695-1601134695366.png)
Cuối cùng là cấu hình lại thư mục chứa file thực thi bằng cách chọn Configuration Properties/General và mở hộp thoại Output Directory thêm vào đường dẫn như sau:
![ss_5](https://resources.stdio.vn/content/article/5ef62d795ef9e26f89a5c77b/resources/res-1601134707-1601134707368.png)
* Nên để đường dẫn tương đối bằng cách dùng $(SolutionDir) để lấy về đường dẫn tới Solution, nếu để đường dẫn tuyệt đối thì khi project được copy sang máy khác có thể không chạy được do không tìm thấy thư viện.
Khởi tạo cửa sổ
Để sử dụng thư viện SDL đã thêm ở trên, include các file header như sau:
#include <SDL.h>
SDL cung cấp 1 hàm để khởi tạo thư viện có prototype như sau:
int SDL_Init(Uint32 flags)
Hàm trả về 0 nếu khởi tạo thành công và ngược lại trả về -1 nếu khởi tạo thất bại, có thể sử dụng hàm SDL_GetError()
để lấy về thông báo lỗi nếu khởi tạo thất bại.
Tham số của SDL_Init
là 1 tham số flags kiểu int
, nằm trong những giá trị sau đây hoặc có thể dùng toán tử |
để kết hợp nhiều lựa chọn.
SDL_INIT_TIMER |
Timer subsystem |
SDL_INIT_AUDIO |
Audio subsystem |
SDL_INIT_VIDEO |
Video subsystem |
SDL_INIT_JOYSTICK |
Joystick subsystem |
SDL_INIT_HAPTIC |
Haptic (force feedback) subsystem |
SDL_INIT_GAMECONTROLLER |
Controller subsystem |
SDL_INIT_EVENTS |
Events subsystem |
SDL_INIT_EVERYTHING |
All of the above subsystems |
SDL_INIT_NOPARACHUTE |
Compatibility; this flag is ignored |
Mã nguồn khởi tạo thư viện SDL:
//Initializes the subsystems if (SDL_Init(SDL_INIT_EVERYTHING) < 0) { printf("Unable to initialize SDL %s\n", SDL_GetError()); return -1; }
Tiếp theo, khởi tạo 1 đối tượng quản lý cửa sổ là SDL_Window
như sau:
SDL_Window* window = NULL; window = SDL_CreateWindow("Stdio.vn - SDL", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 800, 640, SDL_WINDOW_SHOWN); if (window == NULL) { printf("Could not create window %s\n", SDL_GetError()); return -1; }
Hàm SDL_CreateWindow
trả về NULL
nếu thất bại, hàm có prototype như sau:
SDL_Window* SDL_CreateWindow(const char* title, int x, int y, int w, int h, Uint32 flags)
Với các tham số lần lượt là tiêu đề cửa cửa sổ, vị trí x, y, chiều rộng, chiều cao của cửa sổ. Tham số cuối cùng nằm trong những giá trị sau hoặc có thể dùng toán tử |
để kết hợp nhiều lựa chọn. Bài viết sử dụng SDL_WINDOW_SHOWN
để chắc chắn cửa sổ luôn luôn được hiểu thị.
SDL_WINDOW_FULLSCREEN |
Fullscreen window |
SDL_WINDOW_FULLSCREEN_DESKTOP |
Fullscreen window at the current desktop resolution |
SDL_WINDOW_OPENGL |
Window usable with OpenGL context |
SDL_WINDOW_SHOWN |
Window is visible |
SDL_WINDOW_HIDDEN |
Window is not visible |
SDL_WINDOW_BORDERLESS |
No window decoration |
SDL_WINDOW_RESIZABLE |
Window can be resized |
SDL_WINDOW_MINIMIZED |
Window is minimized |
SDL_WINDOW_MAXIMIZED |
Window is maximized |
SDL_WINDOW_INPUT_GRABBED |
Window has grabbed input focus |
SDL_WINDOW_INPUT_FOCUS |
Window has input focus |
SDL_WINDOW_MOUSE_FOCUS |
Window has mouse focus |
SDL_WINDOW_FOREIGN |
Window not created by SDL |
SDL_WINDOW_ALLOW_HIGHDPI |
Window should be created in high-DPI mode if supported (>= SDL 2.0.1) |
SDL_WINDOW_MOUSE_CAPTURE |
Window has mouse captured (unrelated to INPUT_GRABBED, >= SDL 2.0.4) |
Đoạn mã sau để giữ cửa số hiển thị 5 giây, sau đó thu dọn tài nguyên đã cấp phát và đóng ứng dụng.
SDL_Delay(5000);
//Destroy a window SDL_DestroyWindow(window);
//This function cleans up all initialized subsystems SDL_Quit();
Kết quả sau khi biên dịch và chạy chương trình:
![ss_6](https://resources.stdio.vn/content/article/5ef62d795ef9e26f89a5c77b/resources/res-1601134729-1601134729659.png)
Download source code
Tham khảo
- https://www.libsdl.org/ - 27/09/2020
- https://wiki.libsdl.org/ - 27/09/2020