2015年10月04日

【cocos2d-x】runActionに渡すActionインスタンスをシーンクラスのメンバーにしたらアプリが落ちた件(Android)

cocos2d-x 3.7において。

たとえば画面外に置いたSpriteのインスタンスを画面内に引き出して、しばらくしてまた引っ込めるというのをやるときは、よくあるサンプルプログラムではActionのサブクラスを使ってこんな感じで組むと思います。


〜GameScene.cpp〜
bool GameScene::init()
{
〜略〜


}
bool GameScene::onTouchBegan(cocos2d::Touch *touch, cocos2d::Event *event)
{
auto _move1 = EaseOut::create(MoveBy::create(2.0f, Vec2(64.0f, 0.0f)),4);
auto _move2 = DelayTime::create(2.0f);//MoveBy::create(2, Vec2(0.0f, 0.0f));
auto _move3 = EaseIn::create(MoveBy::create(2.0f, Vec2(-64.0f/2, 0.0f)),4);
auto m_moveSequence = Sequence::create(_move1, _move2, _move3, nullptr);
_obj->runAction(m_moveSequence);//_objは初期化済みのSprite等
return true;
}


これでうまくいきます。

ただ僕はここでSequenceのインスタンスをシーン内で共有して使えないかと、GameSceneクラスのメンバ変数にしてみました。


〜GameScene.h〜
public:
Sequence *m_moveSequence;

〜GameScene.cpp〜
bool GameScene::init()
{
〜略〜
auto _move1 = EaseOut::create(MoveBy::create(2.0f, Vec2(64.0f, 0.0f)),4);
auto _move2 = DelayTime::create(2.0f);//MoveBy::create(2, Vec2(0.0f, 0.0f));
auto _move3 = EaseIn::create(MoveBy::create(2.0f, Vec2(-64.0f/2, 0.0f)),4);
m_moveSequence = Sequence::create(_move1, _move2, _move3, nullptr);
}

bool GameScene::onTouchBegan(cocos2d::Touch *touch, cocos2d::Event *event)
{
_obj->runAction(m_moveSequence);//_objは初期化済みのSprite等
return true;
}


これをやったらタッチイベント起こした瞬間に落ちました(笑)

よくわからないけれどcocos2d-xの内部まで追う気力も今のところないので、そういう仕様だと思ってローカルで必要な時にActionを生成して動かすのがあまり時間を食わないで済みそうです。

cocos2d-xは本当にわからないことだらけで、たとえば「自分独自のシーンクラスをつくってそれをスーパークラスにしてぐへへへへへw」とやろうとしてことが過去にありまして。
結果としてよくわからない実行時エラーで落ちて動かず、むしろ「そのまま使った方が楽じゃね?」と悩まされた時期もありました。
人の作ったプラットフォームで便利なのはあるのですが、独学のなんちゃってプログラマーとはいえそろそろ20年選手、もっとうまく(頭を)使えないかなあーとか考える今日この頃でした。
posted by B.cos at 14:13| Comment(0) | TrackBack(0) | cocos2d-x | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

この記事へのトラックバックURL
http://blog.seesaa.jp/tb/427220204
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック