Android/Cocos2Dx

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

default_download.jpg

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

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

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

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

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

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