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

 

 

20 thoughts on “Game C++ SDL – Bài 6: Bắt sự kiện bàn phím và di chuyển đối tượng

  • 1 March, 2019 at 8:56 am
    Permalink

    ​ 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
    ありがとうございました。

    Reply
  • 28 March, 2020 at 12:45 am
    Permalink

    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.

    Reply
  • 28 March, 2020 at 4:41 am
    Permalink

    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

    Reply
    • 1 April, 2020 at 3:14 am
      Permalink

      em vào group show video lên nhé, a có thể join vào để check sẽ dễ hơn

      Reply
      • 26 November, 2020 at 5:52 am
        Permalink

        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 ạ

        Reply
        • 26 November, 2020 at 8:46 am
          Permalink

          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.

          Reply
  • 25 November, 2020 at 5:07 am
    Permalink

    em chạy nhưng nó báo exe exited with code 0 là sao ạ?

    Reply
    • 26 November, 2020 at 8:43 am
      Permalink

      em vào group facebook rồi show lên nhé.

      Reply
  • 30 August, 2021 at 3:20 am
    Permalink

    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ỉ?

    Reply
    • 1 September, 2021 at 5:44 am
      Permalink

      em vào group show lỗi lên đi

      Reply
  • 16 October, 2021 at 5:16 pm
    Permalink

    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

    Reply
    • 17 October, 2021 at 9:17 am
      Permalink

      em vào group đăng bài lên nhé, anh support cho

      Reply
      • 6 March, 2022 at 8:26 am
        Permalink

        a ơi cho em vào group với ạ

        Reply
        • 6 March, 2022 at 8:39 am
          Permalink

          em vào group rồi chứ, a check thấy ko còn ai chờ approve nữa

          Reply
  • 6 March, 2022 at 6:19 pm
    Permalink

    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 ạ

    Reply
  • 6 March, 2022 at 7:55 pm
    Permalink

    a ơi a có thể cho e sdt e kb qua zalo được ko a

    Reply
  • 6 March, 2022 at 9:48 pm
    Permalink

    a ơi e vừa xin vào nhóm rồi ạ mong a duyệt

    Reply
  • 7 March, 2022 at 1:41 am
    Permalink

    Em post lỗi của em lên group rồi a, a sửa giúp em với ạ

    Reply

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.