今日はもう一個やったので、まとめておく。
シーンを追加する場合。
Cocos2d-xでは1シーンにつき1クラスと考えまして、
今回はSampleSceneを追加してみます。
C++の場合はクラスを記入したヘッダーファイルと、処理本体を記述したソースファイル本体を作成します。
中身は、とりあえずHelloWorldとほぼ同じにして、最初にSampleSceneを表示するようにします。
class SampleScene : public cocos2d::Scene
{
public:
static cocos2d::Scene* createScene();
virtual bool init();
// a selector callback
void menuCloseCallback(cocos2d::Ref* pSender);
// implement the "static create()" method manually
CREATE_FUNC(SampleScene);
};
#include "SampleScene.h"
#include "SimpleAudioEngine.h"
USING_NS_CC;
Scene* SampleScene::createScene()
{
return SampleScene::create();
}
// Print useful error message instead of segfaulting when files are not there.
static void problemLoading(const char* filename)
{
printf("Error while loading: %s\n", filename);
printf("Depending on how you compiled you might have to add 'Resources/' in front of filenames in HelloWorldScene.cpp\n");
}
// on "init" you need to initialize your instance
bool SampleScene::init()
{
//////////////////////////////
// 1. super init first
if ( !Scene::init() )
{
return false;
}
auto visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
// add "HelloWorld" splash screen"
auto sprite = Sprite::create("HelloWorld.png");
if (sprite == nullptr)
{
problemLoading("'HelloWorld.png'");
}
else
{
// position the sprite on the center of the screen
sprite->setPosition(Vec2(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));
// add the sprite as a child to this layer
this->addChild(sprite, 0);
}
return true;
}
void SampleScene::menuCloseCallback(Ref* pSender)
{
//Close the cocos2d-x game scene and quit the application
Director::getInstance()->end();
/*To navigate back to native iOS screen(if present) without quitting the application ,do not use Director::getInstance()->end() as given above,instead trigger a custom event created in RootViewController.mm as below*/
//EventCustom customEndEvent("game_scene_close_event");
//_eventDispatcher->dispatchEvent(&customEndEvent);
}
// create a scene. it's an autorelease object
auto scene = SampleScene::createScene();
// run
director->runWithScene(scene);
return true;
}
ただ、C言語やっている人なら分かると思いますが、これだけじゃあビルドしてくれません。
通常はmakefileを弄るのですが、WindowsはVisualStudio、AndroidはAndroid Studioでビルドするので、
VisualStudioの場合
プロジェクト名\proj.win32\プロジェクト名.vcxproj
のここに追加するファイルを記載する。
<ItemGroup>
<ClCompile Include="..\Classes\AppDelegate.cpp" />
<ClCompile Include="..\Classes\HelloWorldScene.cpp" />
<ClCompile Include="..\Classes\SampleScene.cpp" />
<ClCompile Include="main.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\Classes\AppDelegate.h" />
<ClInclude Include="..\Classes\HelloWorldScene.h" />
<ClInclude Include="..\Classes\SampleScene.h" />
<ClInclude Include="main.h" />
</ItemGroup>
Androidの場合
プロジェクト名\CMakeLists.txt
のここに追加するファイルを記載する。
# add cross-platforms source files and header files
list(APPEND GAME_SOURCE
Classes/AppDelegate.cpp
Classes/HelloWorldScene.cpp
Classes/SampleScene.cpp
)
list(APPEND GAME_HEADER
Classes/AppDelegate.h
Classes/HelloWorldScene.h
Classes/SampleScene.h
)
Mac/iOSはXcodeのメニューから追加すれば良いと思う。(知らんけど)
こういうシーンの追加って、cocosコマンドでなんとかできないんですかね?
シーンに限らず、クラス追加するときも同じか。
めんどくさい。