Nội dung bài viết
Đăng ký học lập trình C++
Tại STDIO bạn được dạy nền tảng lập trình tốt nhất.
Đăng ký học
Trong quá trình xây dựng engine game, tôi 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. Tôi nhận thấy SDL (Simple DirectMedia Layer) cung cấp đầu đủ những hàm API giúp tôi chúng ta có thể làm được những việc đó. Trong bài biết này, tôi muốn giới thiệu tới các bạn về thư viện Simple DirectMedia Layers cũng như làm quen với thư viện này.

Giới thiệu

Trong quá trình xây dựng engine game, tôi 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. Tôi nhận thấy SDL (Simple DirectMedia Layer) cung cấp đầu đủ những hàm API giúp chúng ta có thể làm được những việc đó. Trong bài biết này, tôi muốn giới thiệu tới các bạn về thư viện Simple DirectMedia Layers cũng như làm quen với thư viện này.

Tiền đề bài viết

Những buổi đầu tiếp xúc với thư viện SDL tôi đã gặp nhiều khó khăn, đặc biệt là việc sử dụng thư viện liên kết tĩnh và thư viện liên kết động tích hợp vào Visual Studio cũng như là bắt đầu tạo một cửa sổ. Sau quá trình tìm hiểu, học tập tôi đã rút ra được một số kiến thức cũng như kinh nghiệm làm việc với thư viện SDL. Bài viết này một phần giúp tôi cũng cố kiến thức và hơn nữa là mang đến kiến thức cho các bạn đọc.

Danh sách các bài viết về chủ đề SDL.

Đối tượng hướng đến

Những lập trình viên đã có kiến thức vững chắc về ngôn ngữ lập trình C++ và nắm được nguyên lý, cách sử dụng static libray và dynamic library.

Tổng quan về thư viện SDL

  • SDL (Simple DirectMedia Layer) là một 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 được viết sử dụng thư viện SDL như Syberia II, 7 Grands Step, Secret Maryo Chronicles...
  • Trang chủ SDL: https://www.libsdl.org/

Download và tích hợp SDL vào project

Download thư viện

Để download thư viện SDL ta vào https://www.libsdl.org/download-2.0.php. Ở 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. Ở đây tôi đang sử dụng nền tảng windows nên tôi sẽ chọn SDL2-devel-2.0.3-VC.zip (Visual C++ 32/64-bit) để download hoặc các bạn có thể download tại www.libsdl.org/release/SDL2-devel-2.0.3-VC.zip.

Trong bài viết tôi sử dụng Visual Studio 2013 Ultimate trên hệ điều hành Windows 8.1 64bit.

Tích hợp thư viện vào Visual Studio

Mở Visual Studio 2013 để tạo một 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, ta tạo hai 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 hai thư mục là includelib 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 thớ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

Lưu ý: Các bạn nên để đường dẫn tương đối bằng cách dùng $(SolutionDir) để lấy về đường dẫn tới Solution thay vì là để đường dẫn tuyệt đối vì lý do nếu Project copy sang máy khác có thể không chạy được do không có thư viện.

Khởi tạo cửa sổ

Để sử dụng thư viện SDL đã thêm ở trên ta include các file header như sau:

#include <SDL.h>

Khởi tạo thư viện SDL có cung cấp cho chúng ta một hàm để khởi tạo thư viện. Hàm này 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ã 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 chúng ta có một đối tượng quản lý cửa sổ là SDL_Window được khởi tạo 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. Trong bài viết tối 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)

Sau khi cửa sổ được tạo thành công thì tôi cho cửa sổ hiển thị 5 giây sau đó tự đóng bằng cách sử dụng hàm SDL_Delay() với tham số truyền vào tính theo đơn vị miliseconds:

SDL_Delay(5000);

Trước khi đóng ứng dụng tôi thu dọn tài nguyên đã cấp phát.

//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

STDIO_SDL_VS2012.zip

STDIO_SDL_VS2013.zip

Tham khảo

https://www.libsdl.org/ - 20/07/2015
https://wiki.libsdl.org/ - 20/07/2015

THẢO LUẬN