2

一連のアニメーションの後にアクションを設定しようとしています。基本的には、メソッドに (引数として渡したい) オブジェクトを使用する必要があります。

私が見つけた唯一の方法は、(私が知る限り)引数を持つことになっていない CCCallFunc を使用することです。

cocos2d/objective-c の一種の「callBlock」は存在しますか? これは素晴らしい楽器です。cocos2d-x に似たものがあれば知りたいです。

コードは次のとおりです。

CCCallFuncND *callBack = CCCallFuncND::create(this, callfuncND_selector(MyObject::method), data);

静的関数のみを使用して(初期化されていない)クラス内で実行しようとしているため、「this」を使用できないため、NULLとして設定しようとしましたが、この場合はエラーが発生しました...

4

2 に答える 2

2

一連のアクションを実行した後、同じことをしなければなりませんでした。アニメーションが終了したときにアニメーション フレームが画面に表示されないように、bacthNode からスプライトを削除したかったので、バッチ ノードを関数に渡す必要がありました。これが私がそれを達成した方法です:-

CCSequence *seq=CCSequence::createWithTwoActions(
    CCAnimate::create(animation), 
    CCCallFuncO::create(
        animation, 
        callfuncO_selector(GameLayer::animationReshuffleFinished),
        (CCObject*)animBatchNode)
);

必要な関数は、ND ではなく CCCallFuncO です。ここで O はオブジェクトを表します。

CCCallFuncO::create(
    animation,
    callfuncO_selector(GameLayer::animationReshuffleFinished),
    (CCObject*)animBatchNode)

animation私の CCAnimate オブジェクト は、アニメーションがanimationReshuffleFinished終了したときに呼び出されるクラス GameLayer のコールバック関数です。(CCObject*)animBatchNode)関数 animationReshuffleFinished の引数です

ここに関数の定義があります

 void GameLayer::animationReshuffleFinished(CCObject *sender){
    CCSpriteBatchNode *animBatchNode = (CCSpriteBatchNode*) sender;
    animBatchNode->cocos2d::CCNode::removeAllChildrenWithCleanup(true);
    }

これがあなたの目的に役立つかどうか教えてください。

于 2013-12-02T17:52:23.757 に答える
1

あなたはできません。SEL_CallFuncXXX の定義を確認すると、関数は CCObject のメンバー関数でなければならないことがわかります。

現在の cocos2d-x コールバックは cocos2d から完全にコピーされていますが、Objective-C の方法は C++ には適合しません。制限事項は次のとおりです。

1、複数の基本クラスを持つオブジェクトを渡すと機能しない場合があります。

2, XXX::f(bool) のようにスタックに割り当てるパラメータを渡すことはできません。その中で bool を渡すことはできません。

3、あなたが質問したように、コールバック関数は CCObject から派生したクラスのメンバー関数である必要があります。そのため、静的関数またはグローバル関数は使用できません

代わりに std::function と std::bind を使用しない理由に興味があるかもしれませんが、cocos2d のコピーが速すぎて、考える時間がなかったのかもしれません。

于 2013-11-21T06:23:56.747 に答える