Cocosの流れをおさらい

default_download.jpg

AndroidのNDKのインストールを行う
 ↓
※Windows環境ではPythonを動かすためのパイソンのインストールを先に行う
 ↓
Setup.pyでCocos2dxのインストールをする
 ↓
AndroidNDKのパスを記載する
 ↓
ターゲットになるマシンのプロジェクトを立ち上げる
※apple系はapple系のマシンでしかコンパイルできない
※Windows系はWindowsマシンでしかコンパイルできない
 ↓
プラットフォームに応じたCocos2Dライブラリをビルドする
 ↓
「cocos new プロジェクト名~~~」 をコマンドラインから行う
 ↓
できたプロジェクトのソースを編集してコンパイルする
 ↓
Cocos2Dライブラリとリンクする
 ↓
ターゲットマシンに転送する
 ↓
動く

※macでwwindowsは動くが、その逆はできない。ので1つの開発マシンで全ての環境を担おうと思うとmacで開発環境を揃える方がいいような感じ。

memcpy/memsetが使えない

  • Win32環境でコンパイルするとこれらが使えないです(Android-Sudio環境のNDKでは通った)セキュアな関数に移行してしまっているので、こいつらは関数をラッピングシてあげないとプラットフォームごとに#ifdefとかでコードを切り分けることになっちゃうので注意。

CCLogが使えない?

エディットコンティニュー

デバッグ情報のフォーマットを“Program Database for Edit and Continue (/Zi)”に設定することが必要。
インクリメンタルリンクの有効化に“Yes (/INCREMENTAL)”を設定することが必要。
Debug -> Optionの“Native Edit and Continue”を有効にすることが必要。

スプライトにテクスチャを割り当てたい

これでいいようです。

//Sprite *m_pSpr;
m_pSpr->setTexture( CCTexture2D *pTexture );

テクスチャをメモリで作りたい

256x256でアルファチャンネル付き32bit(4バイト)画像を作る

int texLength = 256 * 256 * 4;
char *pData = (char*)malloc(texLength);

m_pTex = new CCTexture2D();
m_pTex->initWithData(pData, texLength, Texture2D::PixelFormat::RGBA8888, 256, 256, size );

 これでinitWithDataしたあとは、テクスチャの中身がCocosの管理下に置かれているようでpDataをfreeしても問題なかった。

もちろんpDataの中身はARGB8888で構成すること。0x80808080だとグレー、0xffffffffだと白になるよ!

テクスチャを毎フレーム更新できる?

pDataの中身を毎フレーム入れ替えても問題なかった。しかし使用メモリが数MB増えた(リークはしていない)のと、FPSが60から55に落ちたのが気になる。

  • 256x256テクスチャを生成するための26万回のメモリコピーが5FPS落ちる原因だった。
  • 毎フレームinitWithDataしてもFPSは変わらなかった

テクスチャの範囲をはみ出した表示はどうなる

  • アドレッシングモードにもよるけどデフォルトでクランプモード(最後のピクセルを引きのばす)になった

clump.png

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

複数のスプライト描画を無限に生成するにはどうすればいいか?

最終的にはdraw関数で描かれている。ただし、Sceneに登録したスプライトは自動で呼び出されるため。自分でdrawする必要はない。
それをあえて自前でdrawする(Sceneに登録せずに描画する)にはどうすればいいのか?できるのか?

スプライトはどこで描かれているか?

  • 同等のスプライトを自前で描画したい時にはdrawを自前で読んでやればいいと思われる。
  • ただし、レンダラーと姿勢制御の4x4のマトリックスを作成して引数に加える必要があるので面倒
  • やってみたけど失敗した、OpenGLの描画タイミングとあわない感じ。updateでdrawすることになってしまった

では登録したスプライトで弾幕を作るのはどうするか?

  • SpriteBatchを使って表示してみる
  • SpriteBAtchで毎フレームの最初に持っているchildを全部削除(removeAllChildrenWithCleanup(true))
  • そのフレームで必要なスプライトをaddChildすることでどうなるか
  • 表示には成功

ブレンドファンクション

        ccBlendFunc blend;

        blend.src = GL_ONE_MINUS_DST_COLOR;
        blend.dst = GL_ONE;

        hoge->setBlendFunc(blend);
srcdst
ノーマルGL_SRC_ALPHAGL_ONE_MINUS_SRC_ALPHA
加算GL_SRC_ALPHAGL_ONE
減算GL_ZEROGL_ONE_MINUS_SRC_COLOR
乗算GL_ZEROGL_SRC_COLOR
反転GL_ONE_MINUS_DST_COLORGL_ZERO
XORGL_ONE_MINUS_DST_COLORGL_ONE_MINUS_SRC_COLOR
スクリーンGL_ONE_MINUS_DST_COLORGL_ONE
加算GL_SRC_ALPHAGL_ONE

アンカーポイントの原点(anchorPoint)

アンカーポイントの原点は「左下」なんですって。(1.0f,1,0f)で右上になるとのこと

これはノードの左下を(0,0)とし、右上を(1,1)としたそのノードの基準点で、デフォルトは中心(0.5 , 0.5)に設定されていま す。
setPositionで設定した位置はこの点の位置が設定されますし、getPositionではこの点の座標が返されます。

2Dベースのライブラリなのに変わった座標系だなぁ

添付ファイル: fileclump.png 176件 [詳細]