Cocos2d-x と pd-for-android その7

というわけで、pd-for-android から metro が bang を送ってくるタイミングでスプライトを制御(パラパラアニメさせる)お話。

色々ネット検索してるうちに、どうやら java から C++ の関数を呼び出してスプライトを動かしたりするのは危険なので、C++ の関数内ではフラグなどを立てて、cocos2d-x の schedule を使って、update で処理したほうが良いらしいことは分かったのです。

さてさて、そのフラグをどうしたら持てば良いのかしら? と、HelloWorldScene.h に bool isChange; などと書いて、java から呼び出される関数に HelloWorldScene::isCahnge = true; とか書いてみましたが、そりゃダメよね、だってダメだもの。

それじゃと、static bool isChange; と書き換えてみましたが、もちろんダメ。

っていうか、書きながら「これで動いたら儲けもの」とか思ってるんだから動くはずもなく。

散々、試行錯誤を繰り返したあげく、もう、考えるのが面倒くさくなったので、グローバルな位置に static で書いてみた。
HelloWorldScene.cpp の各種定義のあとあたりに、static bool isChange = false; みたいな感じ。

java から 呼び出される C++ の関数で isChange = true; とか書いてやって、update() の中で if(isChange){ log("isChange"); isChange = false } と試したみたところ上手く行っているもよう。

まぁ、これが正しいかどうか今のところ不明。
グローバル変数を使わないやり方ってあるんじゃろか・・・。


さて、当初の目的、スプライトを metro のタイミングでパラパラアニメさせるってヤツですが、基本的には metro のタイミングでカウントアップして、それに合わせて画像を切り替えるだけなので問題なかったのですが、一部のパターンで同じ画像が連続してしまってアニメしているように見えない問題は発生。

で、アニメーションキャッシュにアニメパターンを登録して、そのパターンのときだけ引っ張り出してやって再生しようと思ったんですが、何が原因か不明ですが、そのパターンになる前にパタパタアニメで指定していた画像を含めてアニメーションが再生されてしまった。
いや、アニメーション・キャッシュに指定してない画像が再生されちゃうんですよ。

で、良く分からないので、アニメを呼び出すときに一回、
sprite->setSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("parapara00.png"));
と、アニメに指定している最初のフレームの画像をセットして回避してみた。

まぁ、たぶん何か指定の方法が間違っているんだろうケド、一応、今のところ症状が出てないので良しとする。

あと、勘違いしていたのは、

animation->setRestoreOriginalFrame(true);

って、次回アニメさせるときに「最初のフレームから再生しろ」じゃなくて、「再生時間が終わったら最初のフレームに戻れ」なのね。
Repeat させてるときは気がつかなかったー。

スポンサーサイト

コメント

非公開コメント