cocos2d-x入門 -5-


cocos2d-xのv3.1を使ってみたら、v3.0からまた変更点が結構あるみたいです。

とりあえず、cocos2d-x v3.1のプロジェクトを使ってみようと思ったけど、どうしたらいいのか分からないという方も多いと思われる（私が分からなかった）のでメモしておきます。

見たところ、v3.1にはサンプルがないようです。
v3.0にはsamplesフォルダがあるので、v3.1を使用する場合も、v3.0を入れておきましょう。

プロジェクトを作成した直後には、HelloWorldSceneクラスがありますが、今回はTitleSceneとGameSceneを切り替えるだけのアプリを作ってみます。
この先は、samplesフォルダにあるサンプルを見て、自分の実装したいものを取り込んでいく感じで何とかなるのではないでしょうか？

それでは、ソースファイルを見ていきます。

applicationDidFinishLaunchingメソッドで起動時の設定をします。
ここでは、解像度の水平方向が640px以上の場合は、hdフォルダから画像ファイルを検索するようにしています。
スマホを縦方向に持ったまま使用するイメージです。

```cpp:AppDelegate.cpp
bool AppDelegate::applicationDidFinishLaunching() {
    // initialize director
    auto director = Director::getInstance();
    auto glview = director->getOpenGLView();
    if(!glview) {
        glview = GLView::create("My Game");
        director->setOpenGLView(glview);
    }
	glview->setDesignResolutionSize(320.0f, 480.0f, ResolutionPolicy::SHOW_ALL);
	Size frameSize = glview->getFrameSize();
	std::vector< std::string > searchPath;
	if (frameSize.width >= 640.0f) {
		searchPath.push_back("hd");
		director->setContentScaleFactor(2.0f);
	}
	else {
		searchPath.push_back("sd");
	}
	FileUtils::getInstance()->setSearchPaths(searchPath);

    // turn on display FPS
    director->setDisplayStats(true);

    // set FPS. the default value is 1.0/60 if you don't call this
    director->setAnimationInterval(1.0 / 60);

    // create a scene. it's an autorelease object
//    auto scene = HelloWorld::createScene();
//    auto scene = GameScene::createScene();
	auto scene = TitleScene::createScene();

    // run
    director->runWithScene(scene);

    return true;
}
```

タイトル画面は、何らかの画像を表示して、画面をタッチしたらゲーム画面に移動します。

```cpp:TitleScene.h
#ifndef __MySampleProject__TitleScene__
#define __MySampleProject__TitleScene__

#include "cocos2d.h"

USING_NS_CC;

class TitleScene : public cocos2d::Layer
{
public:
	static Scene *createScene();
	virtual bool init();
	CREATE_FUNC(TitleScene);
	
	void makeBackground();
	
	bool onTouchBegan(Touch *touches, Event *event);
	void onTouchMoved(Touch *touches, Event *event);
};

#endif /* defined(__MySampleProject__TitleScene__) */
```

```cpp:TitleScene.cpp
#include "TitleScene.h"
#include "GameScene.h"

Scene *TitleScene::createScene()
{
	auto scene = Scene::create();
	auto layer = TitleScene::create();
	scene->addChild(layer);
	return scene;
}

bool TitleScene::init()
{
	if (! Layer::init()) {
		return false;
	}
	makeBackground();
	
	auto dispacher = Director::getInstance()->getEventDispatcher();
	auto listener = EventListenerTouchOneByOne::create();
	listener->setSwallowTouches(true);
	listener->onTouchBegan = CC_CALLBACK_2(TitleScene::onTouchBegan, this);
	listener->onTouchMoved = CC_CALLBACK_2(TitleScene::onTouchMoved, this);
	dispacher->addEventListenerWithSceneGraphPriority(listener, this);
	
	return true;
}

void TitleScene::makeBackground()
{
	Size winSize = Director::getInstance()->getWinSize();
	auto spBG = Sprite::create("HelloWorld.png");
	spBG->setPosition(Point(winSize.width/2.0f, winSize.height/2.0f));
	addChild(spBG);
}

bool TitleScene::onTouchBegan(Touch *touches, Event *event)
{
	auto scene = GameScene::createScene();
	auto transition = TransitionFade::create(1.0f, scene);
	Director::getInstance()->replaceScene(transition);
	return false;
//	return true;
}

void TitleScene::onTouchMoved(Touch *touches, Event *event)
{
	
}
```

ゲーム画面もタイトル画面と同様です。
ここから、ゲーム内容にあった実装を、samplesフォルダのサンプルを参考にしながら作成していくのがいいと思います。

```cpp:GameScene.h
#ifndef __MySampleProject__GameScene__
#define __MySampleProject__GameScene__

#include "cocos2d.h"

USING_NS_CC;

class GameScene : public cocos2d::Layer
{
public:
	static Scene *createScene();
	virtual bool init();
	CREATE_FUNC(GameScene);
	
	void makeBackground();
	
	bool onTouchBegan(Touch *touches, Event *event);
	void onTouchMoved(Touch *touches, Event *event);
};

#endif /* defined(__MySampleProject__GameScene__) */
```

```cpp:GameScene.cpp
#include "GameScene.h"
#include "TitleScene.h"

Scene *GameScene::createScene()
{
	auto scene = Scene::create();
	auto layer = GameScene::create();
	scene->addChild(layer);
	return scene;
}

bool GameScene::init()
{
	if (! Layer::init()) {
		return false;
	}
	makeBackground();
	
	auto dispacher = Director::getInstance()->getEventDispatcher();
	auto listener = EventListenerTouchOneByOne::create();
	listener->setSwallowTouches(true);
	listener->onTouchBegan = CC_CALLBACK_2(GameScene::onTouchBegan, this);
	listener->onTouchMoved = CC_CALLBACK_2(GameScene::onTouchMoved, this);
	dispacher->addEventListenerWithSceneGraphPriority(listener, this);

	return true;
}

void GameScene::makeBackground()
{
	Size winSize = Director::getInstance()->getWinSize();
	auto spBG = Sprite::create("japanese-chess-bds.jpg");
	spBG->setPosition(Point(winSize.width/2.0f, winSize.height/2.0f));
	addChild(spBG);
}

bool GameScene::onTouchBegan(Touch *touches, Event *event)
{
	auto scene = TitleScene::createScene();
	auto transition = TransitionFade::create(1.0f, scene);
	Director::getInstance()->replaceScene(transition);
	return false;
	//	return true;
}

void GameScene::onTouchMoved(Touch *touches, Event *event)
{
	
}
```

このようにコーディングして、起動するとタイトル画面が現れます。

![cocos2dx_5_01.png](https://qiita-image-store.s3.amazonaws.com/0/30731/143ad2a5-a674-6c33-e84c-5320238d9ade.png "cocos2dx_5_01.png")

そして、画面にタッチすると、ゲーム画面に切り替わります。

![cocos2dx_5_02.png](https://qiita-image-store.s3.amazonaws.com/0/30731/07bf861d-3936-e542-ec47-a1ea5afe2afd.png "cocos2dx_5_02.png")

ここまで作成すれば、後はなんとかなりそう？