Để vẽ một đối tượng 3D, chúng ta sử dụng phép chiếu phối cảnh. Một đối tượng 3D được xác định bởi các thuộc tính:
- Vị trí, dữ liệu, màu sắc, UV của từng đỉnh thuộc đối tượng. - Quan hệ giữa các đỉnh thuộc đối tượng.
- Texture: hình ảnh được áp lên đối tượng đó.
Trong chương trình, vị trí, dữ liệu, màu sắc, uv của đối tượng được lưu dưới dạng file .OBJ có định dạng như sau:
v $x $y $z ; đỉnh có tọa độ x y z vt $u $v ; tọa độ uv của đối tượng. vn $x $y $z ; vec-tơ chính phương.
f $i/$j/$k $i’/$j’/$k’ $i’’/$j’’/$k’’; Xác định một mặt tam giác của đối tượng, trong đó: $i: vị trí của tọa độ, $j: vị trí của uv, $k: vị trí của vector chính phương tại đỉnh đó,
Các thông tin này được nén lại vào một file nhị phân chứa nhiều đối tượng cùng lúc mục đích: dễ dàng tải và thực hiện trong chương trình.
SVTH: Nhữ Thị Trà My- 08CNTT02 Trang 64
Lúc vẽ, chúng ta truyền các tham số này vào một shader trong OPENGL ES và bộ xử lí đồ họa sẽ vẽ đối tượng này lên màn hình.
driver->SetArray(ATTRIB_VERTEX, 3, meshes[i].vertices); driver->SetArray(ATTRIB_TEX_COORD, 2, meshes[i].texCoords); //driver->SetArray(ATTRIB_NORMAL, 3, meshes[i].normals); driver->SetTexture2D(0, manager- >GetTexture(meshes[i].textureId)); driver->DrawArray(TRIANGLES, meshes[i].nVertices); 4.4.3. Vẽ một đối tượng 2D
Để vẽ một đối tượng 2D, chúng ta sử dụng phép chiếu vuông góc. Tương tự như đối tượng 3D, chúng ta sẽ lưu thông tin của các đối tượng 2D vào một file nhị phân, sau đó tải vào bộ nhớ và vẽ ra.
4.5. Nhập
Ta sử dụng hàm PointerEvent trong đối tượng Application để nhận và xử lí các sự kiện nhập từ cảm ứng / chuột. Ở trên windows, ta xử lí như sau:
case WM_LBUTTONDOWN: mouseDown = true; bt::core::Application::GetApplication() ->PointerEvent(bt::core::POINTER_START, x, y); break; case WM_MOUSEMOVE: if (mouseDown) { bt::core::Application::GetApplication() ->PointerEvent(bt::core::POINTER_MOVED, x, y); }; break; case WM_LBUTTONUP: mouseDown = false; bt::core::Application::GetApplication() ->PointerEvent(bt::core::POINTER_ENDED, x, y); break;
Ở trong trò chơi của mình, chúng ta chỉ cần cài đặt và xử lí hàm PointerEvent mà không cần phải biết thật sự cảm ứng/chuột được nhận như thế nào.
SVTH: Nhữ Thị Trà My- 08CNTT02 Trang 65
if (pointerState == POINTER_START &&
PointerInRect(m_iLastPointerX, m_iLastPointerY, SCREEN_W - 100, SCREEN_H - 100, 100, 100)) { SwitchState(MAIN_MENU); } 4.6. Âm thanh
Ta đưa ra hai phương thức để chơi âm thanh: // Play Sound
void PlaySound(int id, int loop = 1);
// Stop all sound
void StopSound();
Tuy nhiên, trong windows, chúng ta không xử lí âm thanh – do không cần thiết và không có đủ thời gian để thực hiện.
4.7. Giao diện ứng dụng
Ứng dụng của chúng ta xây dựng là ứng dụng console: để có giao diện giúp chúng ta debug dễ dàng. Đầu vào của ứng dụng là hàm main() -> chúng ta thực hiện các việc sau:
- Khởi tạo ứng dụng.
- Tạo cửa sổ và khởi tạo đối tượng OpenGL ES 2.0. - Bắt đầu trò chơi.
- Gọi vòng lặp trò chơi.
app->StartApp();
while (!exit)
{
// Update and Paint
app->Update(); app->Render();
eglSwapBuffers(context->display, context->surface); };
SVTH: Nhữ Thị Trà My- 08CNTT02 Trang 66 4.8. Giao diện xuất nhập tập tin
Việc xuất nhập tập tin trong windows tương đối đơn giản. Chúng ta chỉ cần sử dụng các phương thức cơ bản của thư viện <stdio.h> để thực hiện.
// Open a file in Windows 32bits so easily
FILE* Win32FileSystem::OpenFile(const char *filename, const char *mode)
{
FILE *file;
fopen_s(&file, filename, mode);
return file;
SVTH: Nhữ Thị Trà My- 08CNTT02 Trang 67
CHƯƠNG 5 QUY TRÌNH CHUYỂN TRÒ CHƠI
Sau khi thực hiện cài đặt các bước trên, ta có được ứng dụng trò chơi hoàn chỉnh trên windows. Tuy nhiên, mục tiêu của chúng ta là khiến chương trình đó chạy được trên các thiết bị Android. Để làm được điều đó, chúng ta cần phải tiến hành chuyển sang Android OS. Để làm được điều đó ta cần phải cài đặt các thành phần khác nhau trên hệ thống này.
5.1. Chuyển sang Android
5.1.1 Cài đặt phần mềm
Để tạo môi trường phát triển trên Android ta cần cài đặt các công cụ sau: - Java SDK: yêu cầu để chạy ứng dụng Java.
- Cygwin 1.7 trở về sau: dùng để giả lập môi trường phát triển linux, gcc và chạy NDK. - Android SDK: cần thiết để biên dịch, đóng gói ứng dụng Android. Ngoài ra Android SDK
còn cung cấp cho chúng ta các công cụ để tương tác với thiết bị di động, và bộ giả lập. - Android NDK: Dùng để biên dịch mã nguồn C ra thư viện từ đó gọi từ java.
5.1.2. Hoạt động của JNI và quy trình biên dịch
Như chúng ta đều biết, ứng dụng android chạy trên nền chính là Java. Muốn chạy C/C++ ta có hai giải pháp:
- Sử dụng JNI: từ android 1.5 trở về sau.
- Sử dụng Native Activity: từ android 2.3 trở về sau.
Native Activity là phương án lựa chọn tốt hơn, bởi vì chương trình sẽ không tốn chi phí giao dịch giữa máy ảo Java và C/C++. Tuy nhiên, tới thời điểm hiện tại, số lượng các thiết bị hổ trợ Android 2.3 tương đối hiếm nên chúng ta sẽ sử dụng giải pháp JNI.
Hoạt động của JNI được mô tả như sau:
- Các phương thức JNI được đánh dấu bằng từ khóa native.
- Các phương thức này được viết bằng C++ và biên dịch ra thư viện liên kết động .so.
- Thư viện liên kết động được Load lên trong chương trình Java bằng lời gọi
SVTH: Nhữ Thị Trà My- 08CNTT02 Trang 68
- Khi trong chương trình Java có lời gọi tới hàm native, máy ảo Java sẽ tìm kiếm trong thư viện động xem hàm này đã được cài đặt chưa, sau đó các đối tượng Java sẽ được chuyển thành C++ để thực hiện lời gọi tới C++.
- Trong C++ cũng cung cấp các thư viện cho phép giao tiếp tới máy ảo và chương trình Java. Quy trình xây dựng một chương trình có sử dụng JNI như sau:
- Khai báo phương thức native ở trong lớp Java.
- Khai báo và cài đặt phương thức này trong C. (Nếu C++ thì phải sử dụng extern “C” để tránh sửa tên trong C++). Quy tắc đặt tên hàm đó như sau:
tengoi_tenlop_tenphuongthuc
- Sau đó dùng NDK để biên dịch mã nguồn C thành thư viện liên kết động và thư viện này được tự động bỏ vào thư mục lib của dự án android.
- Viết chương trình java gọi các hàm native này. - Dùng bộ SDK để biên dịch thành ứng dụng apk.
Do các bước sử dụng NDK để biên dịch được thực hiện trên dấu nhắc lệnh, do đó chúng ta sẽ tạo tập tin lệnh để thực hiện điều này.
5.1.3. Đồ họa
Android hổ trợ OpenGLES 2.0 trong NDK từ phiên bản 2.1 trở về sau. Và trong ví dụ NDK có sẵn ví dụ thực thi với OpenGL ES 2.0 nên ta có thể sử dụng ví dụ này, sau đó thay đổi các thành phần trong đó để tải ứng dụng C++ và chạy lên.
Ngoài ra để biên dịch với OpenGL ES 2.0 thì trong make file của dự án NDK ta phải thêm dòng LOCAL_LDLIBS := -llog -lz -lGLESv2.
SVTH: Nhữ Thị Trà My- 08CNTT02 Trang 69
5.1.4. Âm thanh
NDK không hổ trợ chơi âm thanh cho đến Android phiên bản 2.2 trở về sau. Do đó chúng ta sẽ sử dụng Java để chạy các tập tin âm thanh.
Phần tải các tập tin âm thanh, Play Sound và StopSound được cài đặt trong Java:
Trong C++, ta cài đặt các hàm PlaySound và Stop Sound bằng cách gọi tới hàm PlaySound trong đối tượng Java.
SVTH: Nhữ Thị Trà My- 08CNTT02 Trang 70
5.1.5. Cảm ứng chạm
Trong ứng dụng Android, ta nhận sự kiện cảm ứng chạm thông qua hàm OnTouchEvent.
SVTH: Nhữ Thị Trà My- 08CNTT02 Trang 71
5.1.6. Giao diện ứng dụng
Ứng dụng Java được viết theo Activity. Trong ứng dụng Java, chúng ta tải một
GLSurfaceView để thể hiện giao diện OpenGL ES 2.0. Trong các hàm này, chúng ta thêm các phương thức để gọi chương trình C/C++ của chúng ta từ thư viện native lên và thực hiện.
Các phương thức:
- onSurfaceCreate: được gọi khi đối tượng GLSurfaceView được tạo ra, tại đây ta cần gọi hàm app->Init(), và app->StartGame().
- onDrawFrame: hàm được gọi khi đối tượng được vẽ ra. Tại đây ta cần gọi các hàm app- >Update(), và app->Render.
5.1.7. Xử lí file
Các tập tin trong res/raw sẽ truy cập được từ Android bằng lệnh fdopen(). Tuy nhiên, ta cần phải biết các thông số ID để thực hiện truy xuất này.
Từ Java ta có thể lấy các thông số này và truyền vào C/C++:
Trong C++ ta lưu lại các tham số này.
SVTH: Nhữ Thị Trà My- 08CNTT02 Trang 72
SVTH: Nhữ Thị Trà My- 08CNTT02 Trang 73
CHƯƠNG 6 QUÁ TRÌNH CÀI ĐẶT HỆT THỐNG TRÊN MOBIE
6.1. Cài đặt hệ thống trên Android Có 2 cách để cài đặt Có 2 cách để cài đặt
Dùng Thẻ nhớ
Copy file apk sau khi build ra vào thẻ nhớ của điện thoại.
Sau đó vào điện thoại. Chọn chương trình vừa copy vào thẻ nhở để cài đặt. Dùng câu lệnh
Cắm điện thoại vào máy tính để cho máy tính kết nối với điện thoại Android. Dùng câu lệnh:
adb devices để kiểm tra xem máy tính đã kết nối với điện thoại chưa. Sau khi điện thoại Android đã kết nối với máy tính. Ta dùng lệnh:
Adb install -r <Tên đường dẫn đến file apk> để cài đặt trên điện thoại.
Cách hủy bỏ game đã cài đặt
Chúng ta vào mục setting -> Applications->Manage application. Rồi sau đó chọn vào ứng dụng game mà chúng ta đã cài đặt trên máy. Chọn Unstill để gỡ ứng dụng game đó.
SVTH: Nhữ Thị Trà My- 08CNTT02 Trang 74
CHƯƠNG 7 MỘT SỐ KẾT QUẢ VÀ DEMO CỦA GAME
7.1. Kết quả demo trên Windows
Màn Hình main menu
SVTH: Nhữ Thị Trà My- 08CNTT02 Trang 75
Ở màn hình lúc đang chơi game
SVTH: Nhữ Thị Trà My- 08CNTT02 Trang 76
Lúc người dùng chạm vào trái cây đang chuyển động
SVTH: Nhữ Thị Trà My- 08CNTT02 Trang 77
Màn hình lúc bị Game over
SVTH: Nhữ Thị Trà My- 08CNTT02 Trang 78
Màn hình Highscore
SVTH: Nhữ Thị Trà My- 08CNTT02 Trang 79 7.2. Kết quả demo trên Android (điện thoại Galaxy mini)
Biểu tượng Icon của game
Hình 41. Kết quả demo biểu tượng icon của game trên Android
Màn hình Mainmenu
SVTH: Nhữ Thị Trà My- 08CNTT02 Trang 80
Màn hình Gameplay
Hình 43. Kết quả demo màn hình game play trên Android
Màn hình Higscore
SVTH: Nhữ Thị Trà My- 08CNTT02 Trang 81
Màn hình GameOver
Hình 45. Kết quả demo màn hình GameOver trên Android
Màn hình About
SVTH: Nhữ Thị Trà My- 08CNTT02 Trang 82
CHƯƠNG 8 KẾT LUẬN
8.1. Kết quả đạt được
Tìm hiểu được cách xây dựng một game đa nền tảng, và quả trình chuyển game từ windows sang Android.
Biết được cấu trúc của một game 3D.
Xây dựng thành công một game 3D trên hệ điều hành Windows và ĐTDĐ có HĐH Android với giao diện thân thiện và dễ sử dụng.
8.2. Những vấn đề còn tồn đọng
Các tính năng của game còn khá đơn giản.
8.3. Hướng phát triển của đề tài
Xây dựng thêm các tính năng mới của game : xuất nhập tên người chơi, Tạo thêm các hiệu ứng cho game. Và đặc biệt là phát triển để game có thể chuyển qua Không chỉ có windows, Adroid mà trên còn nhiều hệ điều hành khác nữa.
SVTH: Nhữ Thị Trà My- 08CNTT02 Trang 83
TÀI LIỆU THAM KHẢO
[1] Trang web: http://fly.cc.fer.hr/~unreal/theredbook/ [2] Lê Phong: Hướng dẫn lập trình OpenGL căn bản. [3] Trang web: http://glprogramming.com/red/
[4] Lê Tấn Hùng, Huỳnh Quyết Thắng: kỹ thuật đồ họa. Nhà xuất bản khoa học và kỹ thuật, Hà Nội-2000.
[5] Donald Hearn, M. Pauline Baker: Computer Graphics, Prentice-Hall, Inc., Englewood Cliffs, New Jersey, 1986.
[6] Trang web: http://forums.gamevn.com/archive/index.php/t-43474.html,
www.vietnamandroid.com, …