0

私の Cocos2d 2.0 iOS ゲームでは、CCMenuAdvanced を使用してスクロール メニューを作成します。問題は、メニューの見えない部分もタッチを処理しているように見えることです。

コードは次のとおりです (boundaryRect を適切に表示およびトリミングするために必要です)。

// background is full screen, with all pixels transparent 
// except the part where menu shows
CCSprite *menuBackground = [CCSprite spriteWithFile:@"scrollingmenubackground.png"];
//...
[self addChild:menuBackground];
//...    
//create menu items
CCMenuAdvanced *settingsMenu = [CCMenuAdvanced menuWithItems:item1, item2, item3, nil];
//...
[menuBackground addChild:settingsMenu];

// foreground is full screen, with an image    
// with a transparent hole where the menu shows
CCSprite *foreground = [CCSprite spriteWithFile:@"scrollingmenuforeground.png"];    
[menuBackground addChild:foreground];
//...

これで問題なく動作し、メニューが表示され、正しくトリミングされ、タッチが処理されます。ただし、問題は、表示されているメニューの下をクリックすると、その前に不透明なピクセルを持つスプライトがあるにもかかわらず、メニューのタッチを処理することです ( foreground)。

前景をメニューよりも高い zorder に設定して zorder をいじってみましたが、何も変わらないようです。

    menuBackground.zOrder = 1;
    settingsMenu.zOrder = 2;
    foreground.zOrder = 3;

メニューの優先順位も に設定してみましINT_MINkCCMenuHandlerPriority - 1が、効果はありませんでした。

ユーザーに表示されている部分でのみメニューが応答するようにするにはどうすればよいですか?

ありがとうアナンド

4

1 に答える 1

1

効果的な「マスク」を作成するには、前景としてタッチが有効になっているレイヤーを使用する必要があります。そのレイヤーでは、メニューの外側のタッチを受け入れ、それらに対して何もせず、マスクの内側にそれらを渡すことができます。ただし、これにより問題が発生します。touchBeginがマスクの内側で開始され、ユーザーが指を外側にドラッグした場合でも、メニューはスクロールし続けます。CCAdvancedMenuをサブクラス化して独自のタッチ処理要件を実装するか、独自のバージョンを作成することができます。私のゲームデザイナーがそれから他の多くの機能を望んでいて、サブクラス化が助けではなく障害になったので、私は後者をやることになりました。ところで、タッチ処理のためにzOrderに依存しないでください、それらは関連していません。

また、「タッチマスク」アプローチはおそらく戻ってきて、後であなたを悩ませます(たとえば、スクロールメニューの横にタッチが必要な他のオブジェクトを追加すると、タッチがマスクされます)、すべてのオブジェクトが最適ですタッチ関連の要件の実装に関係するものは、独自の実装をカプセル化します。

于 2013-02-06T12:09:11.097 に答える