Nhưng việc pháttriển game riêng cho từngnền tảng hệ điềusẽ tốn rất nhiều thời gian vàcôngsứccùa các lập trình viên.Và thật lãng phí khi một tựa game hay lại chi xuất hiện trên một nền tá
Trang 1ÚNG DỤNG XÂY DỤNG GAME ĐUÓI BẮT
Chuyênngành: Côngnghệ thông tin
ĐỒÁN TỐT NGHIỆP ĐẠIHỌC
HàNội-Năm 2014
Trang 2TẠ VĂN DẬU
NGHIÊN CỨU ENGINE GAME COCOS2D-X LẬP TRÌNH GAME
MOBILE ĐA NÈN TẢNG.
ÚNG DỤNG XÂY DựNG GAME ĐUÓI BÁT
Chuyênngành: Công nghệ thông tin
Cán bộ hướng dần:Ths.MaiThị Thúy Hà
ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC
HàNội - Năm 2014
Trang 3NHIỆM VỤ CỦA ĐÒ ÁN TỐT NGHIỆP
Họ và tên : Tạ Văn Dậu Giới tính : Nam
Ngày, tháng, năm sinh : 02/02/1993 Nơi sinh : Vĩnh Phúc
Chuyên ngành : Công nghệ thông tin Mãsố :
1 TÊN ĐÈ TÀI
Nghiên cứu engine game cocos2d-x để lập trình gamemobile đa nềntảng, ứngdụng vào làmgameĐuổi bắt
Nhiệm vụ cụ thể cùađồántốtnghiệp:
- Tìm hiểu và nghiên cứu engine game cocos2d-x
- Phân tích vàxác định cácyêucầuđối với game mobile
- Xâydựng game Đuối bắt
- Triển khai đa nềntảng
5 CÁN Bộ HƯỚNG DẲN: Ths Mai Thị Thúy Hà
Nội dungvàđềcương Đồ án đã được Hội đồngchuyên ngành thôngqua
Hà Nội, ngày thảng năm 2014
Mai Thị Thúy Hà
Trang 4phần cứng vàchạytrênnhiều nền tánghệ điều hành khác nhau Cáchệ điều hành phổ biếnhiện naycó thề kế đếnnhư là ÍOS (Apple), Android (Google),
Window Phone (Microsoft), Vi vậy nhu cầu ve phần mem nói chung và game mobile nói riêng ngày càng lớn Hiện nay thông thường cáclập trình
viênchi phát triến gametrênmộtnền táng sau đómới phát triền cho các nền
tảng khác, côngviệcnày tốn rất nhiều thời gian và công sức cho các nhàphát
triển trong việcbảo tri, nâng cấpphần mem,game Vì vậy việc lập trìnhgame
đanềntáng là mộthướng đi mới,phải vận dụng kiến thứctrên nhiềuhệđiềuhành,trên nhiều nềntảng Hiện nay có rất nhiềuengine-game ra đời phục vụ
choviệclập trình game đa nền tảng như: Unity, Appcelcrator Titanium, Game
Salad, SpriteKit, Cocos2D,Cocos2d-X Vi vậy em đã lựachọn nghiên cứu
mộtloại engine-gametrongđồ ántốt nghiệp đạihọc cùamình Và đềtài tốtnghiệp của em là: “Nghiên cứu engine game Cocos2d-Xđê lập trinh game
mobile đa nền tảng, ứng dụng làm làm game Đuổibắt “
Em xingửi lời cám ơn đếncác Thầy, Cô khoa Côngnghệ Thôngtin
trường Viện Đại học Mớ HàNội đã tậntình dạy dồ, dìu dắt em suốt bốn nămđại học,các thầy đã cho em những kiến thức và kinh nghiệm cần thiết nhất đế
có the thực hiện đề tài này Em xin gửilờicám ơn chânthànhtới Ths Mai Thị Thúy Hà, người hướng dẫn, giúpđỡ, động viên em hoàn thành đồ án
này
Dothời gian cóhạn, kiếnthức và kinh nghiệm củabân thâncòn hạn che,
đồán còn nhiều thiết sót,em mong nhận được những ýkiếnđónggópquýbáu từ thầy cô và các bạn đồng nghiệp đe đồ án được hoàn thiện hơn
Emxin chân thành cảm ơn !
Trang 5Chương 1 1
TỐNG QUAN VÈ ĐÈ TÀI 1
1.1 Đặt vấn đề 1
1.2 Mục tiêu và phạm vicủađề tài 1
1.3 Đối tượng và phương phápnghiên cứu 2
Chương 2 3
CÔNG NGHỆ SỬ DỤNG PHỤC vụ ĐÈ TÀI 3
2.1 Ngôn ngừ lậptrìnhC++ 3
2.1.1 Kháiniệm về lậptrình hướng đốitượng 3
2.1.2 Phương pháp lập trình hướng đối tượngtrong C++ 3
2.2 Tìm hicu engine game cocos2d-x 5
2.2.1 Kháiniệm game engine 5
2.2.2 Game engine Cocos2d-X 6
2.3 Công cụTileMap và ứngdụngtrong Cocos2d-X 27
2.3.1 TileMap 27
2.3.2 TilcMap trong lập trình Cocos2d-X 29
Chương 3 32
PHÂN TÍCH VÀ THIÉT KÉ HỆ THÓNG 32
3.1 Xây dựng ý tưởng 32
3.2 Kịch bảngame 33
3.3 Phân tích hệ thống game 35
3.3.1 Qui trình xửlý 35
3.3.2 Mô hình tiến trìnhnghiệpvụ 36
Trang 63.4.1 Thiết kế Map 38
3.4.2 Thiết kếnhânvật 42
Chương 4 47
TRIÉN KHAI ĐA NỀN TẢNG 47
4.1 Xây dựng tròchơi trên Win32 47
4.2 Xây dựng trò chơi trên Android 50
4.3 Xây dựng trò chơitrên ÍOS 55
KÉT LUẬN 59
TÀI LIỆU THAM KHẢO 60
Trang 7- Chuyên ngành: Côngnghệ thông tin Khóa: 2011- 2015
- Cán bộ hướng dẫn: Ths Mai Thị Thúy Hà
- Tên đề tài:Nghiên cứu engine gamecocos2d-xlập trình gamemobile
đa nền táng, ửngdụngvào làm game “Đuổibắt”
- Tómtắt đề tài:
Nghiên cứu engine gamecocos2d-x phiên bán 2.2.3 vớingôn ngữ lập trình C++ Tìm hiểu và ứngdụng công cụ tạo bán do game - Tilemaptronglậptrình game với cocos2d-x.Xây dựnggameđuồi bắtdựatrên các đối tượng đã nghiên cứu ởenginegamecocos2d-x Triển khai game trên
các nền tảng hệ điềuhanh di động như Android, iOSvà Window Phone
Trang 8STT Tên viết tắt Tên đầyđủ Dịchđầyđùra tiếng Việt
1 ADT Android Development Tools
Bộcôngcụpháttriến Andoroid
2 NDK Native DevelopmentKit Bộcôngcụphát triến
5 PC Personal Computer Máy tính cá nhân
6 RAM Random Memory Access Bộ nhớtruy cậpngẫu
nhiên
Trang 9Hình 2.2 Code trong hàm applicationDidFinishLaunching 8
Hình 2.3 Sơ đồ lớp CCNode 12
Hình 2.4 Hệ thống tọa độ trong cocos2d-x 13
Hình 2.5 Ví dụ về thiếtlập AnchorPoint trong cocos2d-x 14
Hình 2.6.Một Scene game đơn giàn 15
Hình 2.7 Sơ đồcấu trúc cây Scene 16
Hình2.8.Thuộc tính Zorder của sprite 20
Hình 2.9 Thựchiện animation cho sprite 20
Hình 2.10 Thựchiện lần lượt animation chomộtsprite 21
Hình 2.11 File pngcúa font fnt 26
Hình 2.12 CCLabelBMFont(tren) và CCLabelTTF(dưới) 27
Hình2.13Các thuộctínhcủa1Object trong TilcMap 28
Hình2.14 Các đối tượng cần chú ý trongtilemap Editor 29
Hình2.13 Cácđối tượng trong ObjectGroup “object” 30
Hình 3.1 Quy trình xừlý game 35
Hình3.2 Môhìnhtiếntrình nghiệp vụ 36
Hình3.3Sơ đồ Activity Diagram 37
Hình 3.4 Tạo một tilemap mới 38
Hình 3.5 Add backgroudLayer 38
Hình3.6 Tạo tileset mới 39
Hình3.7 Thêmtileset mới 39
Hỉnh3.8.Các tileset 40
Hình 3.9 Thêm tileset vào map 40
Hình 3.10.TạoObjecttrong tilemap 41
Hình 3.11 Tạolayer xác định các va chạm 41
Trang 10Hình 3.14 Thiết kế cáctrạng thái cúanobita 43
Hình 3.15 Thiết kếcác vật cản 43
Hình 3.16 Giao diện Menu 44
Hình 3.17 Giao diện màn chơi 44
Hình 3.18 Giao diện màn chơi 45
Hình 3.19 Giao diện mànchơi 45
Hình3.20Màn hình kết quảgame 46
Hình3.21 Màn hìnhkết quá game 46
Hình 4.1 Thư mụccocos2d-x 47
Hình 4.2 Cấutrúc solutionCocos2d-X 48
Hình 4.3 Build solution Cocos2d-X 48
Hình 4.4 Debug 49
Hình 4.5.Khi build project thành công 49
Hình4.6.Thêm biến môi trường NDK 51
Hình 4.7.Thêm biếnmôi trường Cygwin 51
Hình 4.8 Import project DuoiBat vàthư việnlibcocos2dxvào eclipse 52 Hình 4.9 Import project hcllococos thành công vào eclipse 52
Hình 4.10.Android.mk 53
Hình 4.11 Buildprojectthànhcông trong eclipse 53
Hình 4.12.Buildrafile apk thànhcông 54
Hình 4.13 Mở project iOS 55
Hình4.14 Cấu trúc thư mục project cocos2d-x-ÍOS 56
Hình 4.15 Thêm Resource 57
Hình4.16 Chọn iPhone Simulator 57
Hình4.17.Buildthànhcông 58
Trang 11Chương 1TÓNG QUAN VÈ ĐÈ TÀI 1.1 Dặt vấn đề
Ngày nay khi đờisống, xãhội ngày càngphát triểnvàmứcsống cúa conngười ngày càngđược nâng cao, cải thiện và cùngvới đó làviệc phát
triềnmạnh mẽ và phố cậpcúa các dòngđiện thoại thông minh thì nhucầugiái trívà chơi game trên di động của mọi người ngày càng tăng và phát triểnmộtcách chóng mặt Nhưvậytrong thời gian sắptớithị trườngứng dụng và game
diđộngsẽ rất phát triển,và để bắt kịpxu thế đóemchọn cho mình một hướng
đi là lập trình gameđi động
Nhưng việc pháttriển game riêng cho từngnền tảng hệ điềusẽ tốn rất
nhiều thời gian vàcôngsứccùa các lập trình viên.Và thật lãng phí khi một
tựa game hay lại chi xuất hiện trên một nền táng như Androidhoặc ÍOS Đế
khắc phục điều đó hiện nay có rất nhiều bộ thư viện phát triếngame được gọi
là các engine game hỗ trợ việc phát triển game trênnhiều nền tảng trong cùngmột thờigian Trong đó cóenginegamecocos2d-x
Chính vì vậy em chọn đề tài nghiên cứu engine gamecocos2d-xđe lập trình game đi động đa nền táng vớimong muốncóthếlập trình được những game chất lượng vàcóthể chạy được trênnhiều nền táng hệ điềuhành khácnhau
1.2 Mục tiêu và phạm vi của đề tài
4- Mục tiêu
Tìm hiếu được cấu trúc, nguyên lý hoạtđộng, các thành phần cơbànvà
cách sửdụng engine gamedi động đa nền tăng cocos2d-x
Trang 12Tìm hiếu và áp dụng được enginegamecocos2d-xđếlậptrình game trêncác hệ điệu hànhĨOS và Android.
Lập trình được game trên hệ điều hành android, iOS có lối chơi đơn gián,tiết tấu nhanh và cách chơiđộc đáo, cuốnhútngười chơi
ứng dụng cácnghiên cứu đế đivào lập trình game“Đuốibắt”
4- Phạm vi đề tài
Nghiên cứu engine game cocos2d-x phiên bàn 2.2.3 với ngôn ngừ lập
trình C++
Tậptrung lập trinh vàtối ưugame trên hệ điều hành androidvà iOS
1.3 Đối tượng và phương pháp nghiên cứu
4- Đốitượng nghiên cứu
- Ngôn ngữ lập trình C++
- Engine game cocos2d-xphiên bán 2.2.3
- Công cụ TilcMap và ứng dụngtrong cocos2d-x
- Cácđối tượng can de trien khai game trên hệ điều hành Android
- Cácđối tượng cần đề triển khai trên hệ điều hành ÍOS
4- Phương pháp nghiên cứu
- Đọc,hiểu engine game cocos2d-x
- Phân tích và thiết kế hệ thống gametheo hướng đốitượng
- Từ nhữngphântích đó,tông hợplạiđê xây dựng game
Trang 13Chuông 2 CÔNG NGHỆ sủ DỤNG PHỤC vụ ĐÈ TÀI
2.1 Ngôn ngữ lập trình C++
2.1.1 Kháiniệm vềlập trình hướng đối tượng
Lập trình hướng đối tượng (gọi tắt là OOP, từ chữAnh ngừ object-
oriented programming),hay còn gọi làlập trình địnhhướng đối tượng, làkĩ thuật lậptrình hỗ trợ công nghệ đối tượng.OOPđược xem là giúptăngnăngsuất, đongiàn hóađộ phức tạpkhi bảo trìcũngnhưmởrộngphần mềm bàng
cách cho phép lập trình viêntập trung vào các đối tượng phần mềm ở bậc caohơn Ngoài ra, nhiều người còn chorằng OOP dễ tiếpthu hơn cho những
ngườimớihọc về lập trình hơn làcác phương pháptrước đó
Một cách giản lược, đây làkhái niệmvà là mộtnồ lực nhằm giám nhẹ cácthao tác viết mã cho người lập trình, cho phép họtạo ra cácứng dụng mà các yếu tố bên ngoài cóthếtương tác với các chương trình đó giống nhưlàtương tácvớicác đối tượng vật lý
Những đối tượng trong mộtngôn ngữ OOP là cáckết hợp giữa mã vàdừ liệu mà chúng được nhìn nhận nhưlà một đơn vị duy nhất Mỗi đối tượng có một tênriêng biệt và tấtcả cáctham chiếu đến đối tượng đó đượctiến hành
qua tên cùa nó Như vậy, mỗi đối tượng có khảnăng nhận vàocác thông báo,
xứ lýdừ liệu (bên trong cúa nó),và gửira haytrá lờiđến các đối tượng khác hayđếnmôi trường
2.1.2 Phươngpháp lập trinh hướng đối tượng trong C++
Kháiniệm trung tâm của lập trình hướng đối tượng làlóp (class).Cóthexem lớplàsự kết hợp các thành phần dữ liệu và các hàm Cũng có thê
Trang 14xem lớplà sự mở rộng của cấu trúctrong c(struct) bằng cách đưa thêm
vào các phương thức (method) hay cũng gọi là hàm thành viên (member function) Mộtlớpđược định nghĩanhưsau:
Class Tên Lớp
{
// Khai háo các thành phần dữ liệu
//Khai báo các phương thức
};
Cácphương thức cóthếđược viết(xây dựng) bên trong hoặc bênngoài
(phíadưới) phần định nghĩa lớp cấu trúc(cách viết)phương thức tươngtự
như hàmngoại trừquy tắc sau: Khi xây dựng một phương thức bênngoài
địnhnghĩa lớp thì trong dòngđầu tiên cần dùng tên lớp và 2 dấu : đặt trướctên phươngthức đềchi rừ phương thứcthuộc lớp nào)
Sửdụng các thànhphần dữ liệutrong phương thức:Vì phương thức và các thành phần dừ liệu thuộc cùngmộtlớpvàvì phương thức đượclập lên cốt
đexứlý các thànhphầndữliệu, nêntrong thâncùa phươngthức có quyền
truynhậpđến các thànhphần dữ liệu (củacùnglóp)
Biến lớp: Saukhi định nghĩamộtlớp, cóthế dùng tên lớpđe khai báo các biến kiều lớp hay cũnggọi làđốitượng Mỗiđối tượng sẽcó các thành phầndừ liệuvà các phương thức.Lời gọi một phương thức cầnchứa tên đối
tượng để xác địnhphương thức thựchiện từ đối tượng nào
Mộtchương trình hướng đối tượng sẽ baogồm các lópcóquanhệ vớinhau
Việc phân tích, thiết kế chương trình theo phươngpháp hướng đốitượng nhằm thiếtkế,xây dựngcác lóp
Trang 15Từ khái niệm lớp nẩy sinh hàngloạtkhái niệm khác như: Thành phần
dữ liệu,phương thức, phạm vi, sự đóng gói,hàm tạo, hàm huý,sự thừa kế,
lớpcơ sử, lớp dẫn xuất, tương ứng bội, phương thức ảo,
Ưu điểm của việcthiết kế hướng đối tượng là tập trungxác định các lớp
đe mô tảcác thực the của bài toán Mỗilớpđưa vào cácthành phầndữ liệu cùa thực thể và xây dựng luôn các phương thức đểxử lý dữ liệu Nhưvậy
việc thiết kế chương trình xuất phát từ các nội dụng, các vấn đề của bài toán.Các ngônngữ thuầntuý hướng đối tượng (như Java, Objective-C) chỉ
hồ trợ các khái niệm về lớp, không có các khái niệm hàm
C++ làngônngừ lai , nóchophép sứdụng cá các công cụ cúalớpvà hàm
2.2 Tìm hiểu engine game cocos2d-x
2.2.1 Khái niệm game engine
Game enginelà một bộ thư viện được viết đế thiết kế và phát
triển video game,hiểu đơngiản nó là loại phầnmềmtrung giankết nốitương
tác cùa nhiều ứng dụng trongcùng 1 hệ thốngvới nhau Có rất nhiều loại
game engine dùng đếthiếtkế game chocác hệmáy như hệconsoles hay máytính cá nhân(PC) Chức năng cốt lõi của game engine phần lớn nằm trong
công cụ dựng hình (kết xuấtđồ họa)cho các hình ảnh2chiều (2D)hay 3
chiều(3D), công cụvật lý (hay côngcụ tính toán và pháthiện va chạm), âmthanh,mã nguồn, hình ánh động (animation), trítuệ nhântạo, phân luồng, tạo
dòng dữ liệuxứ lý,quán lý bộ nhớ,dựng ánh đồ thị, vàkết nối mạng Quá
trình phát triển gametiết kiệm được rấtnhiều thời gian và kinh phívào việc
tái sửdụng vàtái thích ứng một engine đê tạo nhiêu game khác nhau
Trang 162.2.2 Game engine Cocos2d-X
Cocos2d-X làmột gameengine hồ trợ đa nền tảng do các lập trình viênTrung Quốc phát triên, được viết trên nềnbộ thư viện đồhọa Open GL.Cocos2d-Xhồ trợ chủyếu3 ngôn ngừ : C++, lua và javascript
Website: http://cocos2d-x.org
Đâylà game enginemã nguồn mở, hồ trợ môi trường lậptrình trên các
hệ điềuhành PCnhư Window,MacOS X, Linux
Cocos2d-X hồ trợ phát triển game cho các nền táng di động như:
Android, iOS, Windows Phone 8,Black Berry, Tizen và còn có the phát triển game cho các hệđiều hành PC như Window, Mac osx, các hệ điều hành nhân Linux
Có 1 phiên bảndànhriêng cho phát triền game trênhệđiều hành ÍOS là Cocos2d
CóI bộ công cụ Cocostudio hồtrợ tạo giaodiện, animation
2.2.3 Các thànhphần cơ bảncúa Cocos2d-X
Trang 172.2 3.1 Cấu trúc mộtchươngtrình trongcocos2d-x
Hình 2.1 Cấutrúc 1 chương trìnhtrong cocos2d-x
Như hầu hếtcác chương trìnhmáytính khác, mọichương trình khi viết
mã đều có một điểm khới động được gọilà hàm main Trong cocos2d-x điểm
khởi động chươngtrình được bắt đầu bằng việc: Khi 1 chương trìnhđược khới động trong engine thì sẽ bắt đầu khởi tạo 1 đối tượng từClass này:
AppDelegate.h
Vìvậy khixây dựng game, ta cóthe tố chức chươngtrình theo ý muốn
cùa chúng ta nhưng bắt buộc phải bắt đầu từ Class này
Có3 hàm thành viên của lópnày phải viết lại (override):
virtual boo! applicationDidFinishLaunchingO;
Trang 18virtual void applicationDidEnterBackground();
virtual void applicationWillEnterForeground();
bool AppDelegate:: applicationDidFinishLaunching( ) {
// initialize director
CCDirector* pDirector = CCDirector:: sharedDirector () ;
CCEGLView* pEGLView CCEGLView:: sharedOpenGLView( ) ;
pDirector->setOpenGLView(pEGLView);
// turn on display FPS
pDirectoi — >setDisplayStats (true);
// set FPS the default value is 1.0/60 if you don't call this
pDirectoi — >setAnimation!nterval(1.0 / 60);
// create a scene, it’s an autorelease object
CCScene *pScene = HelloWorld:: scene( ) ;
// run
pDirector->runwithscene(pScene) ;
return true;
Hinh 2.2 Code trong hàm applicationDidFinishLaunching
virtual boo! applicationDidFinishLaunchingO;
• Đây là hàm đầu tiên mà chương trình game sẽ chạy nếuđược khởi tạo
Nó được chạy khi chươngtrìnhhoàn tất việc load dữliệu
• Tại đâyta bắt đầu khởi tạo mànhình đầu tiên mà ta thiết kế Cụ the là 1 scenenào đó
• Từ hàm này ta có thế nhìn thấy 2 đối tượng quan trọng củaengine
game cocos2d-x đó làCCDirector vàCCScense Directorquán lý toàn
bộchươngtrình và Scene đạidiệncho một màn hìnhđang chạy
• Có thể nói hàm này được khởi chạy giống như hàm onCreateO trong
Activity được khai báo LAUNCHERtrong Android
virtual void applicationDidEnterBackground();
• Hàm này sẽ đượcgọikhi mà chương trình đang hoạt động mà bị hệ
Trang 19điều hành tạm dừng lại(Pause)lại để dànhtàinguyên phục vụ cho mộttiến trình được ưu tiên hơn.
• Ví dụ một trườnghợp: Khita đang chơigame Có 1 cuộcgọiđến, hoặc đang chơi tabấm phím Hometrênđiệnthoại Các việcnày làm cho
chương trìnhđi vào cheđộ nền
• Ớ hàm này ta thường sẽ xử lý 1 số việc như: dừng tất càcácanimation,hiệuứng, âm thanh lại
virtual voidapplicationWillEnterForegroundO;
• Ngược lại với hàm applicationDidEnterBackgroundO, đây là hàm sẽ
được gọi khi mà chúng taactive lại chương trình Cónghĩa làkhitrước
chúngta dừng game lại đế nghe điệnthoại, saukhi kếtthúccuộc gọi,
hệ điều hành sẽ tiếp tục chạy cáctiếntrình liên quan đến game
• Khi hàm này được gọi, ta sẽ khôi phục các thông số của game như trước khiđi vàoche độ nềnđecó the tiếp tục game
2.2.3.2 CCDirector
CCDiector là phần quantrọng nhấtcùa engine game Lớp CCDirector là một lớpsingleton, nghĩa làchỉ có duynhấtmộtthể hiệncủa lớp nàyờmọithời điểm và nócó thố được truy xuất toàncục bằngcáchgọi:
CCDirector* pDirector = CCDirector: :sharedDirector() ;
Lớp CCDirector chứa các thiết lập toàn cục cho cocos2d-x và quản lý
các Scenestrong cocos2d-x Một số chức năng củalớp CCDircctor:
• Truy xuất vào Scene hiện tại trênmàn hình
• Khởi chạy một Scene, thaythế một Scene đang chạy bằng một Scene khác, pushing và poppingmột Scene từ stack (ngăn xếp) các Scene cùa chươngtrình game
Trang 20• Truy xuất các thiết lập của cocos2d-x như kích thước cùa mànhình
đang chạy, lấy ra cácanimation đanghoạt động và nhiều các thiết lập
khác
• TruyxuấtvàoOpenGLView vàwindowtrongcocos2d-x
• Hỗ trợpause (tạm dừng), resume (khôiphục) và ending game
• Xác địnhcách mà trạng thái game được update (cập nhật)
Một số phươngthứchay dùngtronglớp CCDirector:
o pDirector->setOpenGL View(CCEGL View*);
o pDirector- >setDisplayStats (true);
Khới tạo mộtnode:CCNode *childNode = CCNode::create();
Thiết lập tag cho một node:childNode->setTag(123);
Trang 21Lấymột nodebàng tag:parerìtNode->getChiỉdByTag(123);
Add nodevàonode cha: parentNode->addChiỉd(childNode);
Xóamột nodebằngtag, cleanup sẽ dừng toànbộ cácaction đang chạy
parentNode->removeChildByTag(1 23 ,true);
Xỏatất cácácnode từ node cha
parentNode->removeAUChildrenWithCleanup(true);
Lưu ý: Neumộtvài Nodecó giá trị tag giống nhau,hàm getChildByTag
sẽ trá vềnode đầu tiêncó đượcgánvới giá trị tag đó Các nodecòn lại sẽ không thế lấy về được Vìvậynên tạo mỗi nodecó giá trịmột tag duy nhất
Trang 22Hình 2.3 Sơ đồ lớp CCNode
2.2.3.4 Hệ tọa độ và AnchorPointtrong cocos2d-x
Trong cocos2d-xthì mặc định mànhình mà ta nhìn thấy sẽ có gốc tọa độ nằm ở gócdưới cùng bên trái và có tung độ và hoành độ lầnlượtsẽlà kích
thước chiều cao, chiều rộngcủamànhìnhđiện thoạimà bạn sử dụng
AnchorPoint (điểmneo):
• Mọi nodeđều có 1 điếm neo, sẽ có 1 chút khác biệt nếunode đó là
Trang 23mộttexture hay CCSprite hay CCLabelTTF Mặcđịnhđiểm neolà (0.5,0.5)tức là ở giữa texture.
• Sứ dụng anchorPoint không làm ánh hưởng đến tọa độ của mộtNode, chúng chi thay đôi cách mà texture được vẽ lên màn hình
hiến thị sovớitọa độcủanode đó
• Cáchdùng:myNode->setAnchorPoint( );
Hình 2.4.Hệ thống tọa độtrongcocos2d-x
Ví dụ với các dòng lệnhthiết lập điếm neo cho một Sprite như sau, ta sẽ
đượckếtquảnhưhình bên dưới (hình 2.4 theo thứ tự từ trái quaphải):
sprite->setAnchorPoint( CCPointZero );
sprite->setAnchorPoint( ccp(0.5f, 0.5f) );
sprite->setAnchorPoint( ccp(l,l) );
Trang 24Sprite: anchor point
Hình 2.5 Ví dụvề thiết lập AnchorPoint trongcocos2d-x
CCSceneđại diện cho một mànhình ứng dụng chạytại một thờidiêm
Vàtrong cocos2d-x tại một thời điếmchỉcómột Scene được chạy Giống nhưtrong Android thì tại một thời điếm chi cómộtActivityđược chạy
Một đối tượng Scene luôn là đối tượng đau tiên trong sơ đồ Scene
Trong cocos2d-x, một Scene là một đổi tượng trừu tượng và lớp CCSccnechứa các hàm ảo(giống overridetrong Java)
Trong hình dướiđây,chúng ta sẽ thấy có ba Layer giúpchúng ta xử lýviệc vẽ cácSprite theo thứ tự bàng cách phân chia nhóm các đối tượngcó liên quan với nhau:layer background, layer các đối tượng trong game vàlayer các
phím điều khiến Sứdụng nhiều lớp trong một scene giúpchúngta nếu muốn
ânđitoàn bộ các nodetrong layer nào đó hoặc di chuyênlayer đó thinó sẽdi
Trang 25chuyển toàn bộ các node trong layerđó, hoặc sắp xếp lại các layerđể các node đượcvẽở phía trước hoặc phía sau cácnode cùa một layer khác Thậmchíchúng ta có thê xoay hoặcthay đỏi tỉ lệ, kích thước cúamột layervànó
cũng sẽ ánh hưởng đến toàn bộcácnodebên tronglayer đó
Hình 2.6 Một Scenegame đơngiản
Game scene sứ dụng các layer cũnggiốngnhưtasứ dụng các chương
trình chình sửaảnh như Photoshop đểchinh hìnhánh Tuynhiên, cácNode
trongmỗi Layer không phải lúccũng tĩnh
Một đối tượng Scene thựcsự chỉ chứacác Layer, giống như các Layer
chi chứa cácđối tượng kế thừa từ CCNode Mồi Node cóthề xử lý logic,
Scene, Layer, các Noderiêng lé, Sprite, Label vàhơnthế nữa,hoàn toàn phụ thuộc vàocách chúng talập trình
Hệ thốngcây Node dưới đây gọilà sơ đồ Scenevànó có cấu trúcdạng
cây giống với composite design pattern:
Trang 26Khới tạo một CCScene:CCScene *pScene = CCScene::create();
Khớichạy khi bắt đầu chương trình: pDìrector->runWìthScene(pScene);
Thay thế một Scene khác: pDirector->replaceScene(pScene);
Lay Sceneđang chạy hiệntại:pDirector->getRunningScene();
Công việcchính của Scene là tạo môi trường để chứacácCCNode khác
Vàhiến thị các Node đó lên giaodiệnthông qua hàm addChild(CCNode*).CCSene add được các đối tượng đồ họa như CCLayer, CCSprite,CCLabelTTF, CCMcnu
Nhưng Scenekhông thê addđược1 Scene khác
Một số lưu ý về scene và memory:
Đối với hàm pushScenevàpopScene củaDirector,chúngthay thế Scene
cũ bangScenemới mà khônggiải phóng Scene cũ ra khóibộ nhớ
Ưu điểm: chuyến sangScenemới sẽ nhanhhơn dokhôngphái khớitạo
lạivùng nhớ cho Scenemới và giãi phóngScenecũ nữa
Trang 27• Nhược điếm: khi gặp các Scenephức tạp và chứa một lượng lớn RAMthìđiều nàydễ dần đến việcchương trìnhbị crash Ngoàira làchúng ta
phảinhớ có bao nhiêu scene chúng tađã push để khipop lại cho chính
xác
2.2.3.6 CCLayer
CCLayer là đối tượngquan trọng nhất cùa engine game cocos2d-x Mọi
thao tác người dùng đềucó thểthựchiệnở trên đối tượng này
Cũng gần giống như Scene, chúng ta không thể nhìn thấy CCLaycr
nhưng có thể nhậnbiếtsựtồn tại thông qua các đối tượngmà được CCLayerchứa nhưCCSprite,CCLabel
CCScene cũng có thếchứa được các đối tượng đồ họatrên nhưngnó chi
có thểchứađược Muốn thao tácđược với các đối tượng đó tacần phải sử dụng CCLayer
Vậy CCLayerlàmộtcontainer chứa cácđốitượng đồ họa cúa cocos2d-
X Layer giống nhưmộtinterface (giao diện) giúp người dùng có thề thao tác với game thông qua các sự kiện Touches vàomàn hình
Khới tạo 1 cclayer: CCLayer *pLayer = CCLayer::create();
Cácphương thức thường dùng của CCLayer
• setPosition(CCPoint)(Thiết lập vị trí cho layer)
• setAnchorPoint(CCPoint)(Thiết lập diem neocho layer)
• setTouchEnabled(bool) (Thiết lập trạng thái touchcho layer)
• setConteniSize(CCSize) (Thiết lập kíchthước cúa nội dung được
chứa tronglayer)
• setTag(int) (Thiết lập tag cho layer)
• addChild(CCNode) (Add một nodecon vào layer)
Trang 28Sau khi khởi tạo CCLayerthi ta sẽ sửdụng với hai việc là:
Add các đối tượng đồ họađế hiện thị với người dùng thông qua hàmaddChild(CCNode*) CCLayer có thế add được các đối tượng đồ họa như
CCSprite, CCLabel,CCMenu Cũng như add được mộtCCLayer khác
Và muốn hiền thị được các đối tượng đồhọa thì taphải add CCLayer
vào 1 CCScene đang chạy hoặc chạy CCSene
Thông thường một CCSccnc sẽ add nhiều CCLaycr khác nhau, một
chương trình game có thế chicần mộtCCScene vàcónhiềuCCLayer Vì vậy
mồiLayer sẽ có một nhiệm vụriêng
Lớp CCLaycr được thiết kếđế nhận các sự kiện touch (chạm vào mànhình) nếu chúng tathiết lập các sự kiện đó.Đe bắtcácsự kiệntouchchúng ta
thiếtlập thuộc tính chophép chạm vào màn hình cho CCLayer thông qua hàmthành viên cùalớp CCLayer: setTouchEnable(true)
Có3 hàm sự kiện chính được sứ dụng là:
Bool ccTonchBegan(CCTouch *pTouch, CCEvent *pEvent)
Đế xửlý sự kiện ngrrời dùng bắt đầuchạmvàolayer
Void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent)
Đe xứlý sự kiện người chơi di chuyến tay trên màn layer (drag-drop)
Void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
Xử lýsự kiệnkhi người dùng kết thúc việc chạm vào màn hình
2.2.3.7 CCSprite
CCSpritc là một lớpđược sử dụng phố biến nhất trong việc lập trình
game Nó sứdụng một hình ánh đêvẽ sprite đó lênmànhình Cách đơn giản
nhất để tạo một sprite là từ một fileảnhđược load thành một CCTexture2D.Cocos2d-X CCSprite cũng giống như sprite cứa những game engines
Trang 29khác Nó làmột hình ảnh2d có khả năng di chuyển, xoay, thay đổi kích thước, tạo hình ánh động vàthựchiện các phép biến đối khác.
CCSprite có the chứa các spritekhác như một thànhphầnconcủa nó
Khisprite cha đượcápdụngcác phươngthức biếnđổi thì tất cả những con của nó sẽ có tác động tương ứng
Spritecũngđượckế thừa từ CCNode nên nó có thế di chuyển bằng codehoặc dùnglớp CCActions
Các hàm thành viên hay dùng cúa lớp CCSprite
• create(const char* filename): tạo 1 sprite từ 1 file ánh (png, jpeg)
• setPosition(Ccpoint &point): thiết lập vị trí so với trongnode cha
• setScale(float fScale): thiết lập kíchthước chosprite
• setScaleX(float fScale): thiếtlập kích thước so với ánhgốc theo chiềungang với tỷ lệ íScale
• setScaìeY(float fScale):thiết lập kích thướcso vớiảnh gốc theochiều dọcvới tỷ lệfScale
• runActionfCCAction *action): chạy một hiệu ứng CCAction
Sau khi đã thiết lậpcác thông số cần thiết ta add sprite này vào mộtCCLayerhoặc một CCScene, hoặc 1Node có thể add đượcnó
Không chi CCSprite màtất cả cácđối tượng đồ họa từ cap Layer trở xuống đều có1 dữ liệu thành viên là ZOrder Dữliệunàycó ýnghĩa rấtquan trọng trong việctrình bàybố cụccùa game Dừ liệunàycóýnghĩa đối với
cácđối tượng là con (khôngphải cháu) của 1 đốitượngkhác Đối tượng nào
có zOrder cao hơnsẽ được hiến thị đè lên đối tượngcó ZOrder nhóhơn nếu
chúng cócùng vị trí
Trang 30Cocos2d-Xhỗ trợ rất nhiều cácđổi tượng animation ví dụ như:
• CCMoveTo: Di chuyển đối tượng đến 1 vị trí nhất định
• CCMoveBy: Di chuyển đối tượngđến 1 vị trí so vớivịtríđốitượng đangđứng
• CCScaleTo: Thay đổi kíchthước đối tượng đến I kíchthước nhấtđịnh.Tất cảcác Animation này đều có 1 dừ liệuthành viên là Duration (kiểu
float) Đâylà thời gianxác định thời gianhoàn thành animation đó
Để thực hiện Animationcho1 Spriteta làmnhưsau (hình 2.9):
CCSprite *_sprite =CCSprite::create("HelioWorld.png”);
CCMoveBy* jnoveBy = CCMoveBy::create(0.5, ccp(100,100));
CCMoveTo * jnoveTo = CCMoveTo::create(0.5, ccp(100,100));
CCScaleTo * scaleĩo = CCScạlẹTo::create(0.5, ccp(lB0,100));
-Sprite ->runAction(_moveBy);
-Sprite ->runAction(_moveTo);
sprite ->runAction(scaleĩo);
Hình 2.9 Thực hiện animation cho sprite
Như vậy trong 0.5 s thi _spritcsẽ hoànthành đồng thời cá 3 animation
trên
Trang 31Vậy làm thế nào đế đối sprite chạy lần lượt từng animation trên?
Ta sử dụng đối tượngCCScqucncc và đặttất cả các animation trên vào đối tượng CCSequence này Sauđó ta dùng lệnh sau đế chạy animation:
runAction();
CCSprite ‘-Sprite = CCSprite: :create("HelloWorld.png");
CCMoveBy* moveBy CCMoveBy:: create(0 5, ccp(100,100))i
CCMoveTo * — moveTo = CCMoveTo:: create (0.5j ccp(100,100));
CCScaleTo * _scaleTo = CCScaleTo:: create(0.5, 1.4);
—Sprite ->runActỉon(— moveBy) ;
-Sprite ->runAction(_moveTo) ;
-Sprite ->runAction(_scaleTo);
resequence* -Sequence = CCSequence: :create(_moveBy,—moveTo,_scaleTo,NUL)-); -Sprite- >runAction(_ sequence) ;| :
Hình 2.10 Thực hiện lần lượtanimationchomột sprite
Trong khi sửdụng các Animation, màta lại muốn xứlý 1 công việc nào
đó Công việcđó phái sau khi thực hiện xong animation mới thực hiện Nếuta
gọi hàm xử lýđó sau lệnh chạyanimation thì có khảnăng hàm xừ lý thựchiện trước khi animation thực hiện, vì có thể ta đặt duration cho animationquá lâu trongkhi tốcđộ xừ lý của máy tính thi lạiquá nhanh Vậy đế giải quyếtviệcđóta sử dụng các function call backmà cocos2d-x cungcấpsằn
Các function nàycũng được hiêu là 1 dạng animation, nênta có thê đặt
nó vào CCScquenceđế chạy lầnlượt như các animtion trên
Cácfunction-callback trong cocos2d-x:
• CCCallFunc - gọiđếnhàmkhông có kiêu trả về
• CCCallFuncO -gọiđến hàm cótham số là mộtObject
• CCCallFuncND-gọi đến hàm có 2tham số làNodevà Data (có thể để trốngtham số data vìnókhông có kiểu trả về)
• CCCallFuncN - gọiđếnhàm có tham số là một Node
Trang 32Ví dụ vềsửdụngfunction callback tronganimation:
CCFiniteTimeAction *rotate=CCRotateBy::create(0,90);
CCFiniteTimeAction*downAction=CCMoveTo::create(l ,ccp(visibìeSize
width/4,48));
CCFiniteTimeAction*dowDone=CCCallFuncN::create(this,caựfuncN_s elector(CRobin:: RobinDeadDone));
this->nmAction(CCSequence::create(rotate,downAction,dowDone,NULL));
void CRobin::RobifìDeadDone(CCNode *sender) {
CCSprite *sprite=(CCSprite *)sender;
sprite->stopAHActions();
}
2.2.3.9 CCUserDefault
Mộtgame mobile thông thường không cần sửdụngnhiều đến việc lưu
trừdữ liệucùa game Tuy nhiên vầncần đếnviệc lưutrữdữliệu như lưu
điểm, level người chơi hoặc một thông sốtrong game nào đó Cocos2d-X
cung cấp đối tượng CCUserDcfaultđế làm công việc lưu trữtrong game
CCUserDefault làmột lớp Singleton, ta cóthetruy cập ờ mọi chỗ mà chỉ có một thể hiện của lớp được gọi thông qua hàm thành viên:
CCUserDefault::sharedUserDefault() Thôngqua thê hiện này tacó thê lưutrữ vàlấy dữliệutừ đối tương CCUserDefaultnày Cáchàm thường dùngcủaCCUscrDcíầult:
Trang 33• sctIntcgcrForKey(const char *pKey, int value):Hàmnày cho phép lưu
trừ một sốnguyênvới một Key nhất định Neu muốnlấy được giá trị đã
lưu ta phải biết Key màtalưu trữ
• getlntegerForKey(const char* pKey): Đây là hàm lấy ra một giá trịsố nguyên mà tađã biết Key.Neu Keykhông đúng hàm này trả về một giá
trị bằng0
• Ngoài ra còn rất nhiều các hàm {get;set} cho các kiểu dữ liệu khác
nhau như String, Double Boolcũngđượcsứ dụng giống như kiểu dừ liệu sốnguyên ở trên
2.2.3.10 CCNotifictionCenter
Trong xửlý game, Công việc cần xử lýnhiềunhất chính làxử lý các sự
kiện được phátsinhtrong game Có hai loại sựkiệnchính:
Sự kiện tương tác ngườidùng: làsựkiệnngườidùng thaotácvớimàn hìnhnhư chạmvào màn hình, bấm vào một Button tronggame Khiđó lập trình viênsẽ bắt được các sự kiện đóđế xứ lý
Sự kiệntương tác giữa cácđối tượng trong game.Các sựkiện này xảyra
tronggame và cần người lập trình viênphảixửlý Không giống như sự kiệnButton Click, chúng ta không biết nên bắt sự kiện ờ chỗ nào cho hợp lý
Cocos2-X cung cấp đối tượngCCNotifictionCenterđế làm côngviệc gán sựkiện giốngnhư sự kiện tương tác người dùng
CCNotifictionCenter cũng là một lớp Singleton nên tạimọi thời điểmchi
có một thế hiện cúalóp Talàmviệc vớilópnày bằng hai hàm thành viên sau:
• addObserver(CCObject* target, SEL_CallfuncO selector, const char*
name, CCOjcct *obj)
• postNotification(const char*name, CCObject* object)
Trang 34Các sửdụng nhưsau: Khita addObserver cónghĩa làtađãđãng ký một
sựkiện có tên “const char* name” vớimột hàm xứ lý là “SEL_CallfuncOselector” Vi vậy tại bất cứ nơi nào trong chương trình mà ta gọi hàmpostNotification với name giốngnhư name đã đăng kỷở hàm addObserver thì ngay lập tức sẽ được “selector” đã đăng kýsứ lý
2.2.3.10 Âmthanhtrongcocos2d-x
Cocos2d-X hỗ trợ các loại âm thanh như mp3, wav., và bộ thư viện
SimpỉeAudioEngine phụ trách côngviệc liên quan đến hiệu ứng âm thanh
SimpleAudioEngine cũng là mộtlớp Singleton Tại mọivị trí ta chi có một the hiện cúađối tượng này, và khai báonhư sau:
SimplcAudioEnginc *media= SimplcAudioEngine::sharcdEngine();
Các hàm thườngdùng cùaSimpleAudioEngine:
2.2.3.11 Các đối tượng Label
Cocos2d-Xcungcấpnhiều loại đối tượng Label để hiện thị các xâukýtự Tùyvàomục đích sử dụngkhácnhau mà tachọnđối tượng phù hợp
2.2.3.11.1 CCLabclTTF
CCLabelTTF là đối tượng Label được sứ dụngkhi tamuốn xâuký tựhiển thịcódạngfontchữgiốngnhưfontchừđãtruyền vàonhư trong hàm tạo
sau:
Trang 35CCLabeiTTF* ỉhì = CCLabelTFF::create(“cocos", “Arial.ttf ”, 16).
Ớ câu lệnhtrên thì xâu đượchiển thị ra làsẽxâu“cocos” với fontchừ là
Arial với kích thước là 16 pixcel Vàcũng giống như các Node khácchúng ta cũng thiết lập các thuộc tính choCCLabelTTFrồiadd thêm vàomộtNode chacó thê chứa nó
Các hàm thườngdùng cùa CCLabelTFF
*.fnt để có thehiển thị cácký tự theo ý muốn của chúng ta