Game C++ SDL – Bài 6: Bắt sự kiện bàn phím và di chuyển đối tượng
Chào mừng các bạn đến với chủ đề học lập trình game c++ SDL.
Bài số 6 này chúng ta sẽ tìm hiểu về cơ chế bắt sự kiện bàn phím. Và áp dụng nó để di chuyển nhân vật.
1. Bắt sự kiện bàn phím và chuột.
Trong lập trình game, sự kiện bàn phím chuột chủ yếu được sử dụng cho hai loại đối tượng.
1. Đó là xử lý menu và các option đi kèm.
2. Move nhân vật chính.
Chưa bàn về kỹ thuật số 1. Chúng ta nói về kỹ thuật số 2. Việc xử lý bàn phím và chuột dành cho đối tượng sẽ được đưa vào
hàm quản lý việc xử lý action của đối tượng nhân vật.
Trong bài số 5 chúng ta đã xây dựng được mô hình hướng đối tượng cho dự án.
Và chúng ta có lớp đối tượng MainObject được kế thừa từ lớp BaseObject.
Trong MainObject chúng ta viết một hàm xử lý Action như sau:
void MainObject::HandleInputAction(SDL_Event events, param1, param2…)
Hàm HandelInputAction cần đầu vào là một biến events để bắt sự kiện từ bên ngoài.
Và chúng ta có thể truyền thêm các đối số khác cho mục đích riêng.
Để bắt sự kiện bàn phím, chúng ta chỉ việc kiểm tra event,type với các thông điệp được định nghĩa sẵn.
a. Bắt sự kiện bàn phím được ấn xuống hoặc thả ra.
Sử dụng: events.type == SDL_KEYDOWN
events.type == SDL_KEYUP
b. Bắt sự kiện phím nào được sử dụng.
Sử dụng: events.key.keysym.sym
Ví dụ bắt sự kiện 4 phím: Left – Right – Up – Down. để di chuyển nhân vật.
switch(events.key.keysym.sym) { case SDLK_UP: // Todo break; case SDLK_DOWN: break; case SDLK_LEFT: break; case SDLK_RIGHT: break; }
Ngoài ra chúng ta có thể bắt sự kiện những phím khác. Chuột phải vào SDL_UP để xem phần định nghĩa của nó trong file SDL_Keysysm.h sẽ biết được các biến enum đại diện cho các ký tự trên bàn phím.
c. Bắt sự kiện chuột ấn xuống và nhả ra.
Sử dụng: events.type == SDL_MOUSEBUTTONDOWN
events.type == SDL_MOUSEBUTTONUP
Bắt sự kiện chuột trái phải.
Sử dụng:
if (events.button.button == SDL_BUTTON_LEFT)
if (events.button.button == SDL_BUTTON_RIGHT)
Sau khi thực hiện được hàm HandleInputAction. Chúng ta gọi hàm này trong hàm main như sau.
while (SDL_PollEvent(g_even)) { if (g_even.type == SDL_QUIT) { is_quit = true; break; } plane_object.HandleInputAction(g_even, plane_object.GetRect()); }
Chúng ta khai báo một đối tượng cho lớp nhân vật và gọi hàm xử lý action trong vòng lặp kiểm tra sự kiện.
Ok. Đó là nguyên lý cho việc xử lý bắt sự kiện bàn phím chuột.
2. Áp dụng để xử lý move đối tượng nhân vật game
Linkdown ảnh máy bay 80×46 => Click here
Nguyên lý cơ bản.
+ Sử dụng 4 phim cơ bản là: Left Right Up Down để di chuyển nhân vật theo 4 hướng.
+ Ngoài ra bạn có thể sử dụng các phím khác theo ý thích của mình.
+ Khi một phím được bấm. Thì giá trị x_val, và y_val trong lớp đối tượng sẽ được thay đổi, tăng lên hoặc giảm đi.
Sau đó, hàm xử lý move được thực hiện.
Hàm move sẽ thực hiện nhiệm vụ thay đổi vị trí hiện tại của đối tượng từ A đến A’.
Mà tọa độ của A’ là từ A + với giá trị x_val và y_val.
Tọa độ của A được xác định bởi biến rect_.x và rect_y trong lớp đối tượng MainObject.
Như vậy vật di chuyển nhanh hay chậm là do lượng x_val và y_val được thay đổi nhiều hay ít.
Có thể dùng cơ chế timer để điều khiện việc nhanh chậm mà ko cần điều chỉnh x_val hay y_val.
Nhân vật sẽ được giới hạn di chuyển trong phạm vi màn hình. Nghĩa là khi lượng x_val và y_val lớn vượt qua giới hạn. thì sẽ xử lý chặn
Ok. Và giờ hãy xem video để thực hành cùng tôi.
___________________________________________
Pass Pham
Phát Triển Phần Mềm 123A-Z Cám ơn anh nhiều, lục tung cái internet này chỉ có mỗi anh hướng dẫn phần này ạ.
A dạy rất hay ạ <3
ありがとうございました。
hi thank em
anh ơi khi em chạy chương trình bấm liền 2 phím up + right thì nút up lại bị ấn liên tục mặc dù đã nhả ra rồi , bấm xuông ko bấm dc.
https://drive.google.com/open?id=1eMsIUZjsA-fYz26051nwxHYozZ6puLVN
anh xem hộ em
khi mà giữ nút xuống lâu thì bị kiểu như là nút xuống luôn bị bấm nhả ra bấm lên vẫn ko lên
em vào group show video lên nhé, a có thể join vào để check sẽ dễ hơn
anh ơi cho em hỏi làm sao để bắt sự kiện 2 phím cùng 1 lúc ạ, vd bấm phím lên với sang trái thì nó đi chéo ấy ạ
em dùng biến quản lý, ví dụ bấm lên mà chưa nhả ra thì em cho biến istop = true, tương tự nếu ấn left thì cho isleft = true.
Sau đó trong case ấn lên, thì em check if (isleft = true) rồi thực hiện xử lý
Trong case ấn trái, thì em check if (istop = true) rồi thực hiện xử lý.
còn khi nhả ra, thì lại gán nó bằng false.
em chạy nhưng nó báo exe exited with code 0 là sao ạ?
em vào group facebook rồi show lên nhé.
Anh ơi, em làm giống như anh và chạy được không lỗi, nhưng khi em ấn phím mũi tên up, dowm, left hay right, đối tượng đều không duy chuyển ạ. Vậy là lỗi ở đâu anh nhỉ?
em vào group show lỗi lên đi
Em phát hiện một vấn đề đó là sau mỗi lần vẽ lại background và các object khác bằng ApplySurface thì bộ nhớ sẽ cộng thêm, liệu có cách nào để xóa bộ nhớ trước khi vẽ lại không anh
https://1drv.ms/v/s!AjJA54cwy5cFlTVbH4xI0DEPXcXH?e=3J9Cu1
em vào group đăng bài lên nhé, anh support cho
a ơi cho em vào group với ạ
em vào group rồi chứ, a check thấy ko còn ai chờ approve nữa
a ơi e chưa xin vô ạ. Do e ko biết tên gr với ảnh đại diện nha. em mới tiếp xúc nên mong a thông cảm ạ
a ơi a có thể cho e sdt e kb qua zalo được ko a
a ơi e vừa xin vào nhóm rồi ạ mong a duyệt
Em post lỗi của em lên group rồi a, a sửa giúp em với ạ