#author("2016-05-17T07:33:40+00:00","","")
#author("2016-05-17T07:35:55+00:00","","")
[[Android/Cocos2Dx]]

*C言語の開発で従来のスプライトリクエスト式を実装できるか? [#o88c06f9]
&ref(http://static1.squarespace.com/static/52aa8827e4b04dd8c2598a98/t/530180d1e4b06573bf2afb45/1392607465228/default_download.jpg);

*Cocos2Dxの構造 [#y4f09d96]

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

 マシン
  ↓
 OS/ハードウェア層
 {
    // アプリの生存管理(起動、終了)OS,機種依存
 
    アプリ層()
    {
     //アプリのアクティブ・非アクティブの管理(生存が前提)
     //ゲームの管理(OS、機種依存)
 
        ゲーム層()
        {
      //アクティブ時の処理
      //ここが共通部分
        }
    }
 }


**Cocosのメインループ(ハードからアプリ、ディレクターまで) [#hc8ac661]
起動後、アプリから「ディレクター」というゲームを管理する役割のクラスに
処理を移し、ディレクターが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)とは? [#j9df5be9]
-自分のアプリはディレクターに管理してもらう。
-ゲーム(Scene)を「Director」に登録することで呼び出してもらう
-呼び出してもらう頻度はスケジューラーをつかってディレクターに伝えておくこと
-ディレクターはシングルトン
-Sceneは複数持てる


D:\dev\cocosPrj\sample3\cocos2d\cocos\platform\android

     AppDelegate::applicationDidFinishLaunching()
     {
      //1度だけ通る初期化
      auto scene = HelloWorld::createScene();
     
      // sceneをdirectorに登録
      director->runWithScene(scene);
     }


***ディレクターのメインループとスケジューラー[#s27601e4]
描画するためのrender()は呼び出されているがゲーム本体を更新するための
いわゆるaction()が見つからなかった。追いかけて行くとスケジューラーの
updateで、時間に応じて複数の関数が呼び出されるべく関数ポインタが
設定されていた。なので、既定のactionはないのでディレクターを通じて
必要なActionを適宜設定する作法なのだと思われる

つまりディレクターはスケジューラーというメモを持っていますので、
そのメモに自分のゲームを登録してもらって、毎フレーム呼び出してもらうことに
するわけです。

 DisplayLinkDirector::mainLoop()
 {
   drawScene();
 }

 void Director::drawScene()
 {
  //時間に応じてゲームを呼び出す
  _scheduler->update(_deltaTime);
  
  //描画する
  _renderer->render();
  
  //描画した絵をメイン画面にフリップする
  _openGLView->swapBuffers();
 }


***スケジューラーにゲームのactionを登録する [#aa413430]
-毎フレーム「update」という関数を呼び出すようにする
 	this->scheduleUpdate();

-action関数を追加する
 void HelloWorld::update(float delta) {
   毎フレーム更新することをかく
 }

-できた!1秒毎に右に移動している

 void HelloWorld::update(float delta)
 {
   count ++;
     m_pSpr->setPosition( count/60 , 128 );
 }

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


*FAQ [#r45eb4cb]
***Cocos2dxで対応している画像形式 [#h04cb732]
JPEGとPNGだけですって...

***ゲームのソースはどこに置くのか? [#s2227160]
HelloWorldScene.cppをみるにプロジェクトのルートに「Classes」フォルダがあってそこにおかれている。色んなバッチファイルの対象に入ってるかもしれないので、他の場所に置く勇気がない。
HelloWorldScene.cppをみるにプロジェクトのルートに「Classes」フォルダがあってそこにおかれている。
ちなみにTemplateフォルダにもHelloWorld.cppとか入っているが、これはCocos newをしてプロジェクトフォルダを
作成する時のコピー元なのでくれぐれも注意。

***Sprite型の変数をHelloWorldScene.hでメンバー変数にできない [#rdd5adea]
ネームスペースに含まれていない。cppファイルで記載されているマクロのおかげで
cocos2dライブラリの型を使用できるがヘッダーには含まれていない。以下のように
定義されている。

 #define USING_NS_CC                     using namespace cocos2d

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

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

-Win32環境ではあっさり動いて少しビビった。VCの環境設定が既に出来ていたこともある。この環境さえアレば解析がずっと楽だったのになあ。

-逆にWindows10ではWindowsSDKがインストールされてないので、この辺りから再出発の必要がありそう

***Visual Studioが2015になったら英語になった [#db5072b5]
-そもそもVCのプロジェクトを開いたらVC2015にアップデートすることになった
-Visual Studio 2015 Community の日本語化 [[http://qiita.com/tadnakam/items/8d89dc17d3f1733c1a56]] 以下抜粋。

--以前の Express 版(日本語版)は最初から日本語が使えましたが、Community 版は英語版しかありませんね。
--でも、Language Pack というのを入れれば日本語が使えるようになります。
--ここからダウンロードできます。
[[Microsoft Visual Studio 2015 Language Pack>https://www.microsoft.com/ja-jp/download/details.aspx?id=48157]]
--あるいは、"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じゃない [#m88c4f24]
-Shift + Control + Bがデフォになっています
-Tool > Option > キーボードから、キーバインドをVisual Studio 6形式にすれば期待するキーバインドにできます
--しかしCtrl + F7になってるので注意

***Visual Studio Communityってなに?Expressはどこいった? [#n4d6c0a9]
-Expressにかわる無料の開発環境で無料のVisual Studioのようです
-ぱっとみてパフォーマンスアナライザー的なものがついてる、いいね!
[[http://www.buildinsider.net/hub/insidersbreak/2014112101]]
[[http://www.buildinsider.net/mobile/xamarinvisualstudio/01]]