说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用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);
}
个人愚昧观点,欢迎指正与讨论!!!