C/C++

Xử Lý Sự Kiện Trong SDL

Giới thiệu

Xử lý sự kiện trong game vô cùng quan trọng, đòi hỏi chúng ta phải thao tác với bàn phím, chuột, hay touch đối với những dòng có màn hình cảm ứng. Framework SDL có hỗ trợ đầy đủ những sự kiện đó để chúng ta thao tác và xây dựng ứng dụng. Trong bài viết này tôi sẽ hướng dẫn các bạn xử lý sự kiện trong SDL.

Tiền đề bài viết

Tiếp nối những bài viết hướng dẫn lập trình với framework SDL (Simple DirectMedia Layer).

Đố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++, mong muốn xây dựng game cơ bản sử dụng framework SDL.

Sự kiện trong SDL

Cấu trúc SDL_Event

SDL có cung cấp một union có tên là SDL_Event để chứa tất cả các thông tin của tất cả các event trong bộ thư viện này. Cấu trúc của nó như sau

Uint32 type event type, shared with all events
SDL_CommonEvent common common event data
SDL_WindowEvent window window event data
SDL_KeyboardEvent key keyboard event data
SDL_TextEditingEvent edit text editing event data
SDL_TextInputEvent text text input event data
SDL_MouseMotionEvent motion mouse motion event data
SDL_MouseButtonEvent button mouse button event data
SDL_MouseWheelEvent wheel mouse wheel event data
SDL_JoyAxisEvent jaxis joystick axis event data
SDL_JoyBallEvent jball joystick ball event data
SDL_JoyHatEvent jhat joystick hat event data
SDL_JoyButtonEvent jbutton joystick button event data
SDL_JoyDeviceEvent jdevice joystick device event data
SDL_ControllerAxisEvent caxis game controller axis event data
SDL_ControllerButtonEvent cbutton game controller button event data
SDL_ControllerDeviceEvent cdevice game controller device event data
SDL_AudioDeviceEvent adevice audio device event data (>= SDL 2.0.4)
SDL_QuitEvent quit quit request event data
SDL_UserEvent user custom event data
SDL_SysWMEvent syswm system dependent window event data
SDL_TouchFingerEvent tfinger touch finger event data
SDL_MultiGestureEvent mgesture multi finger gesture data
SDL_DollarGestureEvent dgesture multi finger gesture data
SDL_DropEvent drop drag and drop event data

Dưới đây là định nghĩa SDL_Event trong bộ thư viện SDL:

Lấy thông tin Event

Tất cả các event của Windows đều được lưu ở hằng đợi (queue). SDL có định nghĩa cho chúng ta một hàm để lấy ra event từ hằng đợi đó. Hàm này có prototype như sau:

Có tham số truyền vào là một con trỏ tới đối tượng SDL_Event. Trả về 1 nếu có event tồn tại trong queue ngược lại trả về 0 nếu queue rỗng. Và có chức năng là lấy thông tin của event ở queue và đổ dữ liệu vào đối tượng SDL_Event sau đó xóa event đó khỏi queue.

Ví dụ:

Thao tác với Event trong ứng dụng

Ở bài Khởi Tạo Môi Trường Lập Trình Game Sử Dụng Thư Viện SDL (Simple DirectMedia Layer) tôi đã khởi tạo một cửa sổ và trong bài viết này tôi tiếp tục sử dụng project ở bài trước với mã nguồn như dưới đây:

Project trước tôi cho ứng delay 2s sau đó giải phóng tài nguyên và thoát chương trình. Do bản chất của game là cập nhật và render liên lục nên tôi tạo một vòng lặp while để duy trì vòng đời của game (main game, main loop). Trong vòng lặp đó sẽ lấy ra các sự kiện và xử lý riêng tùy theo nhu cầu của mỗi lập trình viên.

Các bạn để ý rằng giá trị main.type được so sánh với các giá trị như SDL_KEYDOWN,  SDL_KEYUP để biết rằng đó là loại sự kiện gì.

Ta có mối quan hệ giữa trường dữ liệu type của đối tượng SDL_Event với các cấu trúc SDL_EventType như sau, dựa vào đó các bạn xử lý theo từng event cho phù hợp.

Event Type Event Structure SDL_Event Field
SDL_AUDIODEVICEADDED
SDL_AUDIODEVICEREMOVED
SDL_AudioDeviceEvent adevice
SDL_CONTROLLERAXISMOTION SDL_ControllerAxisEvent caxis
SDL_CONTROLLERBUTTONDOWN
SDL_CONTROLLERBUTTONUP
SDL_ControllerButtonEvent cbutton
SDL_CONTROLLERDEVICEADDED
SDL_CONTROLLERDEVICEREMOVED
SDL_CONTROLLERDEVICEREMAPPED
SDL_ControllerDeviceEvent cdevice
SDL_DOLLARGESTURE
SDL_DOLLARRECORD
SDL_DollarGestureEvent dgesture
SDL_DROPFILE SDL_DropEvent drop
SDL_FINGERMOTION
SDL_FINGERDOWN
SDL_FINGERUP
SDL_TouchFingerEvent tfinger
SDL_KEYDOWN
SDL_KEYUP
SDL_KeyboardEvent key
SDL_JOYAXISMOTION SDL_JoyAxisEvent jaxis
SDL_JOYBALLMOTION SDL_JoyBallEvent jball
SDL_JOYHATMOTION SDL_JoyHatEvent jhat
SDL_JOYBUTTONDOWN
SDL_JOYBUTTONUP
SDL_JoyButtonEvent jbutton
SDL_JOYDEVICEADDED
SDL_JOYDEVICEREMOVED
SDL_JoyDeviceEvent jdevice
SDL_MOUSEMOTION SDL_MouseMotionEvent motion
SDL_MOUSEBUTTONDOWN
SDL_MOUSEBUTTONUP
SDL_MouseButtonEvent button
SDL_MOUSEWHEEL SDL_MouseWheelEvent wheel
SDL_MULTIGESTURE SDL_MultiGestureEvent mgesture
SDL_QUIT SDL_QuitEvent quit
SDL_SYSWMEVENT SDL_SysWMEvent syswm
SDL_TEXTEDITING SDL_TextEditingEvent edit
SDL_TEXTINPUT SDL_TextInputEvent text
SDL_USEREVENT SDL_UserEvent user
SDL_WINDOWEVENT SDL_WindowEvent window

SDL_EventType được định nghĩa trong bộ thư viện SDL như sau:

Ví dụ Demo

 

3 thoughts on “Xử Lý Sự Kiện Trong SDL”

  1. Anh ơi cho em hỏi là
    SDL_BUTTON_X1
    Là nút nào trên bàn phím vậy anh, em có inbox facebook anh rồi mà chưa thấy anh trả lời.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.