Bài 12: Làm game đầu tiên - GameOver, tính điểm, thêm âm thanh cho game sôi động (Part 4)

Người đăng: share-nhungdieuhay on Thứ Bảy, 17 tháng 5, 2014

Hello all!

Vậy là chúng ta đã đi được 3/4 chặng đường cho project đầu tiên này rồi. Tuy rằng khá đơn giản, nhưng công việc viết ( thực ra là đang áp dụng ) code sao cho đúng và dễ kiểm tra sửa lỗi cũng hoa mắt ghê.

Chỉ cần nốt 1 bài này thôi là chúng ta có 1 game đầu tiên để chơi rồi, hehe. Trong phần cuối này chúng ta sẽ cùng làm nốt những công việc sau:

+ Kiểm tra game Over khi quái lao vào nhân vật
+ Thêm âm thanh khi bắn đạn và thêm chút nhạc nền cho hấp dẫn nhỉ.
+ Mình bỏ phần Tính điểm nha, hơi phức tạp 1 tí, hẹn bài sau. Bài này để mức đơn giản thôi.

Bắt đầu nào!!!!!

B1 - Thêm âm thanh vào game

Các bạn Download resource ở đây, chép vào trong thư mục Resource của Project
Sau đó mở file HelloWordScene.cpp, trong hàm init() thêm vào dòng lệnh sau

CocosDenshion::SimpleAudioEngine::getInstance()->preloadBackgroundMusic("background-music-aac.wav");
CocosDenshion::SimpleAudioEngine::getInstance()->playBackgroundMusic("background-music-aac.wav",true); // True = lặp lại vô hạn


Tìm tới hàm onTouchEnded(), thêm vào dòng lệnh sau


CocosDenshion::SimpleAudioEngine::getInstance()->preloadEffect("pew-pew-lei.wav");

CocosDenshion::SimpleAudioEngine::getInstance()->playEffect("pew-pew-lei.wav");

Thêm vào 1 lệnh #include"SimpleAudioEngine.h" ở sau dòng lệnh #include" " đầu tiên nhé.

B1 - Tạo màn GameOver

Bạn tạo thêm 1 Scene mới tên là GameOverScene.h và GameOverScene.cpp như sau, Down file Class


Chúng ta ngó qua 2 file này chút nhé:

* Mở file GameOverScene.h khai báo 2 Class GameOverLayer, GameOverScene, cùng với các hàm tạo hàm hủy, hàm khởi tạo init(), không quá phức tạp phải không?

Tuy nhiên, nên chú ý 1 chút tới 2 lệnh này

CC_SYNTHESIZE_READONLY(cocos2d::LabelTTF*, _label, Label); (1)

CC_SYNTHESIZE_READONLY(GameOverLayer*, _layer, Layer); (2)

Nhìn có vẻ khó hiểu nhỉ, nhưng bạn có thể hiểu thế này

(1) tạo ra 1 biến _label có kiểu LabelTTF* thông qua 1 phương thức của lớp Label

(2) tạo ra 1 biến _layer có kiểu GameOverLayer* thông qua 1 phương thức của lớp Layer

đơn giản thế thôi, đừng phức tạp hóa lên quá, Bạn có thể tra cứu thêm về các hàm Inline ở đây

* Mở file GameOverScene.cpp, hàm hủy (có dấu ~ ) thì dễ hiểu rồi nhé, đơn giản là giải phóng cho các con trỏ của lớp để giải phóng bộ nhớ.

Xét các hàm Init()
GameOverScene::init(), tạo ra 1 Scene mới và 1 Layer mới
GameOverLayer::init(), tạo 1 layer màu trắng Color4B(255,255,255,255), có ai thắc mắc Color4B, Color3B là gì không?

Color3B tạo ra màu RGB từ 3 tham số vào. Color4B tạo ra màu RGBA từ 4 tham số vào, trong đó tham số cuối điều chỉnh độ opacity ( đục ).

