Search…

Khởi Tạo Môi Trường Lập Trình Game Sử Dụng Thư Viện SDL (Simple DirectMedia Layer)

27/09/20205 min read
Giới thiệu về thư viện Simple DirectMedia Layers và làm quen 1 số thao tác cơ bản với thư viện này.

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)

Tiếp theo, tạo 2 thư mục LibOutput để 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à includelib đượ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

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

Ở mục Linker chọn Input và mở hộp thoại Additional Dependencies thêm vào SDL2.libSDL2main.lib:

ss_4

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

* 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

Download source code

Tham khảo

IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024