MỤC LỤC DANH MỤC CÁC HÌNH VẼ, SƠ ĐỒ iii MỞ ĐẦU 1 LỜI CẢM ƠN 3 CHƯƠNG 1. GIỚI THIỆU CHUNG VỀ GAME VÀ GAME TRÊN THIẾT BỊ DI ĐỘNG 4 1.1. Khái quát về game 4 1.2. Game trên thiết bị di động 6 1.3. Sơ lược quy trình phát triển game trên di động 6 1.4. Một số framework hỗ trợ việc phát triển game trên Android 8 CHƯƠNG 2. GIỚI THIỆU VỀ ANDENGINE 10 2.1. Các khái niệm chính trong lập trình AndEngine 10 2.1.1. Camera 10 2.1.2. Scene 10 2.1.3. Layer 10 2.1.4. Sprite 10 2.1.5. Entity 10 2.1.6. Modifier 10 2.1.7. Texture 11 2.1.8. Texture Region 11 2.1.9. Engine 11 2.1.10. BaseGameActivity 11 2.1.11. Box2D Physics Engine 11 2.2. Vòng đời của một game AndEngine 11 2.2.1. BaseGameActivity 11 2.2.2. SimpleBaseGameActivity 12 2.3. Một số thành phần của AndEngine được dùng trong PTITit Game 14 2.3.1. Camera / EngineOptions 14 2.3.2. BitmapTextureAtlas / Texture 15 2.3.3. Sprite / AnimatedSprite 17 2.3.4. Font 18 2.3.5.Text 18 2.3.6.Physics Box2D 19 CHƯƠNG 3. PHÂN TÍCH VÀ THIẾT KẾ ‘PTITIT GAME’ 21 3.1. Giới thiệu chung 21 3.2. Level 1 21 3.2.1. Thể loại: 21 3.2.2. Mô tả kịch bản 21 3.2.3. Thiết kế chi tiết 22 3.2.4. Ảnh chụp màn hình 27 3.3. Level 2. 29 3.3.1. Thể loại: 29 3.3.2. Mô tả kịch bản 29 3.3.3. Thiết kế chi tiết 29 3.3.4. Ảnh chụp màn hình 38 3.4. Một số thành phần khác trong game 39 3.4.1. Config 39 3.4.2.ValueControl 39 3.4.3. DBUtil và DBManager 39 3.4.4. MusicBackground và Sound 39 3.4.5. Util 40 3.5. Dữ liệu dùng trong PTITit Game 40 CHƯƠNG 4. CÀI ĐẶT ‘PTITIT GAME’ 42 4.1. Xử lý các thành phần trong game. 42 4.1.1. Xử lý đồ họa. 42 4.1.2. Xử lý font chữ. 44 4.1.3. Xử lý âm thanh. 44 4.1.4. Xử lý dữ liệu CSDL. 44 4.2. Yêu cầu của hệ thống khi cài đặt. 45 4.2.1. Yêu cầu cho phần lập trình. 45 4.2.2. Yêu cầu cho framework. 45 4.2.3. Yêu cầu cho phần chạy game. 46 4.3. Các module đã hoàn thành. 47 4.3.1. Sơ đồ các luồng màn hình của PTITit Game. 47 4.3.2. Màn hình các module game đã hoàn thiện. 48 CHƯƠNG 5. KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 53 DANH MỤC TÀI LIỆU THAM KHẢO 54
Trang 1DANH MỤC CÁC HÌNH VẼ, SƠ ĐỒ iii
MỞ ĐẦU 1
LỜI CẢM ƠN 3
CHƯƠNG 1 GIỚI THIỆU CHUNG VỀ GAME VÀ GAME TRÊN THIẾT BỊ DI ĐỘNG 4
1.1 Khái quát về game 4
1.2 Game trên thiết bị di động 6
1.3 Sơ lược quy trình phát triển game trên di động 6
1.4 Một số framework hỗ trợ việc phát triển game trên Android 8
CHƯƠNG 2 GIỚI THIỆU VỀ ANDENGINE 10
2.1 Các khái niệm chính trong lập trình AndEngine 10
2.1.1 Camera 10
2.1.2 Scene 10
2.1.3 Layer 10
2.1.4 Sprite 10
2.1.5 Entity 10
2.1.6 Modifier 10
2.1.7 Texture 11
2.1.8 Texture Region 11
2.1.9 Engine 11
2.1.10 BaseGameActivity 11
2.1.11 Box2D Physics Engine 11
2.2 Vòng đời của một game AndEngine 11
2.2.1 BaseGameActivity 11
2.2.2 SimpleBaseGameActivity 12
2.3 Một số thành phần của AndEngine được dùng trong PTITit Game 14
2.3.1 Camera / EngineOptions 14
2.3.2 BitmapTextureAtlas / Texture 15
2.3.3 Sprite / AnimatedSprite 17
2.3.4 Font 18
2.3.5.Text 18
2.3.6.Physics Box2D 19
Trang 23.2 Level 1 21
3.2.1 Thể loại: 21
3.2.2 Mô tả kịch bản 21
3.2.3 Thiết kế chi tiết 22
3.2.4 Ảnh chụp màn hình 27
3.3 Level 2 29
3.3.1 Thể loại: 29
3.3.2 Mô tả kịch bản 29
3.3.3 Thiết kế chi tiết 29
3.3.4 Ảnh chụp màn hình 38
3.4 Một số thành phần khác trong game 39
3.4.1 Config 39
3.4.2.ValueControl 39
3.4.3 DBUtil và DBManager 39
3.4.4 MusicBackground và Sound 39
3.4.5 Util 40
3.5 Dữ liệu dùng trong PTITit Game 40
CHƯƠNG 4 CÀI ĐẶT ‘PTITIT GAME’ 42
4.1 Xử lý các thành phần trong game 42
4.1.1 Xử lý đồ họa 42
4.1.2 Xử lý font chữ 44
4.1.3 Xử lý âm thanh 44
4.1.4 Xử lý dữ liệu CSDL 44
4.2 Yêu cầu của hệ thống khi cài đặt 45
4.2.1 Yêu cầu cho phần lập trình 45
4.2.2 Yêu cầu cho framework 45
4.2.3 Yêu cầu cho phần chạy game 46
4.3 Các module đã hoàn thành 47
4.3.1 Sơ đồ các luồng màn hình của PTITit Game 47
4.3.2 Màn hình các module game đã hoàn thiện 48
CHƯƠNG 5 KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 53
DANH MỤC TÀI LIỆU THAM KHẢO 54
Trang 4Hình 2.1: Ví dụ một cấu trúc đơn giản của BaseGameActivity 12
Hình 2.2: Cấu trúc của một SimpleBaseGameActivity trong AndEngine GLES2 13
Hình 2.3: Ví dụ về phương thức onCreateEngineOptions() 13
Hình 2.4: Ví dụ về phương thức onCreateResources() 14
Hình 2.5: Ví dụ về phương thức onCreateScene() 14
Hình 2.6: Ví dụ về TiledTextureRegion true_TTR sử dụng trong PTITit Game: 16
Hình 2.7: Ví dụ về font UVFBarmBrack.ttf được sử dụng trong PTITit Game 18
Hình 2.8: Tạo hình chữ nhật bao quanh là các StaticBody của level 2 trong PTITit Game 20
Hình 3.1: Giao diện phác thảo Level 1 22
Hình 3.2: Cấu trúc các thành phần của Level 1 23
Hình 3.3: Các biến sử dụng trong LaunchLevel1.java 23
Hình 3.4: phương thức onCreate() của LaunchLevel1.java 24
Hình 3.5: Phương thức onCreateEngineOptions() của LaunchLevel1.java 24
Hình 3.6: phương thức onCreateResources() của LaunchLevel1.java 25
Hình 3.7: phương thức onCreateScene() của LaunchLevel1.java 25
Hình 3.8: Thể hiện của lớp KhungCauHoi.java trong Level 1 26
Hình 3.9: Thể hiện của lớp KhungHinhAnh.java trong Level 1 26
Hình 3.10: Thể hiện của lớp ThoiGianDemNguoc.java và Diem.java trong Level 1 27
Hình 3.11: Resource.java trong Level 1 27
Hình 3.12: Một số hình ảnh dùng cho các Sprite trong Level 1 27
Hình 3.13: Ảnh chụp màn hình Level 1 28
Hình 3.14: Ảnh chụp màn hình Level 1 28
Hình 3.15: Ảnh chụp màn hình Level 1 28
Hình 3.16: Giao diện phác thảo Level 2 30
Hình 3.17: Các phương thức của IAccelerationListener 31
Hình 3.18: Cấu trúc các thành phần của Level 2 33
Hình 3.19: Các biến sử dụng trong LaunchLevel2.java 33
Hình 3.20: Phương thức onCreate() của LaunchLevel2.java 35
Hình 3.21: Khởi tạo môi trường vật lý trong LaunchLevel2.java 35
Hình 3.22: Tạo hình chữ nhật giới hạn miền di chuyển quả bóng 35
Hình 3.23: Gán trạng thái cho các cạnh của hình chữ nhật 36
Hình 3.24: Gắn hình chữ nhật tĩnh vào trong Scene 36
Hình 3.25: Tạo quả bóng trong LaunchLevel2.java 36
Hình 3.26: Đăng kí PhysicsWorld cho Scene 36
Hình 3.27: Thể hiện của lớp ThoiGianDemNguoc.java và Diem.java trong Level 2 37
Hình 3.28: Một số hình ảnh dùng cho các Sprite trong Level 2 38
Hình 3.29: Ảnh chụp màn hình Level 2 38
Hình 3.30: Ảnh chụp màn hình Level 2 38
Hình 3.31: Ảnh chụp màn hình Level 2 38
Hình 3.32: Config trong PTITit Game 39
Hình 3.33: ValueControl trong PTITit Game 39
Trang 5Hình 3.36: Util trong PTITit Game 40
Hình 3.37: Cấu trúc bảng QUESTIONS trong PTITITGAMEDB 40
Hình 4.1: Logo PTITit Game 42
Hình 4.2: Button Music sử dụng Photoshop 42
Hình 4.3: Button Thoát sử dụng Photoshop 43
Hình 4.4: Dialog sử dụng Photoshop 43
Hình 4.5: Tạo hình nền bằng Paper Artist 43
Hình 4.6: Giao diện SQLite Manager 45
Hình 4.7: Cấu hình cho project sử dụng AndEngine GLES2 và extension 46
Hình 4.8: Sơ đồ các luồng màn hình trong PTITit Game 47
Hình 4.9: Splash Screen 48
Hình 4.10: Menu Screen 48
Hình 4.11: Guide Screen 49
Hình 4.12: High Score Screen 49
Hình 4.13: About Screen 50
Hình 4.14: Select Level Screen 50
Hình 4.15: Dialog Play 50
Hình 4.16: Dialog Intro Level 51
Hình 4.17: LaunchLevel1 51
Hình 4.18: LaunchLevel2 52
Hình 4.19: Dialog Game Over 52
Trang 6Đất nước ta đang trong thời kỳ công nghiệp hóa, hiện đại hóa, đời sống người dânkhông ngừng cải thiện, kéo theo đó là nhu cầu về vật chất và tinh thần được nâng cao Trong
số đó phải kể đến nhu cầu về các thiết bị di động Ngày nay, việc sử dụng thiết bị di động(điện thoại di động, máy tính bảng ) đã trở nên rất phổ biến đối với mọi lứa tuổi, mọi tầnglớp trong xã hội Bởi vậy, có thể dễ dàng nhận ra thị trường di động là một thị trường rất tiềmnăng mà nhiều cá nhân, tập thể, doanh nghiệp muốn nhắm tới Cùng với sự ra đời những sảnphẩm thiết bị di động công nghệ cao của Apple, Nokia, Samsung, LG, HTC và sự phát triểncủa các hệ điều hành Android, iOS, Window Phone các thiết bị di động ngày càng thu hútmột số lượng lớn người dùng trên toàn thế giới Và một yếu tố quan trọng trong sự thu hút đóphải kể đến game mobile – trò chơi trên thiết bị di động
Game từ lâu đã là một dịch vụ giải trí rất phổ biến đối với người dùng Việt Nam Dịch
vụ game có thể được phát triển trên nhiều nền tảng như PC, mobile, browser Cùng với game
PC và game browser, ngày nay, game dành cho các thiết bị di động cũng đang thực sự bùngnổ
Ở Việt Nam, hệ điều hành Android của Google sử dụng trên các thiết bị di động thôngminh đang là một trong những hệ điều hành được ưa chuộng nhất Có nhiều cách thức pháttriển dịch vụ game trên hệ điều hành Android Trong đó, AndEngine nổi bật lên như một công
cụ đơn giản và hiệu quả bậc nhất để hỗ trợ việc phát triển game với đồ họa đẹp mắt
Trong phạm vi đồ án của mình, em xin trình bày một số kiến thức cơ bản về AndEngine,
và cách thức xây dựng “PTITit Game” sử dụng AndEngine trên hệ điều hành Android Gamechủ yếu tập trung chú ý vào việc sử dụng các đối tượng mà AndEngine hỗ trợ, khả năng thểhiện đồ họa trong AndEngine Game được phát triển theo 2 level Level 1 sử dụng nhữngSprite động và tĩnh, cùng với bộ đếm thời gian và cách tính điểm đơn giản Level 2 áp dụngthêm thành phần mở rộng về vật lý của AndEngine để làm game hấp dẫn hơn Bên cạnh đó,
“PTITit Game” cũng thể hiện một cách làm việc đơn giản với CSDL sqlite hay lưu dữ liệutrên thiết bị với SharedPreferences
Với mục tiêu như vậy, bố cục của đồ án sẽ bao gồm năm chương theo cấu trúc như sau:
Chương 1: Giới thiệu chung về game và game trên thiết bị di động
Trình bày một số hiểu biết chung về game và game trên thiết bị di động Các thành phần
cơ bản của một game, cũng như những lưu ý khi xây dụng một game trên thiết bị di động
Chương 2: Giới thiệu về AndEngine
Trình bày các kiến thức về AndEngine Vòng đời của một game AndEngine, và cácthành phần AndEngine hỗ trợ để phát triển game như Sprite, Font, Text, PhysicsBox2D
Chương 3: Phân tích và thiết kế “PTITit Game”
“PTITit Game” là một game được viết bằng AndEngine, dành cho sinh viên khoa côngnghệ thông tin Học viện Công nghệ Bưu chính Viễn thông Chương này trình bày cụ thể vềquá trình thực hiện việc xây dựng “PTITit Game” về kịch bản, cách chơi, cách xây dựng giaodiện cũng như các thành phần trong game qua từng level
Trang 7Nêu ra những yêu cầu cho phần cài đặt và chạy game
Chương 5: Kết luận và hướng phát triển
Tổng kết, tóm tắt những kết quả đã đạt được và còn chưa đạt được Từ đó đề xuất mụctiêu hướng tới cũng như hướng nghiên cứu, phát triển tiếp theo
Trang 8Lời đầu tiên em xin bày tỏ lòng biết ơn sâu sắc tới cô giáo Trịnh Thị Vân Anh, cô đãtận tình hướng dẫn, chỉ bảo và giúp đỡ em trong suốt những năm học vừa qua cũng như trongquá trình làm đồ án tốt nghiệp
Em xin bày tỏ lòng biết ơn tới các thầy, cô giáo trong khoa Công nghệ thông tin 1 Học viện Công Nghệ Bưu chính Viễn thông cơ sở Hà Đông Các thầy cô đã chỉ bảo, dạy dỗ
-và truyền đạt cho em những kiến thức cần thiết, luôn tạo điều kiện học tập tốt nhất cho emtrong suốt hơn 4 năm học tập tại trường
Cuối cùng, tôi xin chân thành cảm ơn các bạn trong tập thể lớp D09CN1 đã nhiệt tìnhgiúp đỡ cũng như đóng góp những ý kiến có giá trị giúp tôi hoàn thành được đồ án này
Hà Nội, ngày 20 tháng 11 năm 2013
Nguyễn Đức Hải
Trang 9CHƯƠNG 1 GIỚI THIỆU CHUNG VỀ GAME VÀ GAME
TRÊN THIẾT BỊ DI ĐỘNG1.1 Khái quát về game
Kể từ khi máy tính xuất hiện, game đã trở thành một trong những ứng dụng phổ biến
nhất trên thị trường Trong cuốn sách Reality Is Broken, tác giả Jane McGonigal đã nêu ra 4
thuộc tính của phần lớn game trên thị trường:
+ Mục tiêu: Game chỉ ra một mục tiêu rõ ràng cho người chơi để họ đạt được Mục tiêu
là những thử thách đối với người chơi, nhưng họ có thể vượt qua Người chơi sẽ cảm thấyhứng thú nhất nếu mục tiêu đó phù hợp với khả năng của mình, không quá khó, không quá dễ.Mục tiêu rõ ràng, thú vị cũng là yếu tố quan trọng thu hút người chơi đến với game
+ Quy tắc: Game cũng có những quy tắc bắt buộc mà tất cả người chơi phải tuân theo.
Các quy tắc này thường làm cho việc đạt được mục tiêu nêu trên khó khăn hơn Điều đó cũngkhuyến khích sự sáng tạo của mỗi người
+ Phản hồi: Game cần phản hồi cho người chơi biết rằng họ đang làm công việc của
mình tốt hay không Một điều đáng lưu ý rằng, hệ thống phản hồi chính là chìa khóa để làmtrò chơi thú vị
+ Tham gia một cách tự nguyện: một trò chơi sẽ không còn là một trò chơi đúng nghĩa
nếu bạn không thực sự thích chơi nó Điều này ngụ ý rằng người chơi phải chấp nhận đượcmục tiêu, các quy tắc, và hệ thống phản hồi của trò chơi
Các thể loại game cơ bản
Những người phát triển game không chủ động phân loại các trò chơi của họ Và tấtnhiên, không có danh sách chuẩn nào về việc phân loại game Mặc dù vậy, theo thời gian, cáctrò chơi cũng dần được phân loại vào các lớp khác nhau theo những cách khác nhau Việcphân loại chính xác rất khó khăn Tuy vậy, chúng ta có thể kể đến một số loại game điển hìnhnhư sau:
+ Game hành động hay kỹ năng: Người chơi phải sử dụng một số kỹ năng trong thời
gian thực (VD: bắn vào một vật đang di chuyển ) để đạt được mục tiêu
+ Game về chiến lược: Người chơi ít phải sử dụng kỹ năng hơn, và chủ yếu tập trung
đưa ra những quyết định lựa chọn chiến lược hợp lý để vượt qua màn chơi
+ Game phiêu lưu hay có cốt truyện: Những game này được xây dựng dựa trên một cốt
truyện hấp dẫn, với các nhân vật được chau chuốt cùng với một cốt truyện cụ thể Cốt truyện
đó cũng định nghĩa ra mục tiêu cho người chơi trong thể loại game này
+ Game mô phỏng: Thông thường, game thuộc thể loại này mô tả lại một yếu tố có
trong thực tế (VD như lái một chiếc xe, chơi tennis )
+ Game câu đố: Một số trò chơi truyền tải trực tiếp câu đố đến với người chơi Tuy
nhiên, trong một số game phức tạp, những câu đố này có thể ẩn dưới nhiều hình thức khácnhau Có thể hiểu như một game nhỏ, trong một game lớn hơn
Trang 10Các thành phần cơ bản của một game
+ Opening (Splash) Screen:
Để tối ưu hóa hiệu năng hoạt động, trước khi game sẵn sàng, đồ họa của level thườngđược nạp vào trước khi level đó bắt đầu Quá trình nạp dữ liệu có thể kéo dài đến vài giây.Trong thời gian đó, bạn không muốn để người dùng phải nhìn vào một màn hình trống Vậynên, hãy hiển thị một màn hình chờ (splash screen) Nó cho người dùng biết game vẫn đanghoạt động bình thường
+Hiệu ứng âm thanh (Sound Effects)
Những hiệu ứng âm thanh sẽ làm cho game trở nên thú vị hơn nhiều Ví dụ như khi haivật thể va chạm, người chơi muốn được nghe một tiếng động nào đó thể hiện sự va chạm này
Âm thanh sẽ làm cho game thân thiện hơn với người chơi
sẽ vui hơn nhiều
+ Chướng ngại vật (Obstacles)
Mỗi thể loại game khác nhau sẽ sử dụng những chướng ngại vật khác nhau Hãy lựachọn chướng ngại vật phù hợp để tăng độ khó cũng như thử thách người chơi
+ Cấp độ (Levels)
Thử thách trong game là một phần thúc đẩy người chơi Nhưng hãy biết cách giới hạnnó! Hãy chia những thử thách thành nhiều cấp độ Người chơi bắt đầu với những màn chơi dễdàng, rồi dần dần làm quen, nâng cao kỹ năng, để chiến thắng được những cấp độ khó hơn
+ Người chơi (Player)
Người chơi luôn là phần quan trọng nhất của bất kỳ game nào Game sẽ chỉ thành côngkhi luôn giữ được sự thú vị, lôi cuốn đối với người chơi Người chơi cần được thử thách bởicác thành phần trong game, nhưng không được quá thách thức khiến họ từ bỏ game trong thấtvọng Game cần bao gồm đủ nhiều yếu tố để duy trì sự quan tâm từ phía người chơi!
Trang 11+ Màn chơi (Scenes)
Nếu coi trò chơi như một bộ phim, thì mỗi màn hình hiển thị cho người chơi cũng giốngnhư một cảnh trong phim Ở đó có sự thay đổi về nền đồ họa trong mỗi cảnh, nhưng khôngquá nhiều dù điểm nhìn của người chơi thay đổi Sau đó, ta thêm vào những thứ chuyển động,cùng với những chướng ngại vật để tạo ra một màn hình game hoàn chỉnh
1.2 Game trên thiết bị di động
Cùng với sự đa dạng và phong phú về thể loại game có thể lựa chọn, chúng ta cần tậptrung vào những yếu tố phù hợp nhất với nền tảng di động (điện thoại di động, máy tínhbảng ), đặc biệt quan tâm đến những game có thể phát triển bằng một nhóm ít người
Với tiềm năng to lớn của thị trường di động, không ngạc nhiên khi có rất nhiều nghiêncứu và tư tưởng được đưa ra nhằm mục đích tạo nên một game di động tốt Cùng với việc tiếptục áp dụng những nguyên tắc thông thường khi thiết kế game trên máy tính, ta cần quan tâmđến một số đặc điểm của game được thiết kế trên các thiết bị di động:
+ Không lãng phí thời gian của người chơi
+ Cung cấp sự trợ giúp cần thiết cho người chơi
+ Làm cho mục tiêu của trò chơi dễ hiểu
+ Hiển thị các trạng thái trong game một cách rõ ràng
+ Người dùng di động thường chỉ chơi game trong một thời gian ngắn
+ Người chơi có thể dễ dàng tạm dừng hay tiếp tục game khi cần thiết
+ Người chơi có thể đạt được tiến bộ trong một thời gian ngắn
+ Những hạn chế của thiết bị di động ảnh hưởng đến việc xây dựng game:
Kích thước màn hình nhỏ, và đa dạng về kích thước màn hình, độ phân giải
Có rất nhiều cách thức nhập dữ liệu từ người dùng (bàn phím, cảm ứng, cảmứng đa điểm, )
Hạn chế về khả năng tính toán
Hạn chế về pin
1.3 Sơ lược quy trình phát triển game trên di động
Một đội phát triển game trên thiết bị di động thường có những vị trí sau:
+ Người viết kịch bản
+ Lập trình viên
+ Người thiết kế đồ họa
+ Người soạn nhạc và hiệu ứng âm thanh
+ Người kiểm tra và đóng gói sản phẩm
Cần có một tài liệu thật tốt để mọi người trong nhóm có chung tiếng nói, hiểu được mụctiêu chung và cùng nhau phát triển tốt sản phẩm game
Trang 12Xét về mặt tổng quát, có thể chia phát triển game thành 4 giai đoạn:
GĐ1: Giai đoạn tiền sản phẩm/ý tưởng
Ở giai đoạn này, từng thành viên phát triển ý tưởng, sau đó thống nhất với cả đội để xácđịnh ý tưởng chủ đạo của sản phẩm Qua giai đoạn này, các ý tưởng cho lập trình, nội dung,thể loại game (action, puzzle, adventure, platform, sport, RPG ), phong cách đồ họa và âmnhạc dần được hình thành thể hiện qua biểu đồ, đặc tả, các thông số thử nghiệm, hình vẽ tay
về nhân vật (sketch), giai điệu nhạc được lựa chọn và thống nhất xuyên suốt các giai đoạnphát triển
GĐ2: Đặc tả cho lập trình
Đây là một giai đoạn rất quan trọng trong quá trình thiết kế game Bạn càng bỏ nhiềuthời gian cho giai đoạn này thì khi lập trình, gỡ lỗi càng tiết kiệm thời gian Lập trình viênchuyên nghiệp hiểu rằng lỗi xuất hiện trong quá trình thiết kế sẽ thiệt hại hơn nhiều so với lỗiđược phát hiện trong giai đoạn này
Bạn cần giấy, bút hay chương trình văn bản và cùng với một vài người khác chơi thửgame Khi “chơi thử” bằng cách ghi ra giấy, các ưu/khuyết của thiết kế sẽ lộ rõ và bạn có thểchỉnh sửa cho đến khi cảm thấy vừa ý
GĐ3: Thực hiện viết code, thiết kế đồ họa và chọn nhạc, hiệu ứng âm thanh
Với đặc tả đã có, hãy dự tính thời lượng cho việc lập trình, tính toán ngày công kỹ càng
để có thể ước tính khối lượng công việc và dễ theo dõi tiến độ Và phải đảm bảo việc codeđúng với những gì đã đặc tả trong game
Bên cạnh việc viết code, thiết kế đồ họa trong game cũng cần đặc biệt lưu tâm Do độphân giải của màn hình điện thoại di động khá nhỏ nên mọi vật thể đồ họa trong game đềuđược thực hiện bằng đồ họa điểm ảnh (pixel art), vì vậy người thiết kế đồ họa ngoài kiến thức
về vẽ tay, đổ bóng còn phải có kỹ năng thao tác tỉ mỉ
Âm thanh trong game là một phần rất quan trọng tạo nên cái hồn của game Việc lựachọn hay mix nhạc phù hợp sẽ tạo sự hào hứng với người chơi, tăng độ hấp dẫn cho game củabạn Hiện tại cũng có nhiều chương trình giúp cho việc soạn nhạc dễ dàng mà không cần biếtnhiều về nhạc lý, bạn chỉ cần lựa vài hợp âm, nhạc cụ, tempo, điệu nhạc , và chương trình sẽtạo bản nhạc cho bạn
GĐ4: Kiểm tra và đóng gói sản phẩm
Kiểm tra: Nhóm lập trình sẽ cùng chơi thử, cảm nhận và ghi lại tất cả các ưu và khuyết.Sửa các lỗi nếu có Phát hành bản beta cho game thủ chơi thử và lấy ý kiến của họ
Đóng gói: game cho di động phải được “xuất” hay đóng gói cho các dòng máy khácnhau (do các dòng máy này khác nhau về phím nhấn, bộ nhớ và thư viện hỗ trợ)
1.4 Một số framework hỗ trợ việc phát triển game trên Android
Do nhu cầu không ngừng của người chơi game cũng như của những nhà phát triển, ngàynay trên thị trường có rất nhiều framework hỗ trợ việc xây dựng và phát triển game trên cácthiết bị di động, đặc biệt là trên hệ điều hành Android
Trang 13Tùy theo yêu cầu và đặc điểm của từng game, mà lập trình viên lựa chọn cho mìnhframework thích hợp để lập trình Một số framework cơ bản có thể kể đến như:
+ Libgdx: Libgdx framework được phát triển dựa trên nghiên cứu về game development
cross-platform Nghĩa là game của bạn khi viết ra bằng Libgdx framework, nó sẽ chơi đượctrên Desktop, Web, Android, iOS và trong tương lai có thể thêm những platform khác nữa!Khi bạn code game sử dụng Libgdx framework, bạn có thể code trên desktop và debug ở đó,sau khi game hoàn thiện, bạn hoàn toàn có thể mang game đó chạy trên các platform khác màkhông cần sửa chữa mã nguồn nhiều Libgdx framework tối ưu hóa game của bạn bởi cácthành phần thiết kế như quản lý tài nguyên được viết bằng Native code Libgdx framework cóphần tài liệu hướng dẫn rất tuyệt vời và được hỗ trợ qua forum một cách nhanh chóng và nhiệttình Libgdx framework có nhiều game example, nhiều source code, và có rất nhiều gamethương mại và phi thương mại đã và đang sử dụng Libgdx framework
Ligdx framework thích hợp để xây dựng những game chơi được trên nhiều platform, vànhững game hành động đòi hỏi di chuyển mượt mà
+ AndEngine: AndEngine là một bộ các công cụ để phát triển video game, được phát
triển bởi Nicolas Gramlich Nó bao gồm đầy đủ các thuộc tính quan trọng nhất của OpenGL,ngay cả khi bạn không có kinh nghiệm với OpenGL - bạn vẫn có thể tạo ra 1 game có đồ họađẹp và đầy đủ tính năng hoặc 1 ứng dụng đẹp mắt sử dụng công cụ này
Tất cả các phương diện quan trọng của một game đều được định nghĩa sẵn trongAndEngine, và rất dễ dàng để sử dụng AndEngine có thể làm việc trên nhiều thiết bị khácnhau, với độ phân giải khác nhau Hỗ trợ cảm ứng đa điểm, và hình nền động Bằng những lợithế đó, AndEngine rất thích hợp để xây dựng những game yêu cầu đồ họa cùng những hiệuứng đẹp mắt
Trong khuôn khổ đồ án này, chúng ta sẽ tập trung tìm hiểu về AndEngine GLES2
Trang 14CHƯƠNG 2 GIỚI THIỆU VỀ ANDENGINE2.1 Các khái niệm chính trong lập trình AndEngine
Để có thể hiểu và làm việc tốt với AndEngine, trước hết chúng ta xem xét một số kháiniệm chính thường được nhắc đến khi lập trình với AndEngine:
2.1.1 Camera
Các "camera" của trò chơi xác định giao diện được trình bày cho người chơi Nó giốngnhư một máy quay phim trong không gian hai chiều Chiếc máy quay này có thể giãn vàphóng trên các cảnh để thay đổi khung nhìn trình bày Sự co dãn và phóng to có thể được thựchiện dưới sự kiểm soát của người chơi hoặc được điều khiển theo chương trình
2.1.2 Scene
Một trò chơi, giống như một bộ phim, bao gồm một loạt các cảnh nơi hành động diễn
ra Trong một bộ phim, những cảnh được biên tập lại với nhau theo một cách cố định Trongtrò chơi, trình tự của cảnh được dẫn dắt bởi lối chơi của trò chơi Trò chơi giống như bộ phimđược chỉnh sửa từ trên cao nhìn xuống
2.1.3 Layer
Cảnh bao gồm các lớp đồ họa Các lớp được chồng lên nhau, giống như các tế bào hoạthình được sử dụng để làm phim hoạt hình theo cách cổ điển Các lớp cũng có thể được sửdụng để giới thiệu hiệu ứng 2½D, ví dụ như việc điều chỉnh máy quay, các lớp gần hơnchuyển động nhanh hơn các lớp ở xa
2.1.4 Sprite
Những Sprite là những đại diện trực quan của các diễn viên trong bộ phim của chúng ta
Dù cho các sprite là hình động hay tĩnh, chúng vẫn thường di chuyển trong những màn chơi.Kết cấu Sprite thường được nạp từ một hình ảnh lớn mà bao gồm một tập hợp các hình ảnhhọa tiết, được gọi là một sprite sheet
2.1.5 Entity
Trong AndEngine, các thực thể là tất cả những thứ được vẽ trên màn hình Các thực thể
có thể là các sprite, các hình dạng hình học, hay các dòng kẻ trên màn hình Tất cả các thựcthể đều có các thuộc tính, chẳng hạn như màu sắc, góc quay, độ lớn,vị trí, và có thể đượcthay đổi bằng các Modifier
2.1.6 Modifier
Các modifier thay đổi các thuộc tính của một thực thể, và chúng là công cụ rất mạnh mẽđược sử dụng trong AndEngine Chúng có thể được áp dụng trên bất kỳ thực thể nào, và sựthay đổi mà chúng gây ra có thể là trực tiếp hoặc diễn ra từ từ trong một thời gian nhất định.Trong trò chơi, chúng ta thường sẽ sử dụng các modifier để tạo hiệu ứng với các sprite và cácthực thể khác
Trang 152.1.10 BaseGameActivity
Lớp này, được mở rộng của lớp Activity Android, sẽ là cơ sở của mỗi scene trong tròchơi của chúng ta BaseGameActivity làm các công việc chung cho tất cả các scene, thiết lậpcác công cụ trò chơi, phù hợp với các yêu cầu vòng đời hoạt động Android
2.1.11 Box2D Physics Engine
Physics Box2D là một thành phần mở rộng của AndEngine, nó hỗ trợ việc mô phỏng sựtương tác thực tế giữa các đối tượng vật lý trong các trường hợp sau đây:
+ Mô phỏng các tính chất vật lý của các vật rắn
+ Ổn định xếp chồng
+ Trọng lượng
+ Các đơn vị được người dùng xác định
+ Giải quyết hiệu quả cho sự tương tác / liên lạc
+ Trượt ma sát
+ Làm việc với các hình học: Hộp, hình tròn, đa giác
+ Một số loại liên kết: khoảng cách, lăng trụ, ròng rọc,
+ Trạng thái ngủ (loại bỏ cơ thể bất động từ các mô phỏng cho đến khi chạm vào)
2.2 Vòng đời của một game AndEngine
2.2.1 BaseGameActivity
Điều quan trọng đầu tiên, cần lưu ý đến việc khởi tạo game Nhu cầu cơ bản của mộtgame khi khởi tạo bao gồm việc tạo ra engine, nạp tài nguyên của game, và thiết lập màn hìnhkhởi tạo Mỗi một game viết bằng AndEngine được thể hiện thông qua classBaseGameActivity BaseGameActivity là một lớp con kế thừa từ class Activity của Android
Để hiểu được quá trình hoạt động của BaseGameActivity, ta xem xét vòng đời của nó
Trang 16Một class BaseGameActivity chứa một số phương thức mà chúng ta cần phải ghi đètrực tiếp Đó là:
+ onCreateEngineOptions(): Sử dụng để khởi tạo các thành phần cơ bản của một game
AndEngine như khởi tạo engineOptions, camera
+ onCreateResources(): Sử dụng để khởi tạo tài nguyên cho game như khởi tạo texture,
region, âm thanh, font chữ …
+ onCreateScene(): Khởi tạo các màn hình chơi, các nhân vật và các thành phần trong
game như sprite, animatedSprite …
+ onPopulateScene(): Là nơi chúng ta gắn các entity con cho scene tương ứng
Hình 2.1: Ví dụ một cấu trúc đơn giản của BaseGameActivity.
Trang 17SimpleBaseGameActivity được tạo ra cho AndEngine GLES2 SimpleBaseGameActivityđược cho là giống với BaseGameActivity trong AndEngine GLES1, và đã đáp ứng được điều
mà rất nhiều người phát triển AndEngine muốn vào thời điểm đó
Điều làm nên sự khác biệt cho BaseGameActivity (GLES2) là chúng ta có nhiều quyềnkiểm soát hơn đối với ứng dụng của mình, vì các phương thức sẽ không được gọi một cách tựđộng (bên cạnh việc thiết lập các tùy chọn engine) Phần lớn các phương thức được thực hiệntương tự khi sử dụng BaseGameActivity trong GLES1, nhưng bạn sẽ phải cung cấp một lờigọi lại (callback) Một callback cho chương trình biết rằng chúng ta đã làm việc xong vớiphương thức, nó sẽ chuyển sang phương pháp tiếp theo Điều này giúp chúng ta linh hoạt hơnrất nhiều trong việc nạp tài nguyên game
Hình 2.2: Cấu trúc của một SimpleBaseGameActivity trong AndEngine GLES2.
Dưới đây là một ví dụ về SimpleBaseGameActivity:
+ onCreateEngineOptions():
Hình 2.3: Ví dụ về phương thức onCreateEngineOptions()
Ví dụ: Chúng ta tạo một Camera có kích thước WIDTH x HEIGHT, bắt đầu từ vị trí(0,0) của màn hình
Trang 18Sau đó khởi tạo engineOptions có hàm khởi tạo như trên với ý nghĩa là:
true: chế độ toàn màn hình;
ScreenOrientation.LANDSCAPE_FIXED: xoay màn hình theo chiều ngang;
new FillResolutionPolicy(): điền kín màn hình, bỏ qua tỉ lệ;
Hàm khởi tạo được sử dụng:
Camera(final float pX, final float pY, final float pWidth, final float pHeight)
Trong đó:
+ pX, pY: là tọa độ bắt đầu của Camera trong màn hình hiển thị của thiết bị
Trang 19+ pWidth, pHeight: là kích thước chiều ngang và chiều dọc của Camera.
b EngineOptions
Hàm khởi tạo được sử dụng:
EngineOptions(final boolean pFullscreen, final ScreenOrientation pScreenOrientation,final IResolutionPolicy pResolutionPolicy, final Camera pCamera)
Trong đó:
+ pFullscreen: là chế độ toàn màn hình
+ pScreenOrientation: Chiều của màn hình
pScreenOrientation có thể nhận các giá trị:
ScreenOrientation.PORTRAIT_FIXED: màn hình xoay theo chiều dọc
ScreenOrientation.LANDSCAPE_FIXED: màn hình xoay theo chiều ngang
+ pResolutionPolicy: cho biết cách thức làm việc với các màn hình khác nhau
pResolutionPolicy có thể là:
RatioResolutionPolicy(final float pWidthRatio, final float pHeightRatio): mở rộng đồhọa để điền vào nhiều nhất có thể các phần trong màn hình mà vẫn duy trì tỉ lệ ban đầu củađối tượng đồ họa
FillResolutionPolicy(): lấp đầy đồ họa trong màn hình, không quan tâm đến tỉ lệ
FixedResolutionPolicy(final int pWidth, final int pHeight): sử dụng kích thước cố địnhban đầu, và không thay đổi cho bất kì loại màn hình nào
RelativeResolutionPolicy(final float pWidthScale, final float pHeightScale): sử dụngmột quy mô cố định trên một kích thước ban đầu Ta nên sử dụng cách này nếu muốn tối ưutrên một số thiết bị cụ thể
2.3.2 BitmapTextureAtlas / Texture
Bất cứ khi nào chúng ta muốn nạp một đối tượng đồ họa vào trong game AndEngine,điều bắt buộc phải làm đó là khai báo cho đối tượng đồ họa đó một nơi để chứa thông tin cácđiểm ảnh Trong AndEngine, BitmapTextureAtlas có thể hiểu như một khung tranh, cònTexture sẽ đóng vai trò như một bức hình để vào trong khung tranh BitmapTextureAtlas đó Các BitmapTextureAtlas và các Texture phải được nạp vào lúc khởi tạo game, sẽ được
đặt trong hàm onCreateResources();
a BitmapTextureAtlas
Hàm khởi tạo được sử dụng:
BitmapTextureAtlas(final TextureManager pTextureManager, final int pWidth, final intpHeight, final TextureOptions pTextureOptions)
Trang 20+ pTextureOption: là cách thức khung tranh sẽ được hiển thị.
b Texture
o TextureRegion
TextureRegion được sử dụng để chứa thông tin đồ họa của những Sprite tĩnh
Cách khai báo được sử dụng:
TextureRegion createFromAsset(final BitmapTextureAtlas pBitmapTextureAtlas, finalContext pContext, final String pAssetPath, final int pTextureX, final int pTextureY)
Trong đó:
+ pBitmapTextureAtlas: là khung tranh BitmapTextureAtlas sẽ chứa tấm hình này
+ pContext: là Activity chứa đối tượng này
+ pAssetPath: đường dẫn đến bức hình
+ pTextureX, pTextureY: hai tọa độ đầu tiên trong khung tranh BitmapTextureAtlas đểđặt tấm hình này
o TiledTextureRegion
TiledTextureRegion được sử dụng để nạp thông tin đồ họa của những Sprite động, tức
là những TiledSprite Trong mỗi bức hình có nhiều phần nhỏ, mỗi phần là một trạng thái củaSprite theo thời gian
Hình 2.6: Ví dụ về TiledTextureRegion true_TTR sử dụng trong PTITit Game:
Cách khai báo được sử dụng:
pBitmapTextureAtlas, final Context pContext, final String pAssetPath, final int pTextureX,final int pTextureY, final int pTileColumns, final int pTileRows)
Trong đó:
+ pBitmapTextureAtlas: là khung tranh BitmapTextureAtlas sẽ chứa tấm hình này
+ pContext: là Activity chứa đối tượng này
+ pAssetPath: đường dẫn đến bức hình
+ pTextureX, pTextureY: hai tọa độ đầu tiên trong khung tranh BitmapTextureAtlas đểđặt tấm hình này
Trang 21+ pTileColumns, pTileRows: là số cột, số hàng của bức hình.
2.3.3 Sprite / AnimatedSprite
Sprite là thành phần chính trong game Bất kì game nào cũng cần có Sprite, thậm chí lànhiều Sprite trong mỗi màn chơi Sprite có thể ở dạng tĩnh (Sprite) – không thay đổi hìnhdạng, hay động (AnimatedSprite) – thay đổi hình dạng theo thời gian
Việc khai báo Sprite / AnimatedSprite sẽ được đặt trong hàm onCreateScene();
a Sprite
Các hàm khởi tạo được sử dụng:
public Sprite(final float pX, final float pY, final ITextureRegion pTextureRegion, finalVertexBufferObjectManager pVertexBufferObjectManager) (1)
public Sprite(final float pX, final float pY, final float pWidth, final float pHeight, final ITextureRegion pTextureRegion, final VertexBufferObjectManager
pVertexBufferObjectManager) (2)
Trong đó:
+ pX, pY: là tọa độ bắt đầu của Sprite đặt trong Scene
+ pWidth, pHeight: là kích thước chiều ngang và chiều dọc của Sprite
Trong trường hợp sử dụng hàm khởi tạo (1), tức là không khai báo pWidth, pHeight thìkích thước của Sprite sẽ chính là kích thước của đối tượng ảnh được nạp vào
+ pTextureRegion: là tấm hình sẽ được nạp vào cho Sprite đó
+ pVertexBufferObjectManager: là đối tượng quản lý bộ đệm để tải các dữ liệu về đồhọa Thông thường được khai báo là mGame.getVertexBufferObjectManager()
b AnimatedSprite
Để tạo được một Sprite động (ví dụ AnimatedSprite true_SP với đồ họa như hình 2.1),thay vì dùng Sprite thông thường, ta cần sử dụng AnimatedSprite
Hàm khởi tạo được sử dụng:
AnimatedSprite(final float pX, final float pY, final ITiledTextureRegion
pTiledTextureRegion, final VertexBufferObjectManager pVertexBufferObjectManager) (1)AnimatedSprite(final float pX, final float pY, final float pWidth, final float pHeight, final ITiledTextureRegion pTiledTextureRegion, final VertexBufferObjectManager
pVertexBufferObjectManager) (2)
Trong đó:
+ pX, pY: là tọa độ bắt đầu của AnimatedSprite đặt trong Scene
+ pWidth, pHeight: là kích thước chiều ngang và chiều dọc của Sprite
Trong trường hợp sử dụng hàm khởi tạo (1), tức là không khai báo pWidth, pHeight thìkích thước của AnimatedSprite sẽ chính là kích thước của đối tượng ảnh được nạp vào
+ pTiledTextureRegion: là tấm hình tiled sẽ được nạp vào cho AnimatedSprite đó
Trang 22+ pVertexBufferObjectManager: là đối tượng quản lý bộ đệm để tải các dữ liệu về đồhọa Thông thường được khai báo là mGame.getVertexBufferObjectManager().
2.3.4 Font
Trong game chắc chắn bạn sẽ phải sử dụng những đoạn text để thể hiện nội dung, ví dụhiển thị dialog, đưa ra trợ giúp cho người chơi Thay vì sử dụng font mặc định của hệ thống,AndEngine cũng cho phép chúng ta sử dụng font tùy chọn của riêng bạn Điều này vừa tạo ranét riêng cho game, đồng thời tăng hiệu quả về đồ họa cho game
Hình 2.7: Ví dụ về font UVFBarmBrack.ttf được sử dụng trong PTITit Game
Để thay đổi một font chữ cho đối tượng trong AndEngine, chúng ta sử dụng class Font
Việc cài đặt và tải font được thực hiện trong phương thức onCreateResources().
Cách khai báo được sử dụng:
Font createFromAsset(final FontManager pFontManager, final ITexture pTexture, finalAssetManager pAssetManager, final String pAssetPath, final float pSize, final booleanpAntiAlias, final int pColor)
+ pAntiAlias = true: bật chế độ anti-alias
+ pColor: màu sắc của chữ
2.3.5.Text
Sau khi đã tải xong font, chúng ta có thể sử dụng font đó để format cho các đoạn texttrong game AndEngine cung cấp cho chúng ta đối tượng Text để thể hiện các chuỗi kí tự.Việc sử dụng Text cũng tương tự như sử dụng một đối tượng Sprite, và được đặt trong
phương thức onCreateScene() của game activity.
Hàm khởi tạo được sử dụng:
Text(final float pX, final float pY, final IFont pFont, final CharSequence pText, final intpCharactersMaximum, final VertexBufferObjectManager pVertexBufferObjectManager)
Trang 23Trong đó:
+ pX, pY: là tọa độ bắt đầu của Text đặt trong Scene
+ pFont: là font đã được nạp trong phương thức onCreateResource()
+ pText: nội dung đoạn text
+ pCharactersMaximum: Số kí tự tối đa của text
+ pVertexBufferObjectManager: là đối tượng quản lý bộ đệm để tải các dữ liệu về đồhọa Thông thường được khai báo là mGame.getVertexBufferObjectManager()
2.3.6.Physics Box2D
a Sơ lược về PhysicBox2D
Trong phát triển game, cụm từ “vật lý” (physics) dùng để chỉ tập hợp mô phỏng cáctương tác vật lý giống với ngoài đời thực Không phải game nào cũng yêu cầu vật lý Ví dụnhững game câu đố, chúng ta không cần sử dụng bất kì yếu tố vật lý nào Tuy vậy, đây cũng
là một trong những thành phần quan trọng làm nên hiệu quả cho game, đặc biệt trong nhữnggame hành động
Trong AndEngine hỗ trợ một physics engine rất đầy đủ, được coi như một phần engine
mở rộng của AndEngine, có tên gọi là Physics Box2D Physics Box2D Engine ban đầu đượcviết bởi Erin Catto bằng ngôn ngữ C++ Kể từ khi ra đời đến nay, nó đã được dịch sang rấtnhiều ngôn ngữ lập trình, và áp dụng vào rất nhiều engine game 2D
b Các bước để thiết lập một thế giới vật lý trong game AndEngine
B1: Tạo một đối tượng PhysicsWorld.
Hàm khởi tạo được sử dụng:
PhysicsWorld(final Vector2 pGravity, final boolean pAllowSleep)
Trong đó:
+ pGravity: gia tốc trọng trường trong thế giới vật lý đó
+ pAllowSleep: cho phép mô phỏng trạng thái không hoạt động trong thế giới vật lý.Trong PhysicsBox2D có 3 trạng thái của một đối tượng trong PhysicsWorld là:
+ BodyType.StaticBody: Đối tượng nằm yên, không di chuyển
+ BodyType.DynamicBody: Đối tượng di chuyển và phản ứng với các đối tượng khác.+ BodyType.KinematicBody: Đối tượng di chuyển nhưng không bị ảnh hưởng bởi cácđối tượng khác
B2: Tạo một số mô phỏng đối tượng tĩnh, được thực hiên qua 2 giai đoạn.
+ Tạo ra hình khối cho đối tượng
+ Sau đó tạo trạng thái (body) cho đối tượng, rồi gán trạng thái này cho hình khối củađối tượng trong môi trường vật lý của chúng ta
B3: Gắn hình khối đã tạo ở trên vào trong Scene để hiển thị chúng.
B4: Kết nối các Sprite với vật lý thông qua PhysicsConnectors.
Trang 24B5: Đăng ký Box2D PhysicsWorld như một UpdateHandler cho Scene, qua đó ta có thể cập nhật trạng thái, vị trí các Sprite.
Hình 2.8: Tạo hình chữ nhật bao quanh là các StaticBody của level 2 trong PTITit Game
+ Tạo ra hình khối cho đối tượng
+ Sau đó tạo trạng thái (body) cho đối tượng, rồi gán trạng thái này cho hình khối củađối tượng trong môi trường vật lý của chúng ta
Chúng ta sẽ tìm hiểu kỹ hơn các sử dụng PhysicsBox2D trong game AndEngine ở các chương sau.
Trang 25CHƯƠNG 3 PHÂN TÍCH VÀ THIẾT KẾ ‘PTITIT GAME’
3.1 Giới thiệu chung
Tên game: PTITit Game
Là một game viết cho đối tượng sinh viên ngành công nghệ thông tin đã hoặc đang họctập trong Học viện Công nghệ Bưu chính Viễn thông
Game được chia thành 3 màn chơi tương ứng với 3 môn học:
+ Môn học 1: Lập trình C/C++;
+ Môn học 2: Lập trình Java;
+ Môn học 3: Lập trình Web
Trong mỗi môn học tương ứng sẽ có 2 level:
+ Level 1: mô phỏng một game câu đố, tính thời gian
+ Level 2: mô phỏng một game hành động có sử dụng vật lý, tính thời gian
Cách tính điểm (tối đa đạt được 100 điểm):
+ Khi bắt đầu, người chơi sẽ có 10 điểm làm vốn
+ Lần lượt trả lời 9 câu hỏi trắc nghiệm, với thời gian mỗi câu là 10 giây
+ Mỗi câu trả lời đúng, điểm số được cộng thêm 10 điểm và miếng ghép hình tương ứngvới câu hỏi đó sẽ được mở ra
+ Mỗi câu trả lời sai, điểm số bị trừ đi 5 điểm và chuyển sang câu hỏi tiếp theo
+ Bất kì khi nào điểm của bạn nhỏ hơn 0, màn chơi sẽ ngay lập tức kết thúc
+ Nếu hết 10 giây mà người chơi không đưa ra câu trả lời cho câu hỏi thì điểm số sẽ bịtrừ 5 điểm và chuyển sang câu hỏi tiếp theo, đồng hồ được bắt đầu đếm lại từ 10 giây
Người chơi được coi là vượt qua level này nếu đạt điểm số lớn hơn hoặc bằng mứcđiểm mà môn học đề ra Tương ứng với mỗi màn chơi (hay môn học) sẽ yêu cầu một mứcđiểm khác nhau, và độ khó tăng dần:
+ Môn học 1 (Lập trình C/C++) yêu cầu 35 điểm để vượt qua
+ Môn học 2 (Lập trình Java) yêu cầu 50 điểm để vượt qua
Trang 26+ Môn học 3 (Lập trình Web) yêu cầu 65 điểm để vượt qua.
3.2.3 Thiết kế chi tiết
3.2.3.2 Phác thảo giao diện của level 1:
Hình 3.1: Giao diện phác thảo Level 1
Trong giao diện phác thảo Level 1:
+ Phần (1) là dự kiến phần đặt hình ảnh Các miếng ghép được đặt phía trên hình ảnh
đó, và yêu cầu phải che kín bức hình phía dưới
+ Phần (2) là dự kiến phần đặt câu hỏi Các phương án trả lời được đặt ở các phần (A),(B), (C) tương ứng
+ Phần (Thời gian + Điểm) là dự kiến phần bố trí hiển thị điểm số và thời gian
+ Ngoài ra, để giao diện không bị trống, cần set ảnh nền cho màn hình phía sau
3.2.3.3 Code
Trang 27Hình 3.2: Cấu trúc các thành phần của Level 1
a LaunchLevel1.java
Là phần thân chính của game, một lớp được extends từ SimpleBaseGameActivity củaAndEngine GLES2 Đây là nơi nạp dữ liệu ban đầu, tải các tài nguyên, sắp xếp và phân bổ vịtrí cũng như kích thước các đối tượng
Một số phần trong source code:
+ Khai báo biến:
Hình 3.3: Các biến sử dụng trong LaunchLevel1.java
Các biến sử dụng trong LaunchLevel1:
mHinhNen: đối tượng này sẽ tạo ảnh nền cho Level1
mKhungHinhAnh: đối tượng này thể hiện phần (1) trong giao diện phác thảo Level 1(Hình 3.1)
mKhungCauHoi: đối tượng này thể hiện phần (2) trong giao diện phác thảo Level 1(Hình 3.1)
timer: luồng điều khiển đếm ngược thời gian
mThoiGianDemNguoc: là một đối tượng chứa đoạn text thể hiện thời gian đếm ngượctrong game, được biểu diễn ở phần (Thời gian) trong giao diện phác thảo Level 1 (Hình 3.1).mDiem: là một đối tượng chứa đoạn text thể hiện điểm số trong game, được biểu diễn ởphần (Điểm) trong giao diện phác thảo level 1 (Hình 3.1)
+ Một số phương thức:
Phương thức onCreate(Bundle savedInstanceState);
Trang 28Đây là phương thức của một Activity thông thường, có tác dụng khởi tạo các thànhphần được sử dụng bên trong game.
Hình 3.4: phương thức onCreate() của LaunchLevel1.java
Phương thức onCreateEngineOptions();
Hình 3.5: Phương thức onCreateEngineOptions() của LaunchLevel1.java
Các biến sử dụng trong onCreateEngineOptions():
o mCamera: khởi tạo một Camera mới với kich thước màn hình làCAMERA_WIDTH x CAMERA_HEIGHT Hai biến này có giá trị tương ứngvới kích thước chiều dài và chiều rộng của màn hình thiết bị di động, được xử lýtrong lớp Config
o engineOption: Khởi tạo và truyền các thuộc tính tùy chọn cho engine Các thànhphần bên trong đã được trình bày ở phần 2.3.1.b khi nói về EngineOptions
Trang 29Phương thức onCreateResources();
Hình 3.6: phương thức onCreateResources() của LaunchLevel1.java
Nhiệm vụ của phương thức này là nạp dữ liệu về các thành phần vào game trước khigame được bắt đầu
Phương thức onCreateScene();
Hình 3.7: phương thức onCreateScene() của LaunchLevel1.java
Nhiệm vụ của phương thức này chính là xây dựng màn chơi Scene bằng việc add cácđối tượng vào Scene và hiển thị
b HinhNen.java
Lớp HinhNen.java tạo ra hình nền cho Level1 bằng cách nạp bức ảnh có đường dẫn là
‘jpg_filename’ vào trong mTextureRegion Sau đó tạo một Sprite background_SP có kíchthước bằng kích thước màn hình để hiển thị hình nền đó ra Scene
c KhungCauHoi.java
Trang 30Lớp KhungCauHoi.java tạo ra phần hiển thị câu hỏi thông qua Text Có 3 button A, B,
C tương ứng với 3 cách trả lời cho câu hỏi Có 3 đối tượng Text thể hiện nội dung của 3 đáp
án được đặt bên cạnh các button Câu hỏi và nội dung các đáp án được lấy ra theo thứ tự ngẫunhiên từ cơ sở dữ liệu Và đảm bảo 2 lần chơi khác nhau không lấy ra cùng 1 tập câu hỏi
Hình 3.8: Thể hiện của lớp KhungCauHoi.java trong Level 1
d KhungHinhAnh.java
Lớp KhungHinhAnh.java tạo ra phần hiển thị bức hình cùng các miếng ghép hình chephía bên trên Mỗi miếng ghép là một AnimatedSprite được load từ một hình ảnh riêng CácAnimatedSprite này sẽ không thay đổi trạng thái khi người chơi đang không trả lời câu hỏitương ứng, và sẽ nhấp nháy nếu điều ngược lại xảy ra
Hình 3.9: Thể hiện của lớp KhungHinhAnh.java trong Level 1
e ThoiGianDemNguoc.java và Diem.java