Đoạn này 

this->runAction( Sequence::create(
                                DelayTime::create(3),
                                CallFunc::create(this, 
                                callfunc_selector(GameOverLayer::gameOverDone)),
                                NULL));

Là tạo 2 Action liên tiếp nhau
+ Làm trễ 3 giây  DelayTime::create(3)
+Tiếp theo CallFunc::create(this, callfunc_selector(GameOverLayer::gameOverDone)), // Gọi hàm game OverDone

Hàm gameOverDone() làm mỗi việc là thay thế cái Scene GameOverScene bằng 1 Game Scene mới để tiếp tục chơi

void GameOverLayer::gameOverDone()
{
    Director::getInstance()->replaceScene(HelloWorld::createScene()); // Tạo 1 Game Scene mới
}


Bạn mở file HelloWordScene.cpp tìm tới hàm onContactBegin(), bên trong khối lệnh

// Nhân vật bị quái đụng vào
if((tag==1&tag1==2)||(tag==2&tag1==1))
 {
// Xử lý GameOver
// Tính điểm 
 }

Thêm vào đoạn code sau đây

auto gameOverScene = GameOverScene::create(); // Tạo 1 Scene Over của lớp GameOverScene
gameOverScene->getLayer()->getLabel()->setString("You Lose :["); // Đặt 1 dòng thông báo lên màn hình
Director::getInstance()->replaceScene(gameOverScene); // Thay thế game Scene =  game Over Scene 

Nhớ thêm #include"GameOverScene.h" ở phần #include nhé.

Trước khi biên dịch chạy thử, bạn cần làm 1 việc sau

+ Build Android, hãy mở file Android.mk trong đường dẫn firstgame\proj.android\jni\Android.mk thêm vào dòng ../../Classes/GameOverScene.cpp bên dưới dòng ../../Classes/HelloWorldScene.cpp
+ Build Win32: hãy mở file firstgame.vcxproj theo đường dẫn firstgame\proj.win32\firstgame.vcxproj thêm vào 2 dòng

<ClCompile Include="..\Classes\GameOverScene.h" /> dưới dòng <ClCompile Include="..\Classes\HelloWorldScene.h" />

<ClCompile Include="..\Classes\GameOverScene.cpp"/>dưới dòng <ClCompile Include="..\Classes\HelloWorldScene.cpp" />

Build và chạy thử nhé, 

Ặc, lại lỗi tè le, và ko hiểu là lỗi gì luôn, thông báo lỗi loằng ngoằng quá. Nếu như bạn không đọc cái chú ý của mình ( phần chữ đỏ ) ở Bài 11 chắc chắn sẽ chẳng thể tìm được cách sửa lỗi này đâu, cá đó ( Tinh vi tí thôi, mò mãi cũng ra thôi, chả nhớ ngày trước tìm được cách sửa ở đâu).

Túm lại lỗi này sửa thế này thêm USING_NS_CC; vào dưới phàn #include trong file GameOverScene.h là xong ( mọi file .h nên thêm vào, mất gì đâu ).

Xong, Build lại và chạy là OK ngay, ko OK mình xóa Blog này luôn nhé! Hứa đấy
























Vậy là chúng ta đã cùng nhau hoàn thành xong Project Game đầu tiên rồi đấy, cũng không khó phải không?
Trong Project này chúng ta đã nắm được các phần cơ bản sau đây:

+ Tạo nhân vật bằng Sprite
+ Bắt sự kiện Touch - Chạm màn hình
+ Bắt sự kiện Contact - va chạm vật lý
+ Xử lý âm thanh
+ Xử lý game Over

- Hi vọng ở những bài sau chúng ta sẽ cùng nhau làm được nhiều Project phức tạp hơn, hay hơn, đẹp hơn nhé.

Chào và hẹn gặp lại các bạn ở bài sau!


{ 0 nhận xét... read them below or add one }

Đăng nhận xét