2

私は自分のゲームのためにある種のアイテムスクローラーを作ろうとしています。拡張機能を決定し、CCMenuAdvanced作業ボタン付きの作業メニューリストを実装することができました。ただし、境界内にメニューを適切に含める方法がよくわかりません。borderRectがメニューリストの「範囲外」の部分を非表示にしないことは私には明らかです-それはスクロールにのみ責任があるようです。問題は、それを使用して自己完結型のアイテムリストを取得するために他に何をしなければならないかということCCMenuAdvancedです。個々の要素の位置を追跡し、それらの不透明度と可視性を変更する追加の更新方法をスケジュールする必要がありますか、それともこれに対するサポートされている解決策がありますか?

    NSArray *menuItems = [self labelsFromInventory];
    CCMenuAdvanced *menu = [CCMenuAdvanced menuWithItems: nil]; 
    for (CCMenuItem *item in menuItems)
        [menu addChild: item];  

    [menu alignItemsVerticallyWithPadding: 10 bottomToTop: NO]; //< also sets contentSize and keyBindings on Mac
    //menu.isRelativeAnchorPoint = YES; 
    menu.position = ccp(30, 40);
    [self addChild:menu z:2 tag:101];

    menu.scale = MIN ((winSize.width / 2.0f) / menu.contentSize.width, 0.75f );
    menu.boundaryRect = CGRectMake(menu.position.x, menu.position.y, 190.0, 20.0);
    [menu fixPosition];

ありがとう

4

2 に答える 2

3

残念ながら Cocos2d では、アイテムは境界にクリップしません。そのため、アイテムがその境界を脱出すると、a) メイン ウィンドウの境界を離れるか、b) z オーダーで別のアイテムの「下」に入るまで移動を続けます。

あなたが望むことをするために、最初に別のスプライトをレイヤーに追加しようとすることができます。これは、スクロール可能な部分よりも z オーダーが高いソートの「不透明マスク」であり、アイテムがその境界を超えてスクロールしたときにコンテナの場合、Z オーダーの高いアイテムによって「隠され」ます。

代替ルートと私が取ったルートは、UIView(私の場合はUITableView) を使用し、CCUIViewWrapperを使用してそれをラップしてウィンドウに追加することでした。その場合、UIView項目は常に GL ビュー内のすべてのものの上に配置されることに注意する必要があります。また、物事をうまく処理できるわけではないため、機能させるには少しコツが必要です。幸いなことに、Interface Builder を使用してインターフェイスを設計すると、すぐにスクロール マスキングなどを利用できます。

どちらの方法もトレードオフです。現在、Cocos2d にはこれに対する簡単な解決策はありません。少なくとも、私が知っているものはありません。

于 2012-08-06T02:23:33.677 に答える
1

境界ボックスにクランプするメニューを作成するために、CCMenuAdvanced から始めました。メニューの位置を移動する代わりに、メニューに含まれるメニュー項目の位置を移動することにしました。これにより、メニュー項目が境界の外にある場合に、メニュー項目の可視性やその他のプロパティを設定できるようになりました (メニューにboundaryBoxプロパティを追加し、メニュー項目間の間隔、上部の高さ、および下部バッファー ゾーン (ポイント単位))。私のスクロール メニューには、上部または下部に近づくとメニュー項目がフェードアウトする上部と下部のバッファー ゾーンも用意されています。

ccTouchMoved メソッドで、移動が可能かどうかを判断します (つまり、メニュー項目が既に最大 Y または最小 Y になっている)。移動が可能な場合は、deltaY をすべてのメニュー項目に適用し、各メニュー項目の不透明度と可視性のプロパティを設定します。難しかったのはクランプです。

于 2012-08-07T00:30:27.333 に答える