0

私たちは cocos2d でトリビアの質問を受ける可能性のあるゲームに取り組んでいます。トリビアの質問は、すべての質問を含む CCMenu を含む、ゲームボードの上部にある新しい透明な CCLayer として実装されます。

私たちの問題は、タッチが適切に伝播するのを止めることができないように見えることです. トリビア メニューが表示されているとき、プレイヤーはボード レイヤーの [サイコロを振る] ボタンをクリックできないようにする必要があります。

dice.isTouchEnabled=NO;トリビア レイヤーを追加する直前に呼び出すことでこれを実装しようとしましたが、サイコロ ボタンを再度有効にする方法がわかりません。

ccTouchBeganまた、常にすべてのタッチを消費するように NO から YES に変更しようとしましたが、メニューに応答しなくなりました。これは正しい方法のようですが、メニューが応答しなくなったのはなぜですか?

私たちの教授はコールバック関数を実装することを提案しました。もちろんそれは可能ですが、それよりも簡単なはずです。

誰か提案はありますか?

4

1 に答える 1

2

これを行うには2つの方法があることを理解しています。

方法 1 (私が使用している方法)

  1. トリビアの質問がポップアップする前に、以下の機能を使用して、Underlying Scene ノードのメニューを無効にします。このメソッドは再帰的なメソッドであるため、ノードの子のすべてのメニューも無効にします。

  2. トリビアの質問が却下されたら、Underlying Scene ノードによって受信され、ノードとその子のメニューを再度有効にする NSNotification を送信します。NSNotification のブロック メソッドを使用して、コードを短縮できます。

ドキュメントaddObserverForName:object:queue:usingBlock:

(void) MenuStatus:(BOOL)_enable Node:(id)_node {

    for (id result in ((CCNode *)_node).children) {
        if ([result isKindOfClass:[CCMenu class]]) {
            for (id result1 in ((CCMenu *)result).children) {
                if ([result1 isKindOfClass:[CCMenuItem class]]) {
                    ((CCMenuItem *)result1).isEnabled = _enable;
                }
            }
        }
        else
            [self MenuStatus:_enable Node:result];
    }
}

方法 2

Trivia Question レイヤーの下のすべてのタッチを飲み込む非表示レイヤーを作成します。試すことができるクラスは次のとおりです: https://gist.github.com/christophercotton/1563708

于 2013-04-10T03:13:32.310 に答える