Quay quanh trục Ox, Oy, Oz
Cách xác định tọa độ theo phép quanh quay một trục
Quay quanh trục Ox:
R (a, x): P -> P’ R (a, x) = {
Px’ = Px
Py’ = Py * Cos (a) – Pz * Sin (a) Pz’ = Py * Sin (a) + Pz * Cos (a) }
SVTH: Nhữ Thị Trà My- 08CNTT02 Trang 30 Hình 12. Phép quay theo trục Ox Quay quanh trục Oy: R (a, y): P -> P’ R (a, y) = { Py’ = Py
Px’ = Py * Cos (a) + Pz * Sin (a) Pz’ = -Px * Sin (a) + Pz * Cos (a) }
Quay quanh trục Oz:
R (a, z): P -> P’ R (a, z) = {
Pz’ = Pz
Px’ = Px * Cos (a) - Py * Sin (a) Py’ = Px * Sin (a) + Py * Cos (a) }
SVTH: Nhữ Thị Trà My- 08CNTT02 Trang 31
Hình 13. Phép quay theo trục Oz
2.2.5. Phép chiếu trong 3D
Giới hạn vùng để vẽ ảnh trên thiết bị 3D: Trái, phải, trên, dưới, gần, xa.
2.2.5.1. Chiếu phối cảnh
Là hình chiếu được xây dựng bằng phép chiếu xuyên tâm.
Đặc điểm của phép chiếu này là tạo cho người xem có cảm giác xa gần giống như nhìn trong thực tế.
Là một cách vẽ trong hội họa, hay tạo hình, dùng để thể hiện các hình ảnh 3 chiều một cách gần đúng trên một bề mặt 2 chiều nhờ vào các quy luật phối cảnh. Các quy luật phối cảnh được xây dựng trên các quy tắc hình học chặt chẽ. Các quy tắc phối cảnh giúp hình ảnh 2 chiều trở thành 3 chiều, khiến chúng được quan sát được trực quan hơn trên tranh vẽ.
Ứng dụng của hình chiều phối cảnh là đi kèm theo các hình chiếu vuông góc trong bản vẽ thiết kế kiến trúc và xây dựng để biễu diễn các công trình có kích thước lớn.
SVTH: Nhữ Thị Trà My- 08CNTT02 Trang 32
Hình 14. Biễu diễn phép chiếu phối cảnh
2.2.5.2. Chiếu trực giao (phép chiếu vuông góc)
Trong phép chiếu này, khoảng cách của vật tới camera không ảnh hưởng tới độ lớn của vật đó khi hiển thị.
Phép chiếu trực giao hay còn được gọi là phép chiếu nhìn từ trên xuống hoặc từ dưới lên. Có 2 phép chiếu khác cũng khá thông dụng là:
Phép nhìn từ trước: Tia chiếu song song với trục x và mặt phẳng quan sát là yz. Phép chiếu này loại bỏ thành phần x của P.
Phép chiếu nhìn từ phía bên cạnh: Tia chiếu song song với trục y và mặt phẳng chiếu này loại bỏ thành phần y của P.
SVTH: Nhữ Thị Trà My- 08CNTT02 Trang 33
Hình 15. Biễu diễn phép chiếu vuông góc
2.2.6. Tọa độ thực đến thiết bị
Tọa độ thực -> tọa độ mắt -> NDC -> Thiết bị
Hình 16. Biễu diễn tọa độ thực đến thiết bị thông qua NDC
NDC
Là thiết bị chuẩn hóa tọa độ. Có hình dạng là một lập phương có tọa độ các điểm cố định. Chỉ có những điểm nằm trong NDC mới được vẽ.
SVTH: Nhữ Thị Trà My- 08CNTT02 Trang 34
Hình 17. Biễu diễn về NDC
Biểu đồ thể hiện sự biến đổi 3 chiều thành thành điểm có tọa độ 2 chiều
SVTH: Nhữ Thị Trà My- 08CNTT02 Trang 35 2.3. Cấu trúc của một game
Các khái niệm trong game
2.3.1. Game Loop (vòng lặp của game)
Là thành phần quan trọng của bất kỳ game nào. Game loop giúp game chạy ổn định hơn không bị ảnh hưởng bởi tác động của người dùng.
Hầu hết các chương trình truyền thống đều đáp ứng thông điệp đưa vào của người dùng . Ví dụ như: word thì định dạng và text theo nhưng gì người dùng nhập vào, nếu người dùng không nhập vào thì nó không làm gì cả. Nhưng đối với một chương trình game thì dù người dùng có nhập vào thông điệp hay không thi nó vẫn thực hiện theo một cấu trúc chương trình có sẵn đây chính là vòng lặp của game.
Một vòng lặp game rất đơn giản nó có thể trông như thế này:
While ( user doesn't exit ) check for user input run AI move enemies resolve collisions draw graphics play sounds end while
Các vòng lặp game có thể thay đổi như sự phát triển của game nhưng hầu hết chúng đều dựa trên ý tưởng cơ bản này.
Vòng lặp game khác nhau tùy thuộc vào nền tảng mà nó phát triển.Vòng lặp game được thực hiên thông qua 2 hàm chính là Update và Paint.
SVTH: Nhữ Thị Trà My- 08CNTT02 Trang 36
2.3.2. Framerate (FPS)
Số lần vẽ khung hình trên một giây. Framerate chậm sẽ làm cho người dùng không có cảm giác thật, ảnh hưởng đến sự tương tác của người dùng với trò chơi.
Các yếu tố làm cho framerate chậm
Hình vẽ có kích thước lớn. Tính toán trong game nhiều. Lỗi của thiết bị.
Cách cải thiện framerate
Tối ưu hóa tính toán và các điều kiện thực hiện trong game: + Sử dụng ít vòng lặp.
+ Dùng phép toán dịch chuyển bit thay cho phép nhân và phép chia. + Khai báo các biến và phương thức ở dạng static.
Caching module của các file ảnh, tối ưu hóa các module dùng để vẽ sao cho số lượng module vẽ ra là ít.
Dùng Bacbuffer: Không vẽ từng sprite ra màn hình mà ta vẽ các sprite lên một ảnh sau đó vẽ ảnh đó ra màn hình.
Bỏ các hiệu ứng không cần thiết. Limit Frame rate
Là sự giới hạn lại số lần vẽ trên một giây của trò chơi. Nhằm mục đích dùng trong những trường hợp ứng dụng có frame rate quá nhanh, sẽ làm cho ứng dụng không ổn định. Ảnh hưởng đến quá trình xử lý, người chơi không chơi kịp và một điều nữa là nó dẫn đến việc nhanh hết pin của thiết bị.
SVTH: Nhữ Thị Trà My- 08CNTT02 Trang 37
2.3.3. Bộ nhớ (memory)
Là kích thước bộ nhớ có thể dùng để chạy chương trình game của thiết bị. Các yếu Tố ảnh hưởng đến bộ nhớ trong game
• File ảnh dùng trong game. • Âm thanh dùng trong game.
• Các file text, mảng chứa text trong game. Tối ưu hóa bộ nhớ
• Đơn giản hóa các frame và hình ảnh động. • Chia ảnh ra thành các module nhỏ.
• Xóa các module của dữ liệu sau khi caching.
• Dùng gói sound có dung lượng nhỏ, Load sound khi chạy sound và giải phóng (free) khi dừng sound.
• Dùng mảng một chiều thay vì dùng mảng 2 chiều.
• Chỉ giữ những đối tượng cần thiết trong bộ nhớ. Để tránh vấn đề phân mảnh bộ nhớ (là các đối tượng thường dùng (fonts, main characters, common interface sprites, … ) ).
• Load khi muốn vẽ và giải phóng khi đi ra khỏi màn hình.
• Tránh phân mảnh bộ nhớ: load đối tượng có kích thước lớn trước. Giữ cho bộ nhớ ổn định. Không load và giải phóng quá nhiều lần.
2.3.4. State
Là các trạng thái của một game. Chúng có liên quan chặt chẽ với nhau.Thông thường một game thường có các trạng thái sau: mainmenu, gamestart, gamewin, gameover, about, highscore, Exit…
SVTH: Nhữ Thị Trà My- 08CNTT02 Trang 38 2.4. Giới thiệu về NDK
Là bộ công cho phép nhúng các mã code lên các ứng dụng android. ứng dụng Android chạy trong máy ảo Dalvik. NDK cho phép chúng ta dùng các ứng dụng viết bằng ngôn ngữ C và C++ lên thiết bị android.
NDK cung cấp một số hỗ trợ sau:
• Một tập hợp các Toos và files build dùng để tạo ra các thư viện mã từ sources C và C++.
• Cách để nhúng các thư viện mã vào một file (.apk) gói ứng dụng mà chúng ta có thể chạy được trên các thiết bị android.
• Tài liệu, ví dụ và một số hướng dẫn.
• Một bộ các thư viện C/C++ được hỗ trợ trong tất cả các phiên bản sau này của hệ điều hành Android, bắt đầu từ Android 1.5. Từ phiên bản 2.3 trở đi, hệ điều hành android còn hỗ trợ them cách viết Activity bằng C/C++.
NDK cung cấp bộ header cho libc ( bột thư viện C ), libm (bột thư viện toán học), openGL ES(thư viện đồ họa 3D), giao diện JNI(là giao diện để liên lạc giữa java và native code), một số thư viện khác, được chứa trong Development Tools.
Khi nào thì Native code
Không phải khi nào NDK cũng đều có lợi với tất cả các ứng dụng. Vì vậy chúng ta cần cân bằng lợi ích với nhược điểm của nó. Đặc biệt trong trường hợp sử dụng native code không làm tăng hiệu suất thực thi mà làm tăng sự phức tạp của ứng dụng. Nói chung chỉ nên sử dụng native code nếu nó là cần thiết đối với ứng dụng của mình. Chứ không phải vì chúng ta thích chương trình trong C/C++.
Frame android cung cấp 2 cách để dùng native code :
Dùng Android framework để viết ứng dụng của mình và dùng JNI để truy cập API được cung cấp bởi Android NDK. Kỹ thuật này cho phép chúng ta tận dụng các tiện ích của
SVTH: Nhữ Thị Trà My- 08CNTT02 Trang 39
Android framework, nhưng vẫn cho phép chúng ta viết native code khi cần thiết. Chúng ta có thể cài ứng dụng sử dụng Native code thông qua JNI trên thiết bị chạy android 1.5 hoặc mới hơn.
Viết một native activity, cho phép chúng ta thực hiện cài đặt vòng đời của ứng dụng android trên native code. Android SDK cung cấp lớp NativeActivity cho phép chúng ta cài đặt vòng đời thông qua các hàm sau (onCreate(), onResume(), ..).
Development tool
NDK gồm một bộ công cụ (compilers, linkers, …) dùng để tạo ra mã nhị phân cho bộ vi xử lý ARM trên hệ điều hành Linux, OS X, và Windows(với Cygwin).
Cung cấp một bộ headers của hệ thống cho các API native chuẩn mà được đảm bảo được hỗ trợ trong tất cả các phiên bản sau này của nền tảng:
• Libc (thư viện C) headers.
• Libm (thư viện toán học) headers. • Giao diện JNI headers.
• Liblog (Android logging) header.
• OpenGL ES 1.1 và OpenGL ES 2.0(thư viện graphics library) headers. • Libjnigraphics (Pixel buffer access) header(for Android 2.2. trở lên). • Thư viện OpenSL ES native audio.
• API cho ứng dụng android.
NDK cũng cung cấp một hệ thống biên dịch giúp chúng ta làm việc hiệu quả với mã nguồn của mình mà không cần điều khiển chi tiết các công cụ/ nền tảng/ CPU/ ABI. Người dùng chỉ cần tạo các file biên dịch đơn giản để mô tả mã nguồn của mình mà trong ứng dụng Android sử dụng. Và hệ thống biên dịch sẽ sử dụng các file này để biên dịch, và tạo ra một thư viện động bỏ trực tiếp vào trong dự án của mình.
SVTH: Nhữ Thị Trà My- 08CNTT02 Trang 40
Hệ thống và phần mềm yêu cầu
• The Android SDK
- Hoàn tất cài đặt một Android SDK (bao gồm tất cả các phụ thuộc). - Phiên bản SDK Android 1.5 trở đi.
• Hệ điều hành hỗ trợ
- Window XP (32-bit) hoặc vista (32- hoặc 64 -bit).
- Linux (32 hoặc 64 bit, thử nghiệm trên Linux Ubuntu Dapper Drake). • Các công cụ Cần Thiết
- Đối với tất cả các nền tảng, bắt buộc GNU Make 3.81 trở lên.
- Đối với Window, bắt buộc Cygwin 1.7 trở lên. NDK không làm việc với Cygwin 1.5. • Nền tảng Android tương thích
Các thư viện native được tạo ra bởi Android NDK chỉ có thể sử dụng trên các thiết bị Android phiên bản 1.5 trở đi. Điều này là do Bộ công cụ và ABI liên quan đến những thay đổi làm cho các thư viện native không tương thích với hình ảnh hệ thống 1.0 và 1.1.
Vì lí do này nên chúng ta nên sử dụng thư viện native được tạo ra với NDK trong ứng dụng mà được triển khai trên các thiết bị chạy trên nền tảng android 1.5 trở đi.
Để đảm bảo tính tương thích, một ứng dụng dùng thư viện native tạo ra với NDK phải khai báo <uses- sdk> phần tử trong file mainfese của nó, với một giá trị thuộc tính của android:minSdkVersion 3 hoặc lớn hơn.
Ví dụ:
<manifest>
SVTH: Nhữ Thị Trà My- 08CNTT02 Trang 41
...
</manifest>
Nếu sử dụng NDK để tạo ra thư viện native có sử dụng OpenGL ES API, thì ứng dụng chứa các thư viện chỉ có thể được triển khai trên các thiết bị chạy tối tiểu là các phiên bản được nêu dưới đây:
OpenGL ES Version Used
Compatible Android Platform(s)
Required uses-sdk Attribute
OpenGL ES 1.1 Android 1.6 and higher
android:minSdkVersion="4"
OpenGL ES 2.0 Android 2.0 and higher
android:minSdkVersion="5"
SVTH: Nhữ Thị Trà My- 08CNTT02 Trang 42
CHƯƠNG 3 PHÂN TÍCH TRÒ CHƠI
3.1. Hệ thống và tính khả chuyển (portability):
3.1.1. C/C++ và thư viện
Để đạt được yêu cầu đặt ra của bài toán, là hệ thống có thể chạy được trên cả hai Hệ điều hành: Windows, Android . Và trong quá trình làm không cần mất nhiều thời gian, chúng ta cần phải phân tích kỹ lưỡng và đề xuất phương án phù hợp để tiến hành đề ra giải pháp và xây dựng bài toán.
Nhận xét:
Cả hai hệ điều hành đều cung cấp môi trường lập trình trên ngôn ngữ ANSI C/C++.
Windows: Hổ trợ sẵn.
Android: JNI từ Android 1.5, Native Activity từ Android 2.3. Cả hai hệ điều hành đều cung cấp thư viện OpenGL ES 2.0.
Android: Từ phiên bản 2.1.
Windows: Thông qua bộ giả lập OpenGL ES 2.0 của PowerVR.
Môi trường C/C++ trên cả hai hệ điều hành tương đối giống nhau. Tuy nhiên số lượng các thư viện hổ trợ khác nhau, do đó chúng ta chỉ sử dụng các thư viện chuẩn mà cả hai đều hỗ trợ.
Có thể dễ dàng chuyển một thư viện C chuẩn lên cả hai hệ điều hành (trong trường hợp ứng dụng này, tôi đã chuyển thành công thư viện LIB PNG – hổ trợ đọc và xử lí tập tin hình ảnh PNG trong C/C++).
SVTH: Nhữ Thị Trà My- 08CNTT02 Trang 43
Do đó, trong quá trình lập trò chơi, chúng ta nên sử dụng hợp lí các công cụ, thư viện, mã nguồn và lập trình một cách tối ưu để có thể sử dụng lại trên cả hai nền tảng khác nhau này.
3.1.2. Phân tích tính khả chuyển (portability) của các thành phần trong trò chơi
Thông thường, trong một trò chơi (tức là một ứng dụng) sẽ có các thành phần như sau: - Vòng lặp trò chơi: là trung tâm của trò chơi, quản lí vòng đời, trạng thái của trò chơi. - Logic: là phần xử lí của trò chơi, xử lí thuật toán, trí thông minh nhân tạo, tương tác với người chơi.
- Đồ Họa: là phần thể hiện của trò chơi.
- Âm thanh: là phần không thể thiếu của trò chơi, giúp trò chơi trở nên sinh động hơn. - Nhập: đối với các thiết bị Android thì tương tác chủ yếu thông qua cảm ứng chạm (touch screen), giúp người dùng tương tác với trò chơi.
- Giao diện ứng dụng: là bộ khung tương tác với nền tảng của ứng dụng: cho phép ứng dụng khởi chạy, tạm ngưng, ngưng, và xử lí các sự kiện liên quan.
Đối với các thành phần trên, ta có bảng thực tế như sau:
Nền tảng / Yếu tố Windows Android Vònglặp trò chơi Có thể cài đặt giống nhau
trên cả hai hệ thống do đều viết bằng C/C++.
Có thể cài đặt giống nhau trên cả hai hệ thống do đều viết bằng C/C++.
Logic Tương tự, ta có thể cài đặt giống nhau trên cả ba hệ thống.
Tương tự, ta có thể cài đặt giống nhau trên cả ba hệ thống.
Đồ Họa - Direct X.
- OpenGL.
OpenGLES (thông qua bộ giả lập).
- OpenGL ES 1.1.
OpenGL ES 2.0. (C/C++: từ Android 2.1; Java: từ Android 2.2).
SVTH: Nhữ Thị Trà My- 08CNTT02 Trang 44
Âm thanh Có thể sử dụng các bộ thư viện âm thanh.
- MediaPlayer. - SoundPool. - Open SL ES (Từ Android 2.2). Hổ trợ các định dạng: midi, wav, m4a, mp3 … Nhập Nhận thông điệp từ windows. Từ View – phương thức OnTouchEvent(). Không hổ trợ nhận sự kiện cảm ứng trực tiếp từ JNI.
Giao diện ứng dụng: main() tạo cửa sổ và tương tác.
- Activity viết bằng Java. Native activity viết bằng C/C++. (từ Android 2.3). Xuất nhập tập tin Dùng thư viên <stdio.h>. Đọc tập tin từ res/raw qua
JNI.
Bảng 3. Thực tế của các thành phần trong trò chơi trên 3 hệ thống
Từ bảng thực tế trên, ta có bảng nhận xét sau: Yếu tố Tính Khả Chuyển Giải Pháp Vòng lặp trò
chơi Cài đặt bằng C/C++.
Logic Trò Chơi Cài đặt bằng C/C++. Đồ Họa
Dùng OpenGL ES 2.0. API 2.0 mạnh mẽ hơn nhiều so với 1.1 và hầu hết các thiết bị hiện