XÂY DỰNG CHƯƠNG TRÌNH TRÒ CHƠI
XẾP HÌNH 3D (TETRIS 3D) BẰNG OPENGL
Trích:
Báo cáo môn Đồ hoạ Máy tính
Nguyễn Trí Hải, MSSV: 11520094
Nguyễn Hoàng Nghĩa, MSSV: 11520603
ĐẠI HỌC QUỐC GIA TP. HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
KHOA KHOA HỌC MÁY TÍNH
OPENGL VÀ TRÒ CHƠI XẾP HÌNH 3D (TETRIS 3D)
1. OpenGL.
1.1. OpenGL và ứng dụng.
“OpenGL là một thư viện mã nguồn mở về các thủ tục đã được chuẩn hoá đối với các tính năng ba chiều, mỗi tính năng lại bao gồm các phương trình toán học và những phép tính phức tạp.
OpenGL có những thủ tục phục vụ cho các tính năng đồ họa thông thường như: xây dựng các bề mặt ba chiều từ những tam giác cực nhỏ, tạo cho bề mặt một hình nền hay những cạnh trơn nhẵn. Thay vì phải viết những đoạn mã riêng hay tạo lại và thay đổi đặc tả của các phép tính quan trọng mỗi khi cần đến những tính năng như vậy, các nhà phát triển giờ đây chỉ cần gọi thủ tục có sẵn trong OpenGL.”
Computerworld
OpenGL được thiết kế nhằm thỏa mãn mục đích chính sau:
- Che giấu sự tương tác phức tạp với các bộ máy xúc tiến 3 chiều bằng cách đưa ra một giao diện lập trình thống nhất.
- Che giấu các sự khác biệt giữa các phần cứng 3 chiều bằng cách bắt buộc các phần cứng tương thích OpenGL phải hỗ trợ tất cả các chức năng của giao diện OpenGL. Nếu cần, các chức năng chưa được hỗ trợ đầy đủ bởi phần cứng có thể được hỗ trợ bằng phần mềm.
Một số trò chơi được viết với OpenGL: America’s Army, Call of Duty, City of Heroes, City of Villains.
1.2. Thư viện GLUT.
GLUT (OpenGL Utility Toolkit) là thư viện quản lí cửa sổ, các thao tác nhập xuất như bàn phím, chuột, menu đơn. Cũng như các API liên quan tới việc giao tiếp của người dùng với OpenGL. Nhờ đó giúp người lập trình đễ dàng hơn khi tiếp cận OpenGL.
2. Trò chơi xếp hình 3D (Tetris 3D).
2.1. Trò chơi xếp hình (Tetris).
a) Giới thiệu:
Tetris (tiếng Nga: Тетрис) là một trò chơi điện tử đầu tiên được thiết kế và phát triển bởi Alexey Pajitnov.
Một trong những trò chơi xếp hình (Tetris) đầu tiên.
Trò chơi này (hay một biến thể của nó) được bán cho hầu hết mọi máy trò chơi điện tử và hệ điều hành máy tính, cũng như trong các máy tính đồ họa, điện thoại di động, máy nghe nhạc di động.
Phiên bản đầu tiên của trò xếp hình được xây dựng trên không gian 2D. Trò chơi được xây dựng bởi các tetrimino có dạng gồm 4 khối vuông xếp cạnh nhau. Có 7 dạng tetromino khác nhau.
Các dạng tetromino.
b) Giao diện trò chơi:
Một khối tetromino ngẫu nhiên sẽ rơi từ trên xuống trong một vùng hình chữ nhật đứng (vùng chơi). Mục tiêu của trò chơi là thao tác các khối tetromino này trước khi nó rơi xuống đáy cùa vùng chơi, sao cho có thể tạo được một dòng ngang của vùng chơi được lấp bởi các tetromino. Các thao tác có thể được thực hiện là: Di chuyển sang 2 bên trong vùng chơi và xoay các khối 1 góc 90o. Sau khi một dòng ngang được lấp nó sẽ được xoá, đồng thời các khối vuông thuộc các tetromino trước đó đã rơi phía trên dòng đó sẽ rơi xuống một dòng (thay cho dòng đã xoá). Khi mà một số lượng dòng nhất định được xoá, trò chơi sẽ tăng cấp độ: Các khối tetromino sẽ rơi nhanh hơn.
Trò chơi kết thúc khi các khối tetromino lấp cao đến trên cùng của hình chư nhật, khi đó không có khối tetromino nào có thể rơi xuống được nữa. Một cách khác để kết thúc trò chơi khi vượt qua giới hạn của trò chơi (Cấp độ, điểm số).
Một số phiên bản sau này có mở rộng thêm về cách chơi nhưng cơ bản vẫn xoay quanh cách chơi ban đầu.
2.2. Trò chơi xếp hình 3D( Tetris).
a) Giới thiệu:
Trò chơi xếp hình 3D (Tetris3D).
Một trong các phiên bản mở rộng của trò chơi xếp hình truyền thống (Tetris) là trò chơi xếp hình 3D (Tetris 3D). Với khả năng tương tác 3 chiều, người chơi sẽ phải dùng nhiều khả năng tưởng tưởng tượng và xử lý hơn với phiên bản truyền thống.
b) Giao diện trò chơi.
Với giao diện và các chơi tương tự như với cách chơi truyền thống, các đối tượng của trò chơi sẽ mở rộng về không gian 3 chiều.
Vùng chơi thay đổi thành một khối hình hộp chữ nhật đứng (cage). Các tetromino mở rộng (gọi là các shape) được xây dựng bởi các khối lập phương (các block). Các shape cũng được tạo bởi 4 block xếp cạnh nhau theo các chiều. Mục tiêu của trò chơi là lấp đầy một mặt phẳng ngang cao 1 block thuộc vùng chơi. Các thao tác với shape được chấp nhận là: Xoay 90o theo cả 3 chiều (3 trục Ox, Oy, Oz trong hệ trục Oxyz) và di chuyển theo 4 hướng của mặt phẳng ngang.
Trò chơi kết thúc khi các khối shape lấp cao đến trên cùng của cage, lúc đó không còn khối shape mới nào có thể rơi xuống được.
c) Các chương trình đã xây dựng.
Hiện nay có các website cung cấp chơi trực tuyến cũng như bản cài đặt cho dạng trò chơi xếp hình 3D, cũng như các cách chơi khác cho phiên bản mở rộng 3D.
Một số trò chơi xếp hình 3D hiện nay.
3. Kết chương.
Trò chơi xếp hình (Tetris) đã xuất hiện từ vài chục năm về trước nhưng hiện tại vẫn còn rất nhiều người chơi yêu thích và xây dựng lại trò chơi này. Với phiên bản mở rộng 3D sẽ mang đến nhiều thử thách mới cũng như nâng cao khả năng tương tác 3 chiều của chương trình với người chơi. Nhiều trường hợp xử lý 3 chiều và tương tác, việc xây dựng lại phiên bản trò chơi này giúp tăng khả năng tiếp cận và tìm hiểu về lập trình đồ hoạ, đặc biệt là đồ hoạ 3 chiều.
XÂY DỰNG CHƯƠNG TRÌNH TRÒ CHƠI
XẾP HÌNH 3D (TETRIS 3D) BẰNG OPENGL
1. Mô tả chương trình xây dựng.
Đồ án xây dựng chương trình trò chơi xếp hình 3D (Tetris 3D) bằng OpenGL sử dụng gameplay mở rộng của bản trò chơi xếp hình truyền thống. Gồm các chức năng cơ bản của một trò chơi: người chơi tương tác với trò chơi thông qua bàn phím và chuột, hệ thống thang điểm và cấp độ, lưu thành tích người chơi, âm thanh.
2. Xây dựng các lớp đối tượng.
2.1. Các lớp đối tượng.
- Block: Mô tả một khối hình lập phương với cạnh là 1 đơn vị cao. Đây là thành phần cơ bản nhất tạo nên cage và các shape.
- Cage: Mô tả vùng chơi là một khối hình hộp chữ nhật đứng.
- Shape: Mô tả các khối hình chính của trò chơi. Mỗi shape Gồm 4 block xếp cạnh nhau trên không gian 3 chiều.
2.2. Các thuộc tính và phương thức.
Bảng 3.1 Thuộc tính và phương thức của lớp Block
|
Mô tả |
Thuộc tính |
|
int x;int y;
int z; |
- Mô tả vị trí của block |
float red;float green;
float blue; |
- Mô tả màu của block theo hệ màu RGB. |
bool exists; | - Thuộc tích của 1 block là hiện (true) hay ẩn (false). |
Phương thức |
|
Block(); |
Bảng 3.2 Thuộc tính và phương thức của lớp Cage
|
Mô tả |
Thuộc tính |
|
Block gameCage[][][]; | - Cage là một mảng 3 chiều các block (Bao gồm các block ẩn và các block từ các khối shape trước). |
int height;int width;
int depth; |
- Các biến định nghĩa chiều cao, chiều rộng và chiều sâu của cage. |
Phương thức |
|
Cage();void clearCage(); | - Phương thức khởi tạo mặc định cage có kích thước 4x4x24.- Chuyển các block hiện trên cage thành ẩn. |
Bảng 3.3 Thuộc tính và phương thức của lớp Shape
|
Mô tả |
Thuộc tính |
|
Block blocks[4];int type; | - Mỗi shape tạo thành từ 4 block- Kiểu (hình dạng) của shape |
Phương thức |
|
Shape(); | - Phương thức khởi tạo, tuỳ theo thuộc tính type sẽ khởi tạo hình dạng shape tương ứng. |
bool RotateCollision(Block pieces[]);bool DetectCollision(); | - Kiểm tra điều kiện xoay (Có va chạm với thành cage hay không).- Kiểm tra va chạm đáy |
bool DropOne();bool ShadowDropOne(); | - Kiểm tra va chạm và cho shape rơi xuống 1 đơn vị.- Bóng của shape khi rơi xuống đáy |
void RotateXCW();void RotateXCCW();
void RotateYCW(); void RotateYCCW(); void RotateZCW(); void RotateZCCW(); |
- Xoay theo các trục Ox, Oy, Oz (hệ trục Oxyz).CW: Quay cùng chiều kim đồng hồ.
CCW: Quay ngược chiều kim đồng hồ. |
void MoveForward();void MoveBack();
void MoveRight(); void MoveLeft(); |
- Di chuyển trước, sau, trái phải. |
3. Các thao tác lập trình chính.
Các thao tác lập trình chính trong hàm Main sử dụng lập trình với OpenGL và sự hỗ trợ của GLUT.
3.1.Các trạng thái:
Chương trình sử dụng các biến kiểu bool đánh dấu các trạng thái hiện hành của chương trình (Có thể có nhiều trạng thái cùng lúc). Tương ứng với mỗi trạng thái sẽ xử lý riêng biệt khi gọi hàm vẽ (display – thông qua glutDisplayFunc()) Trạng thái được cập nhật theo thời gian (glutTimerFunc) và thao tác của người dùng. Trong đó có 7 trạng thái:
bool isMain = true; // Trạng thái màn hình chính.
bool isHelp = false; // Trạng thái màn hình trợ giúp.
bool isHighScore = false;// Trạng thái màn hình xem điểm cao.
bool isNewGame = false; // Trạng thái màn hình chơi chính.
bool isUpdateHighScore = false; // Trạng thái màn hình chính.