說明:這裏是借鑑:曉風殘月前輩的博客,他是將泰然網的跑酷教程,用cocos2d-x 2.X 版本重寫的,目前我正在學習cocos2d-X3.0 於是就用cocos2d-X 3.0重寫,並做相關筆記
好啦,根據前面一步的物理碰撞檢測的簡單瞭解之後,我們也要完成這次遊戲實例筆記的最後一步啦---讓主角吃金幣,如果碰到岩石就GameOver啦
遊戲完結之後,會放出所有源碼和資源,或者我也會把整個項目打包,共享,大家可以直接運行。畢竟一開始都是別人的東西,支持開源
那麼這裏,我們就要先爲PlayScene添加碰撞檢測的條件:
<span style="font-size:18px;"> </span><span style="font-size:14px;">//碰撞檢測
void onEnter();
void onExit();
bool onContactBegin(cocos2d::PhysicsContact& contact);</span>
然後實現:
void PlayScene::onEnter(){
Layer::onEnter();
auto contactListenner = EventListenerPhysicsContact::create();
//CC_CALLBACK表示回調函數的參數個數
contactListenner->onContactBegin = CC_CALLBACK_1(PlayScene::onContactBegin,this);
//dispatcher = Director::getInstance()->getEventDispatcher();
//_eventDispatcher應該是一個時間派發的全局變量。。全部給它管理就是的
_eventDispatcher->addEventListenerWithSceneGraphPriority(contactListenner,this);
}
void PlayScene::onExit(){
Layer::onExit();
//取消事件派發機制
//dispatcher->removeAllEventListeners();
_eventDispatcher->removeEventListenersForTarget(this);
}
bool PlayScene::onContactBegin(PhysicsContact& contact){
auto body_1 = (Sprite*)contact.getShapeA()->getBody()->getNode();
auto body_2 = (Sprite*)contact.getShapeB()->getBody()->getNode();
CCLOG("ssssss");
//這裏表示是要人物和岩石相撞
if((body_1->getTag() == 3 && body_2->getTag() == 1) ||
(body_1->getTag() == 1 && body_2->getTag() == 3) ){
GameOver();
}
if(body_1->getTag() == 2){
body_1->setVisible(false);
}
if(body_2->getTag() == 2){
body_2->setVisible(false);
}
return false;
}
那麼這裏我們只要做這幾步,就可以啦,cocos 會幫我們自動檢測的,那麼這裏我們也要在Runner的init函數中
this->setTag(1);那麼這裏我們可以知道,主角的Tag是1,金幣的是2,岩石是3;
然後在initBody添加使得其能被碰撞檢測到的代碼爲:
void Runner::initBody(){
//根據不同狀態設置不同剛體大小
Size bodySize;
if(m_state == crouch){
bodySize = crouchSize;
}
else{
bodySize = run_jumpSize;
}
//創建runner的剛體
auto runerBody = PhysicsBody::createBox(bodySize,PHYSICSBODY_MATERIAL_DEFAULT);
//設置可以碰撞檢測
runerBody->setCategoryBitmask(1);
runerBody->setCollisionBitmask(1);
runerBody->setContactTestBitmask(1);
//綁定剛體
this->setPhysicsBody(runerBody);
}
OK,我們在岩石和主角發生碰撞的時候,就切換了GameOver的場景啦,這個場景其實就是和MainScene的差不多,代碼如下:
#ifndef __GameOver__H__
#define __GameOver__H__
#include "cocos2d.h"
class GameOver : cocos2d::Layer{
public:
virtual bool init();
static cocos2d::Scene* scene();
CREATE_FUNC(GameOver);
void createBG();
private:
void createButton(cocos2d::Point centerPoint);
void reStart();
};/**/
#endif
-------------------------.cpp--------------------------
#include "GameOver.h"
#include "PlayScene.h"
USING_NS_CC;
Scene* GameOver::scene(){
Scene* scene = Scene::create();
Layer* layer = GameOver::create();
scene->addChild(layer);
return scene;
}
bool GameOver::init(){
if(!Layer::init()){
return false;
}
//create background
createBG();
return true;
}
void GameOver::createBG(){
auto winSize = Director::getInstance()->getWinSize();
auto centerPoint = ccp(winSize.width / 2, winSize.height / 2);
//BG
Sprite* spriteBg = Sprite::create("MainBG.png");
spriteBg->setPosition(centerPoint);
this->addChild(spriteBg);
//create button
createButton(centerPoint);
}
void GameOver::createButton(cocos2d::Point centerPoint){
//Start mutton
MenuItemImage* menuItem = MenuItemImage::create(
"restart_n.png",
"restart_s.png",
CC_CALLBACK_0(GameOver::reStart,this));
Menu* menu = Menu::create(menuItem,NULL);
menu->setPosition(centerPoint);
this->addChild(menu);
}
void GameOver::reStart(){
CCLOG("game is restart !");
Scene* playScene = TransitionFade::create(1,PlayScene::createScene());
Director::getInstance()->replaceScene(playScene);
}
個人愚昧觀點,歡迎指正與討論!!!