読者です 読者をやめる 読者になる 読者になる

Dr. 三日坊主

日々の勉強の記録 AIそして英語

【AI】ゲームAIスタディ-準備(2/2)

画面遷移

前回から引き続き、画面遷移を作る。
遷移先からホーム画面に戻れるようにしたいので、戻るボタンだけを持った画面を作っておく。
これをベースクラスとして、それぞれの遷移先画面は、このクラスを継承する。

 

LayerBase.h

// createScene定義マクロ.
#define CREATESCENE_FUNC(__TYPE__) \
static cocos2d::Scene* createScene() \
{ \
auto scene = cocos2d::Scene::create(); \
auto layer = __TYPE__::create(); \
\
scene->addChild(layer); \
\
return scene; \
}

// createSceneとcreateを両方定義するマクロ.
#define DECLEAR_H( __TYPE__ ) \
CREATESCENE_FUNC(__TYPE__) \
CREATE_FUNC(__TYPE__)


#include "cocos2d.h"

class LayerBase : public cocos2d::LayerColor
{

public:
	LayerBase();
	~LayerBase();
	
	bool init();
	virtual void addinit();
	virtual void update(float delta);
	
	// a selector callback
	virtual void menuCloseCallback(cocos2d::Ref* pSender);
	
private:
	cocos2d::MenuItemImage* pcloseBtn;	// 閉じるボタン.
	
};

 

createScene関数も毎回書くのがだるいのでマクロ化。
create関数とcreateScene関数を両方定義してくれるマクロも追加。
このマクロをLayerBaseを継承した子クラスで呼ぶことにする。

addinit関数は、子クラスで追加されたメンバーを初期化するときに使う。

 

LayerBase.cpp

USING_NS_CC;
#include "LayerBase.h"


LayerBase::LayerBase() : pcloseBtn(NULL)
{
}

LayerBase::~LayerBase()
{
}

bool LayerBase::init()
{
	//////////////////////////////
	// 1. super init first
	if ( !Layer::init() )
	{
		return false;
	}
	
	// スケジューラーへ登録.
        // これを呼んでおくと、update(float delta)が呼ばれるようになる。
	this->scheduleUpdate();
	
	Size visibleSize = Director::getInstance()->getVisibleSize();
	Vec2 origin = Director::getInstance()->getVisibleOrigin();
	
	/////////////////////////////
	// 2. add a menu item with "X" image, which is clicked to quit the program
	//    you may modify it.
	
	// add a "close" icon to exit the progress. it's an autorelease object
	pcloseBtn = MenuItemImage::create("CloseNormal.png",
					  "CloseSelected.png",
					  CC_CALLBACK_1(LayerBase::menuCloseCallback, this));
	
	pcloseBtn->setPosition(Vec2(origin.x + visibleSize.width - pcloseBtn->getContentSize().width/2 ,
			            origin.y + pcloseBtn->getContentSize().height/2));
	
	// create menu, it's an autorelease object
	auto menu = Menu::create(pcloseBtn, NULL);
	menu->setPosition(Vec2::ZERO);
	this->addChild(menu, 1);
	
	addinit();
	
	return true;
}

void LayerBase::addinit()
{
}

void LayerBase::update(float delta)
{
}

void LayerBase::menuCloseCallback(Ref* pSender)
{
	Director::getInstance()->popScene();
	
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
	exit(0);
#endif
}

 

遷移先画面

Chapter 2に向けた画面を作ってみる。
LayerBaseクラスで必要最低限の実装をしたので、かなりシンプルに実装できた。
背景色は白に変えてみた。

 

Chapter2Dlg.h

#include "LayerBase.h"
class Chapter2Dlg : public LayerBase {
	
public:
	Chapter2Dlg(){};
	~Chapter2Dlg(){};
	DECLEAR_H(Chapter2Dlg);

	void addinit();
	void update(float delta);
};

 

Chapter2Dlg.cpp

USING_NS_CC;
#include "Chapter2Dlg.h"

#define BASE_LAYER LayerBase

void Chapter2Dlg::addinit()
{
	// 背景色を白に.
	LayerColor::initWithColor(Color4B(255,255,255,255));
	BASE_LAYER::addinit();
}

void Chapter2Dlg::update(float delta)
{
	BASE_LAYER::update(delta);
}

 

 

 画面遷移処理

ログを出すだけだったボタン押下処理を修正
HelloWorldScene.cpp

// 画面遷移ボタン.
void HelloWorld::selectchapterbtn(cocos2d::Ref* pSender, int btnid)
{
	switch (btnid) {
		case eBUTTON_CHAPTER2:
		{
			log("chapter 2");
                        //  追記↓
			auto scene = Chapter2Dlg::createScene();
			Director::getInstance()->pushScene(scene);
		}
			break;
		case eBUTTON_CHAPTER3:
			log("chapter 3");
			break;
		default:
			break;
	}
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
	exit(0);
#endif
}

 

pushScene関数を使うことで、前画面に戻れるようになっている。

 

テストするとちゃんと白い画面に遷移した。
右下のボタンからホーム画面に戻れる。

f:id:merakuma:20170110005346p:plain

 今日はここまで

 

 

ゲーム開発者のためのAI入門

ゲーム開発者のためのAI入門