现在的位置: 首页 > 综合 > 正文

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

2017年02月21日 ⁄ 综合 ⁄ 共 3378字 ⁄ 字号 评论关闭

说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用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);
}

OK,到此,以及全部完结啦。但是。。。还有点点小问题,留在下一篇,就是,完全按照我这里的代码来的话,游戏结束,切换到结束场景,可是,结束场景的 重新开始按钮 好像没用。。。。待我先解决,或者这里求大牛相助!!谢谢,下篇给出解决方法以及完整代码和 打包好的工程!!!

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

抱歉!评论已关闭.