Đăng ký
Cộng đồng phát triển game Việt - kết nối đam mê !

bởi

bài trước, chúng ta đã tạo ra một game Rắn săn mồi với những thành phần cơ bản nhất, nhưng vẫn đang ở dạng "thô" với giao diện text-based trên nền DOS không có gì nổi bật. Hôm nay chúng ta sẽ cài đặt một phiên bản đồ họa dựa trên cơ sở phiên bản text-based đã thực hiện ở phần trước.



Bạn có thể lựa chọn bất kì một thư viện hoặc engine đồ họa nào bạn thích, ở bài hướng dẫn này, nhằm mục đích hỗ trợ các bạn dễ hình dung ra phương pháp chuyển thể sang đồ họa,mình xây dựng sẵn một project mẫu sử dụng OpenGL kèm theo thư viện GLUT, cung cấp một số hàm vẽ hình cơ bản. 


Các bạn có thể tải về project mẫu tại đây: https://www.box.com/s/5dd42e90203bd41d1f63  


Mình sẽ giải thích sơ qua về "framework" này . Nó cung cấp sẵn một số hàm dùng để vẽ các hình cơ bản như:


  • Begin() / End(): Bắt đầu và kết thúc một khối lệnh vẽ hình
  • SetColor(R, G, B): Thiết lập màu chữ, màu nét, màu tô
  • DrawPoint(x, y): Vẽ một điểm lên màn hình
  • DrawLine(x1, y1, x2, y2): Vẽ một đoạn thẳng lên màn hình
  • FillRect(x1, y1, x2, y2): Vẽ một hình chữ nhật đặc
  • DrawRect(x1, y1, x2, y2): Vẽ một hình chữ nhật rỗng
  • FillCircle(x, y, radius): Vẽ một hình tròn đặc
  • DrawCircle(x, y, radius): Vẽ một hình tròn rỗng
  • SetFont(...): Thiết lập font chữ (dùng font có sẵn của GLUT hoặc tự load font)
  • DrawString(x, y, str): In một đoạn text lên màn hình

"Framework" cũng cung cấp cho bạn chức năng State Manager, có thể hiểu là quản lý màn hình game. Ví dụ trong một game chúng ta có 3 màn hình, 1 là menu, 2 là màn hình in-game và 3 là màn hình hiển thị điểm khi gameover, chúng ta gọi 3 màn hình này là 3 state. Mỗi state có cấu trúc như sau:


1
2
3
4
5
6
7
8
9
class GameObject
{
public:
    virtual void init(){}
    virtual void loop(int value){}
    virtual void render(){}
    virtual void key(unsigned char k, int x, int y){}
    virtual void key(int k, int x, int y){}
};

Thực hiện việc chuyển đổi qua lại giữa các state thông qua lệnh game_change_state.


Để xử lý sự kiện nhấn phím, chúng ta có 2 hàm key với 2 tham số khác nhau, 1 dùng để xử lý các phím đặc biệt như các phím mũi tên, 1 để xử lý các phím còn lại (hơi rắc rối, tại GLUT nó tách ra như thế).


Sau đây là cấu trúc đầy đủ của một game state:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class MainGame:public GameObject
{
    void init() {
        // initialize
        SetColor(1, 1, 1);
    }
    void loop() {
        // main logic loop
    }
    void render() {
        // render loop
        Begin();
        DrawString(10, 20, "Simpl Game Prototype Kit");
        End();
    }
    void key(int k, int x, int y) {
        // for process special keys like arrows keys,...
    }
    void key(unsigned char k, int x, int y) {
        // process all others keys here
    }
};

Và ở hàm main, chúng ta chỉ việc khởi tạo đối tượng MainGame và gọi hàm khởi tạo game


1
2
gameObject = new MainGame();
game_init(argc,argv);

Để quy định kích thước cửa sổ game, chúng ta định nghĩa 2 thông số WIDTH và HEIGHT


1
2
#define WIDTH 640
#define HEIGHT 480

Trên đây là một số thông tin cơ bản về bộ "framework" phục vụ cho loạt bài viết này (và cả các bài viết hướng dẫn làm game về sau, mình sẽ bỏ qua phần xây dựng trên text-based mà xây dựng luôn phiên bản đồ họa).



Ở bài viết tiếp theo chúng ta sẽ tiến hành chuyển đổi game Rắn săn mồi xây dựng ở phần trước thành giao diện đồ họa.

Chủ đề: snake, c++, game, OpenGL, GLUT
Nguyễn Thành Đạt
ui.anh cứ viết tiếp đi em sẽ ủng hộ hết mình
  • tháng 7 14, 2012
  • ·
  • Thích
  • ·
Huy Trần
hehe
  • tháng 7 14, 2012
  • ·
  • Thích
  • ·
Nguyễn Tài Hải
Nhìn cấu trúc đơn giản. Những gì đơn giản thường hiệu quả cao.
  • tháng 7 14, 2012
  • ·
  • Thích
  • ·
Lê Nguyên Dũng
code trên linux luôn
anh thích anh thích
  • tháng 7 14, 2012
  • ·
  • Thích
  • ·
Huy Trần
à há, anh còi, giờ chuyển qua mần game rồi à
  • tháng 7 15, 2012
  • ·
  • Thích
  • ·
Nguyễn Thành Đạt
sao vẫn chưa có bài tiếp hả anh?
  • tháng 7 20, 2012
  • ·
  • Thích
  • ·
Huy Trần
dạo này anh hơi bận, nhưng sẽ xong phần tiếp theo sớm thôi, em cứ bình tĩnh
  • tháng 7 20, 2012
  • ·
  • Thích
  • ·
Nguyễn Thành Đạt
vâng,khi nào rảnh anh viết tiếp nha ,em theo cái này từ part 1 rồi
  • tháng 7 20, 2012
  • ·
  • Thích
  • ·
Spem Lucis
Anh ơi, mong anh viết tiếp phần 4 nhé ! Hay lắm anh ạ.
  • tháng 11 24, 2012
  • ·
  • Thích
  • ·
tran thu
A ơi bao giờ thì lại có phần 4 nữa hả a .
  • tháng 1 24, 2013
  • ·
  • Thích
  • ·
Captcha Challenge