1

誰かがこれで私を助けてくれることを願って... CCMenuAdvancedのここに見られる例に従っていますが、奇妙な結果になってしまいます.メニューが表示され、スクロールしますが、boundaryRectプロパティを使用すると非表示にできないようです.メニューの一部を表示し、必要なものを表示します。

これが私のコードです:

// Setup Menu Alignment
[menuA alignItemsVerticallyWithPadding:0 bottomToTop:NO]; //< also sets contentSize and keyBindings on Mac
menuA.isRelativeAnchorPoint = YES;

menuA.boundaryRect = CGRectMake(0, 100, 230, 200);

[menuA fixPosition];
[self addChild:menuA];

リスト全体をスクロールして表示することはできますが、一度にメニューの一部のみを表示する領域を設定することはできません。これは、boundaryRect が行うべきことです。誰かがこれを以前に使用したことがあり、アドバイスをいただけますか?!?

ありがとう!

4

1 に答える 1

0

ええと、同じクラスからではなく、自家製のスクロールメニューです。menuItems自体の可視性と透明性を使用します。上にスクロールするときに、メニューラベルが長方形の端に近づくと、0にフェードアウトし始めます。menuItemのアンカーポイントが長方形の外側にある場合、その可視性をNOに設定します(したがってクリックできません)。同じように降ります。クランプには注意が必要です。menuItemsのリストが変更されたときに、境界の長方形の高さよりも短くなったり、長方形よりも大きくなったりした場合に備えて、これらのプロパティを設定する必要があります。このようなもの(実際のコードではなく編集された...コンパイルされるかどうかわからない:)):

-(void) fixMenuItemOpacity:(CCMenuItemLabel*) mi{

    float theY = mi.position.y ;

    if (fadeOutZoneHeight_<4.0f) {
        if (theY> self.boundaryRect.origin.y+self.boundaryRect.size.height/2 - fadeOutZoneHeight_) {
            mi.visible=NO;
        } else if( theY < self.boundaryRect.origin.y-self.boundaryRect.size.height/2 + fadeOutZoneHeight_) {
            mi.visible=NO;
        } else {
            mi.visible=YES;
        }
        return;
    }
    float delta;
    float percentOpacity;

    float topWindow;
    float bottomWindow;
    float top;
    float bottom;

    /*

     not visible

     --------------------------- top
     visible, variable opacity
     --------------------------- top window




     opacity 100%




     --------------------------  bottomWindow
     visible, variable opacity
     -------------------------   bottom

     */

    top = self.boundaryRect.origin.y + self.boundaryRect.size.height/2;
    topWindow = top - fadeOutZoneHeight_;
    bottom = self.boundaryRect.origin.y - self.boundaryRect.size.height/2;
    bottomWindow=bottom+ fadeOutZoneHeight_;

    if (theY> top ) {
        mi.visible=NO;
    } else if ( (theY > topWindow) && (theY < top)) {
        mi.visible=YES;
        delta = abs((int)top - (int)theY);
        percentOpacity=delta/fadeOutZoneHeight_;
        mi.opacity=(GLubyte )(255.0f*percentOpacity);
    } else if( (theY <= topWindow ) && (theY >= bottomWindow ) ){
        mi.opacity=255;
        mi.visible=YES;

    } else if ( (theY < bottomWindow) && (theY >= bottom) ){
        mi.visible=YES;
        delta= abs((int)bottom - (int)theY);
        percentOpacity = delta/fadeOutZoneHeight_;
        mi.opacity=(GLubyte ) (255.0*percentOpacity);
    } else {
        mi.visible=NO;
    }


}
于 2012-06-08T12:29:17.800 に答える