「OS/ハードウェア層 > アプリ層 > ゲーム層」というような感じで3層あるイメージ
マシン
↓
OS/ハードウェア層
{
// アプリの生存管理(起動、終了)
アプリ層()
{
//アプリのアクティブ・非アクティブの管理(生存が前提)
//ゲームの管理
ゲーム層()
{
//アクティブ時の処理
//ここが共通部分
}
}
}
起動後、アプリから「ディレクター」というゲームを管理する役割のクラスに
処理を移し、ディレクターがmainLoopの中でwhileの無限ループを進行させている。
また、その前に1度だけゲームの初期化を行うための「applicationDidFinishLaunching()」関数でゲームの初期化を行っている
simulator\frameworks\runtime-src\proj.win32
int APIENTRY _tWinMain(HINSTANCE hInstance,
{
int SimulatorWin::run()
{
int Application::run()
{
applicationDidFinishLaunching(); //起動後1度だけ来る初期化
while( Windowがクローズしていなければ回る )
{
director->mainLoop(); ※1
}
}
}
}
D:\dev\cocosPrj\sample3\cocos2d\cocos\platform\android
AppDelegate::applicationDidFinishLaunching()
{
//1度だけ通る初期化
auto scene = HelloWorld::createScene();
// sceneをdirectorに登録
director->runWithScene(scene);
}
描画するためのrender()は呼び出されているがゲーム本体を更新するための
いわゆるaction()が見つからなかった。追いかけて行くとスケジューラーの
updateで、時間に応じて複数の関数が呼び出されるべく関数ポインタが
設定されていた。なので、既定のactionはないのでディレクターを通じて
必要なActionを適宜設定する作法なのだと思われる
つまりディレクターはスケジューラーというメモを持っていますので、
そのメモに自分のゲームを登録してもらって、毎フレーム呼び出してもらうことに
するわけです。
DisplayLinkDirector::mainLoop()
{
drawScene();
}
void Director::drawScene()
{
//時間に応じてゲームを呼び出す
_scheduler->update(_deltaTime);
//描画する
_renderer->render();
//描画した絵をメイン画面にフリップする
_openGLView->swapBuffers();
}
this->scheduleUpdate();
void HelloWorld::update(float delta) {
毎フレーム更新することをかく
}void HelloWorld::update(float delta)
{
count ++;
m_pSpr->setPosition( count/60 , 128 );
}
HelloWorldScene.cppをみるにプロジェクトのルートに「Classes」フォルダがあってそこにおかれている。色んなバッチファイルの対象に入ってるかもしれないので、他の場所に置く勇気がない。
ネームスペースに含まれていない。cppファイルで記載されているマクロのおかげで
cocos2dライブラリの型を使用できるがヘッダーには含まれていない。以下のように
定義されている。
#define USING_NS_CC using namespace cocos2d
ヘッダーにもマクロを追加してみるのでどうか
コマンドプロンプトでエラーを確認して、該当のファイルを開くのは正直めんどう。
だからこそ、そんな時は!せっかくのCocosなんで好きなOSで好きなIDEでデバッグしたらいいんじゃないかな。