cocos2d-x 3.0遊戲實例學習筆記 《跑酷》第七步--物理碰撞檢測(2)--主角吃金幣

說明:這裏是借鑑:曉風殘月前輩的博客,他是將泰然網的跑酷教程,用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,到此,以及全部完結啦。但是。。。還有點點小問題,留在下一篇,就是,完全按照我這裏的代碼來的話,遊戲結束,切換到結束場景,可是,結束場景的 重新開始按鈕 好像沒用。。。。待我先解決,或者這裏求大牛相助!!謝謝,下篇給出解決方法以及完整代碼和 打包好的工程!!!

個人愚昧觀點,歡迎指正與討論!!!



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章