2

以下は私が思いついたものです。それを行う簡単な方法があるかどうか疑問に思います。

メニューレイヤーのみがアップしている間だけタッチ可能にしたいとします。
タッチを飲み込む目に見えないレイヤーを入れます。

bool tNoTouchLayer::init()
{
    if(!CCLayer::init()) {
        return false;
    }

    setIsTouchEnabled(true);

    return true;
}

void tNoTouchLayer::registerWithTouchDispatcher()
{
    CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true);

}

bool tNoTouchLayer::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
{
    return true;
}

これで、メニュー レイヤーを追加する前に noTouchLayer を追加できます。すべてのタッチは noTouchLayer によって盗まれます。

4

5 に答える 5

0

最後に、私はこれに関するより多くの情報を見つけました:

http://code.google.com/p/cocos2d-iphone/issues/detail?id=1033

メニュー項目がタッチを盗む理由は、メニュー項目のタッチ優先度が可能な限り高い(最も低いchar値)に設定されているためです...

代わりに、kCCMenutouchPriorityを0に変更できます。

于 2012-11-09T18:40:13.067 に答える
0

私が知る限り、それがあなたのやり方です。ただし、コードによってシーンに追加されたメニューが無効になることはありません。これを行うには、ポップアップを追加するときにタッチディスパッチャからメニューを削除し、ポップアップを削除するときにメニューを再度追加する必要があります。

タッチディスパッチャからメニューを削除するには、次の手順を実行できます。

CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(menu);

そしてそれを追加し直すには、これを行うことができます:

CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(menu, kCCMenuHandlerPriority, true);

ここで、menuはCCMenuノードです。

ヒントとして、上記のようなクラスを作成しましたが、それにポップアップメニューも追加して、1つのノードにワンタッチブロックメニューを作成しました。:)

于 2012-07-19T04:47:15.677 に答える
0

これはまさにあなたが探している答えではありませんが、ここで考えるべきことがあります:

ポップアップに対してこれを行おうとしている場合、UIAlertView のサブクラス (希望どおりに見えるもの) をポップアップすることは可能でしょうか?

http://mobile.tutsplus.com/tutorials/iphone/ios-sdk-uialertview-custom-graphics/

于 2012-11-02T15:53:18.293 に答える
0

別のアプローチを次に示します。

アプリの状態と、どのレイヤーが「上」にあるかを保持します。

各メニューリスナーで、現在のレイヤーの状態がそのメニューボタンを押すことを許可するかどうかを確認するために、すべてのリスナーにチェックを行わせます。

また、「addchild」をオーバーライドして、それが MenuItem であるかどうかを確認し、それが MenuItem である場合は、有効にする必要があるかどうかを確認することができます。そうでない場合は、残りのコードを実行する代わりにすぐに戻ります

于 2012-11-09T18:38:41.840 に答える
0

私があなたの質問を正しく理解していれば、「画面を一時停止」のようなことをして、他のすべてのレイヤーをポップアップして無効にしようとしていると思います。

さて、あなたはコメントで、他の領域ではタッチイベントを有効にしたくないが、ポップアップの領域では有効にしたくないと言っていました。基本的にレイヤーで考えた方が分かりやすく実装しやすいと思います。

子として表示する他のゲーム オブジェクトを保持する「メイン レイヤー」があるかどうかを見てみましょう (それらもアニメーションを実行していると仮定します)。ここで、ボタンをタッチして「一時停止レイヤー」をポップアップさせたいとします。他のレイヤー + オブジェクトからのすべてのタッチ イベントを無効にするには、次の手順を実行する必要があります。

  • [ pauseSchedulerAndActions()を介して]レイヤーのスケジュールとアクションを一時停止します
  • レイヤー内のすべてのゲーム オブジェクト (つまり、敵) を一時停止します [ pauseSchedulerAndActions()経由]
  • CCMenu オブジェクトを無効にします (存在する場合)。これにより、CCMenu 関連オブジェクト ie.CCMenuItemImage のタッチ イベントが無視されます [ setEnabled(false)経由]
  • レイヤー自体のタッチ イベントを無効にする [ setTouchEnabled(false)経由]

最初の 2 点は、任意のスケジュール メソッドの実行を停止することと、アニメーションについてです。後半の2点は、タッチイベントの受付停止についてです。CCMenu* 関連のクラスは、CCLayer とは別に独自のタッチ イベントを保持していることがわかります。そのため、CCMenu* オブジェクトとレイヤー自体の両方に設定して、追加の作業を行う必要があります。

私はこれを試しましたが、私にとってはうまくいきます。また、私の意見では、ディスパッチャーを直接設定する必要がないので、より良いです。

于 2013-02-10T21:41:38.273 に答える