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.
bool isGameOver = false; // Trạng thái thua.
bool isPauseGame = false;// Trạng thái tạm dừng.
* Trạng thái isMain, isHelp, isHighScore:
- Các trạng thái xử lý đơn giản: Load các texture có sẵn hiển thị thông tin cho người chơi. Riệng trạng trái isMain có kết hợp xử lý chuột.
* Trạng thái isNewGame:
Đây là trạng thái chính của chương trình, xử lý màn hình chơi chính. Các thao tác chính nằm trong hàm void drawInGame() gồm các chức năng:
- Vẽ giao diện chơi: Load chữ(tên, điểm số, cấp độ), texture, … .
- Dựa vào các biến trạng thái hiển thị trạng thái của cage (góc nhìn, các khối shape trước đó,…), shape (Khối shape hiện tại và tiếp theo), tạo bóng.
- Thay đổi các biến trạng thái để chuyển sự kiện như: isGameOver, isPauseGame.
* Trạng thái isUpdateHighScore:
- Xử lý khi đang trong trạng thái ghi lại điểm cao của người chơi. Mặc định chương trình chỉ lưu 5 người điểm cao nhất.
* Trạng thái isGameOver, isPauseGame:
- Các trạng thái khi chơi tương ứng: Đang thua hay đang tạm dừng.
3.2. Xử lý chuột, bàn phím:
- Xử lý chuột, bàn phím dựa vào sự hỗ trợ của GLUT:
// Keyboard
glutKeyboardFunc(processNormalKeys);
glutSpecialFunc(processSpecialKeys);
// Mouse
glutMouseFunc(mouseClick);
glutPassiveMotionFunc(mouseMotion);
- Các phím được xử lý trong trạng thái isNewGame:
- Phím A, Q: Quay theo trục Ox, phím S, W: Quay theo trục Oy, phím D, E: Quay theo trục Oz.
- Phím UP, DOWN, LEFT, RIGHT: di chuyển theo các hướng.
- Phím P: Tạm dừng trò chơi, phím ESC: Quay về màn hình chính.
- Các phím đặc biệt: F3 (Bật, tắt âm thanh), F2 (Reset trò chơi).
3.3. Một số thao tác khác:
* Xử lý ánh sáng, sử dụng các texture:
- Xử lý ánh sáng: Sử dụng chiếu sáng của OpenGL với GL_LIGHT0, dùng các thông số:
GLfloat ambientLight[] = { 0.2f, 0.2f, 0.2f, 1.0f };
GLfloat diffuseLight[] = { 0.8f, 0.8f, 0.8, 1.0f };
GLfloat specularLight[] = { 0.5f, 0.5f, 0.5f, 1.0f };
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
* Xử lý âm thanh:
Sử dụng hàm xử lý âm thanh của C++:
BOOL PlaySound(
LPCTSTR pszSound,
HMODULE hmod,
DWORD fdwSound
);
Với các cờ trạng thái: SND_ASYNC (không đồng bộ) và SND_SYNC (đồng bộ).
CHƯƠNG IV
HOÀN THIỆN CHƯƠNG TRÌNH
Kết quả thu được sau khi hoàn thiện chương trình.
1. Giao diện chính.
Giao diện chính của trò chơi gồm liên kết đến 4 chức năng của chương trình: Trò chơi mới, xem điểm cao, hướng dẫn và thoát.
Giao diện chính của chương trình.
2. Giao diện “Trò chơi mới”.
2.1. Giao diện chơi cơ bản.
Giao diện chơi cơ bản gồm có thể hiện của các lớp đã xây dựng: Block, Cage, Shape, logo, thông tin màn chơi hiện tại: Điểm số, số dòng đã ăn được, shape tiếp theo, … .
Màn hình chơi cơ bản.
2.2. Các cấp độ của trò chơi.
Trò chơi gồm có nhiều cấp độ, mỗi cấp độ có một hình đại diện khác nhau (Có 9 hình đại diện).
Cấp độ 9 của trò chơi.
3. Giao diện “Điểm cao” và “Cao thủ mới”.
3.1. Giao diện “Điểm cao”.
Giao diện điểm cao hiển thị top 5 cao thủ của trò chơi, được liên kết từ giao diện chính.
Giao diện “Xếp hạng”.
3.2. Giao diện “Cao thủ mới”.
Giao diện cao thủ mới xuất hiện khi người chơi có điểm đạt top sau khi thua. Ghi nhận điểm số, tên đại diện và lưu lại để hiển thị khi xem giao diện điểm cao.
Giao diện “Cao thủ mới”.
4. Giao diện “Hướng dẫn”.
Giao diện cung cấp thông tin về cách phím xử lý thao tác khi chơi, thông tin người lập trình.
Giao diện “Hướng dẫn”
5. Các chức năng bổ sung.
Các tính năng thêm của chương trình: Pause game, âm thanh,…
Pause game
KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN
1. Kết luận.
Đồ án đã xây dựng ở mức cơ bản về trò chơi xếp hình 3D (Tetris 3D). Nhóm đã tìm hiểu và ứng dụng phần lớn các hàm cơ bản của OpenGL trong môn học đồ hoạ máy tính để xây dựng chương trình, tiếp cận ở bước đầu về lập trình đồ hoạ 3D. Ứng dụng OpenGL với sự hỗ trợ của GLUT cho thấy được khả năng hỗ trợ lập trình sử dụng đồ hoạ, nhất là đồ hoạ 3D của OpenGL.
2. Hướng phát triển.
Có thể tiếp tục phát triển dựa trên chương trình hiện tại cả về kỹ thuật và gamePlay.
* Về mặt kỹ thuật lập trình:
- Tìm hiểu và ứng dụng OpenAL hoặc các thư viện tích hợp âm thanh dùng chung với OpenGL thay cho sử dụng hàm cơ bản PlaySound trong C++ như hiện tại.
- Lập trình trên các nền tảng khác.
* Về mặt gamePlay:
- Mở rộng các màn chơi như hiện tại: Tăng cấp độ, mở rộng cage.
- Xây dựng hệ thống các Item mở rộng hỗ trợ cho người chơi, thay đổi so vơi cách chơi truyền thống.
PHỤ LỤC
Phụ lục 1. Các cấp độ của trò chơi.
Cách tính điểm:
- 1 Line = 100 điểm * cấp độ.
- 2 Line liên tiếp = 300 điểm * cấp độ.
- 3 Line liên tiếp = 500 điểm * cấp độ.
- 4 Line liên tiếp = 800 điểm * cấp độ.
Cách tính cấp độ: Mỗi 5 Line sẽ lên một cấp.
Cách tính thời gian:
- Cấp độ 1: 5 giây.
- Mỗi cấp độ tiếp theo: Trừ 0.2 giây.
- Tối thiều: 0.6 giây
Phụ lục 2. Danh mục âm thanh được sử dụng.
Bảng P2. Âm thanh được sử dụng.
STT |
Tên file |
Thời gian phát |
Sự kiện phát |
1 |
backMusic.wav | 01 phút 30 giây | Nhạc nền |
2 |
highScoreMusic.wav | 00 phút 02 giây | Nhạc ghi điểm mới |
3 |
gameOverMusic.wav | 00 phút 03 giây | Nhạc thua |
4 |
goalMusic.wav | 00 phút 01 giây | Nhạc ăn điểm |
5 |
clickMusic.wav | 00 phút 01 giây | Nhạc click chuột |
THAM KHẢO
[1] Andreas Lagotzki, Nehe’s OpenGL Tutorials, 2004.
[2] OpenGl and GLUT: http://www.zeuscmd.com,
[3] PlaySound function: http://msdn.microsoft.com,
[4] Tetris: http://en.wikipedia.org/wiki/Tetris,
[5] Tetris game: http://www.codeproject.com,
Link download demo:
http://goo.gl/IxAF00
2014-01-09 20:13:09
Nguồn: http://nguyenhaiblog.wordpress.com/2014/01/10/do-an-do-hoa-may-tinh-tetris-3d/