Android/Cocos2Dx

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

default_download.jpg

Cocos2Dxの構造

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

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

   アプリ層()
   {
    //アプリのアクティブ・非アクティブの管理(生存が前提)
    //ゲームの管理(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 );
}

基本的な考え方

  • Sceneをディレクターに登録する、Sceneは複数持てる
  • Sceneにスプライトを登録する
  • 登録されたスプライトは毎フレーム自動で描画される
  • 描画をしてほしくない時は登録から外すか、非表示にする
    • この辺りの考え方はリクエスト方式と異なり、Unityなんかと一緒

FAQ

Cocos2dxで対応している画像形式

JPEGとPNGだけですって...

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

HelloWorldScene.cppをみるにプロジェクトのルートに「Classes」フォルダがあってそこにおかれている。
ちなみにTemplateフォルダにもHelloWorld.cppとか入っているが、これはCocos newをしてプロジェクトフォルダを
作成する時のコピー元なのでくれぐれも注意。

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

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

#define USING_NS_CC                     using namespace cocos2d

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

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

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

  • Win32環境ではあっさり動いて少しビビった。VCの環境設定が既に出来ていたこともある。この環境さえアレば解析がずっと楽だったのになあ。
  • 逆にWindows10ではWindowsSDKがインストールされてないので、この辺りから再出発の必要がありそう

Visual Studioが2015になったら英語になった

  • 以前の Express 版(日本語版)は最初から日本語が使えましたが、Community 版は英語版しかありませんね。
  • でも、Language Pack というのを入れれば日本語が使えるようになります。
  • ここからダウンロードできます。
    Microsoft Visual Studio 2015 Language Pack
  • あるいは、"Microsoft Visual Studio 2015 Language Pack" でググってください。
vs_langpack.exe というファイルがダウンロードできるので、実行するだけです。もし、 Visual Studio が立ち上がっていたら閉じておいた方がいいかもしれません。
完了したら、Visual Studio 2015 を起動します。このときは、まだ英語版のままです。
メニューバーの Tool / Options で Options ダイアログを開き、International  Settings を変更します。これは Visual Studio 2013 Community と同じですね。
結局、違うのは Language Pack のダウンロード先だけということです。
Visual Studio 2013 Community の日本語化については、たくさん記事があるので適当なものをググってみてください。例えば、下のような記事とやり方は同じです。

Visual Studioのビルド時のショートカットがF7じゃない

  • Shift + Control + Bがデフォになっています
  • Tool > Option > キーボードから、キーバインドをVisual Studio 6形式にすれば期待するキーバインドにできます
    • しかしCtrl + F7になってるので注意

Visual Studio Communityってなに?Expressはどこいった?