全てのシーンで共通の処理をどのうように実装するかいろいろ考えて試しました。
はじめにAppDelegate.hとAppDelegate.cppに変数や関数を宣言して各シーンから呼び出してみたのですが、iPhoneでは問題なく動作しましたがAndroidでバックグラウンドに落としてからフォアグラウンドに戻ったときにAppDelegate.cpp内で宣言した変数の値が初期化されてしまうケースがありましたのでやめました。
つぎに、シーンの元になるクラスを作って全てのシーンがそれを継承する形でつくってみました。
AppFrame.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#ifndef __hello__AppFrame__ #define __hello__AppFrame__ #include "cocos2d.h" USING_NS_CC; class AppFrame : public LayerColor { protected: /* ここに共通の処理を書く */ // 例)unix時間を応答する関数 double unixtime(); public: virtual bool init(); CREATE_FUNC(AppFrame); }; #endif /* defined(__hello__AppFrame__) */ |
AppFrame.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include "AppFrame.h" bool AppFrame::init() { if (!LayerColor::initWithColor(Color4B(0, 0, 0, 0))) { return false; } return true; } // unix時間を応答する関数 double AppFrame::unixtime() { struct timeval t; gettimeofday(&t, NULL); return (double)t.tv_sec + (double)t.tv_usec / 1000000; } |
シーンを作るときにはこれを継承して
HelloScene.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#ifndef __HELLOWORLD_SCENE_H__ #define __HELLOWORLD_SCENE_H__ #include "cocos2d.h" #include "AppFrame.h" USING_NS_CC; // AppFrameを継承したクラスにする class HelloWorld : public AppFrame { private: public: static cocos2d::Scene* createScene(); virtual bool init(); CREATE_FUNC(HelloWorld); }; #endif // __HELLOWORLD_SCENE_H__ |
HelloScene.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#include "HelloWorldScene.h" Scene* HelloWorld::createScene() { auto scene = Scene::create(); auto layer = HelloWorld::create(); scene->addChild(layer); return scene; } bool HelloWorld::init() { // AppFrameを初期化する if (!AppFrame::init()) { return false; } // 共通処理を実行 log("%f", unixtime()); return true; } |
とりあえずこれでうまく動いているのでこれでゲームを作っています。