7/11/16

Lâp trình OpenGLES - Phần 2

Ở phần trước mình đã hướng dẩn các bạn tạo và cấu hình một project opengles, các bạn có thể đọc ở đây. Phần này mình sẽ hướng dẩn cách tạo ra cửa sổ để có thể vẽ lên đó vì đơn giản là ta không thể vẽ lên trên console rồi. Phần này không được liệt vô "core" của game vì việc thực thi Window Surface còn tùy thuộc vào từng nền tảng mà game đang chạy trên đó. Ngoài việc tạo cửa sổ mình sẽ giới thiệu qua về một số sự kiện quan trọng trong game mà bạn cần biết để xử lý thích hợp.

Tạo Window Surface

Đây là nơi mà chúng ta sẽ vẻ lên, thực ra thì phần này chỉ dùng để test vì khi chúng ta port qua smartphone thì nó không cần thiết. Phần này sẽ phụ thuộc vào từng nền tảng, ví dụ với win32 thì ta sẽ sử dụng các hàm tạo cửa sổ như RegisterClass, CreateWindow...để tạo ra cửa sổ còn với android thì ta sẽ dùng activity...
Đây là cửa sổ mà chúng ta sẽ tạo, bạn có thể cài đặt kích thước cửa sổ sao cho phù hợp nhất với game. Dưới đây là đoạn code thực thi một số hàm chính trong Window Surface cho win32, một số hàm hổ trợ khác mình không show ra ở đây vì sẽ khá dài. Nếu bạn muốn tìm hiểu thêm có thể xem trong project ở cuối bài viết này.

Nhiệm vụ của nó là giúp ta tạo ra một cửa sổ như hình trên và cấu hình với opengl cho phép ta vẽ vời lên trên cửa sổ đó. Ngoài ra nó còn giúp quản lý các sự kiện của hệ thống như chuột, bàn phím và 4 sự kiện đặt biệt là Init, Destroy, Draw, Update.

Các sự kiện trong game

Các sự kiến chuột và phím sẽ được gửi đến chương trình của ta khi người dùng nhấn một phím hoặc di chuyển, click chuột... Ngoài ra 4 sự kiện đặt biệt mình đề cập bên trên có chức năng như sau:
  • Init: Sự kiện này sẽ xảy ra một lần duy nhất lúc game/chương trình bắt đầu, lúc này ta cần thiết đặt hoặc nạp dữ liệu cho game.
  • Destroy: Khi game kết thúc và cửa sổ đóng thì nó sẽ xảy ra, lúc này ta cần thu dọn "chiến trường". Mọi tài nguyên cần được thu hồi và thông tin game nên được lưu lại cho lần chơi sau.
  • Draw: Sự kiện này được gọi liên tục, bạn cần vẽ các nhân vật hoặc khung cảnh...lên game trong sự kiện này.
  • Update: Như Draw, sự kiện này cũng được gọi liên tục nhưng thay vì để vẽ vời thì nó lại dùng để kiểm tra và xử lý logic, va chạm, di chuyển, hiệu ứng...từ đây.
Để sử dụng, trong hàm main bạn cần định khai báo header của WinSurface và làm theo 3 bước như sau:
  1. Khởi tạo cửa sổ bằng hàm InitWindow với 2 đối số là chiều rộng và chiều cao.
  2. Đăng ký các sự kiện, các hàm đã được đăng ký sẽ tự động được gọi khi có sự kiện thích hợp xảy ra.
  3. Khởi chạy message queue của cửa sổ bằng cách gọi hàm WinLoop. Sau khi hàm này được gọi thì ta không cần quan tâm đến WinSurface nữa, mọi việc ta cần làm là xử lý bên trong các hàm đã đăng ký ở step 2.
Đây là đoạn code mẫu để sử dụng Window Surface trong hàm main:

Nhờ các sự kiện này mà ta xác định được lúc nào cần nạp dữ liệu game, lúc nào cần vẽ, lúc nào cần xử lý di chuyển va chạm...Window Surface sẽ được thực thi khác nhau tùy vào từng nền tảng mà game chạy nhưng cấu trúc các sự kiện vẩn giống nhau đảm bảo sự thống nhất của game trên các nền tảng khác nhau.

Đây là source code của phần này: https://github.com/sontx/opengles/tree/day2

0 nhận xét :

Post a Comment