cocos2d-x 3.0游戏范例学习笔记 《跑酷》第六步-物理碰撞检测(2)-主角吃金币
cocos2d-x 3.0游戏实例学习笔记 《跑酷》第六步--物理碰撞检测(2)--主角吃金币
OK,到此,以及全部完结啦。但是。。。还有点点小问题,留在下一篇,就是,完全按照我这里的代码来的话,游戏结束,切换到结束场景,可是,结束场景的 重新开始按钮 好像没用。。。。待我先解决,或者这里求大牛相助!!谢谢,下篇给出解决方法以及完整代码和 打包好的工程!!!
说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本重写的,目前我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记
好啦,根据前面一步的物理碰撞检测的简单了解之后,我们也要完成这次游戏实例笔记的最后一步啦---让主角吃金币,如果碰到岩石就GameOver啦
游戏完结之后,会放出所有源码和资源,或者我也会把整个项目打包,共享,大家可以直接运行。毕竟一开始都是别人的东西,支持开源
那么这里,我们就要先为PlayScene添加碰撞检测的条件:
<span style="font-size:18px;"> </span><span style="font-size:14px;">//碰撞检测 cocos2d::EventDispatcher* dispatcher; 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(); dispatcher->addEventListenerWithSceneGraphPriority(contactListenner,this); } void PlayScene::onExit(){ Layer::onExit(); //取消事件派发机制 dispatcher->removeAllEventListeners(); } 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) ){ Director::getInstance()->replaceScene(GameOver::scene()); } 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); }
OK,到此,以及全部完结啦。但是。。。还有点点小问题,留在下一篇,就是,完全按照我这里的代码来的话,游戏结束,切换到结束场景,可是,结束场景的 重新开始按钮 好像没用。。。。待我先解决,或者这里求大牛相助!!谢谢,下篇给出解决方法以及完整代码和 打包好的工程!!!
个人愚昧观点,欢迎指正与讨论!!!