cocos2d-x 3.0游戏实例学习笔记 《跑酷》第七步--物理碰撞检测(2)--主角吃金币

来源:互联网 发布:淘宝卖充值卡怎么弄 编辑:程序博客网 时间:2024/06/10 03:35

说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用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 backgroundcreateBG();return true;}void GameOver::createBG(){auto winSize = Director::getInstance()->getWinSize();auto centerPoint = ccp(winSize.width / 2, winSize.height / 2);//BGSprite* spriteBg = Sprite::create("MainBG.png");spriteBg->setPosition(centerPoint);this->addChild(spriteBg);//create buttoncreateButton(centerPoint);}void GameOver::createButton(cocos2d::Point centerPoint){//Start muttonMenuItemImage* 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,到此,以及全部完结啦。但是。。。还有点点小问题,留在下一篇,就是,完全按照我这里的代码来的话,游戏结束,切换到结束场景,可是,结束场景的 重新开始按钮 好像没用。。。。待我先解决,或者这里求大牛相助!!谢谢,下篇给出解决方法以及完整代码和 打包好的工程!!!

个人愚昧观点,欢迎指正与讨论!!!



4 0
原创粉丝点击