Android/Cocos2Dx

C言語の開発で従来のスプライトリクエスト式を実装できるか?

default_download.jpg

Cocos2Dxの構造

「OS/ハードウェア層 > アプリ層 > ゲーム層」というような感じで3層あるイメージ

マシン
 ↓
OS/ハードウェア層
{
   // アプリの生存管理(起動、終了)

   アプリ層()
   {
    //アプリのアクティブ・非アクティブの管理(生存が前提)
    //ゲームの管理

       ゲーム層()
       {
     //アクティブ時の処理
     //ここが共通部分
       }
   }
}

Cocosのメインループ(ハードからアプリ、ディレクターまで)

起動後、アプリから「ディレクター」というゲームを管理する役割のクラスに
処理を移し、ディレクターが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
     }
    }
   }
  }

ディレクター(Director)とは?

  • 自分のアプリはディレクターに管理してもらう。
  • ゲーム(Scene)を「Director」に登録することで呼び出してもらう
  • 呼び出してもらう頻度はスケジューラーをつかってディレクターに伝えておくこと
  • ディレクターはシングルトン
  • Sceneは複数持てる

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();
}

スケジューラーにゲームのactionを登録する

  • 毎フレーム「update」という関数を呼び出すようにする
    	this->scheduleUpdate();
  • action関数を追加する
    void HelloWorld::update(float delta) {
      毎フレーム更新することをかく
    }
  • できた!1秒毎に右に移動している
void HelloWorld::update(float delta)
{
  count ++;
    m_pSpr->setPosition( count/60 , 128 );
}

FAQ

ゲームのソースはどこに置くのか?

HelloWorldScene.cppをみるにプロジェクトのルートに「Classes」フォルダがあってそこにおかれている。色んなバッチファイルの対象に入ってるかもしれないので、他の場所に置く勇気がない。

Sprite型の変数をHelloWorldScene.hでメンバー変数にできない

ネームスペースに含まれていない。cppファイルで記載されているマクロのおかげで
cocos2dライブラリの型を使用できるがヘッダーには含まれていない。以下のように
定義されている。

#define USING_NS_CC                     using namespace cocos2d

ヘッダーにもマクロを追加してみるのでどうか

NDKのソースをデバッグしにくい

コマンドプロンプトでエラーを確認して、該当のファイルを開くのは正直めんどう。
だからこそ、そんな時は!せっかくのCocosなんで好きなOSで好きなIDEでデバッグしたらいいんじゃないかな。

Sprite表示のしかた