1

スケーリングされたCCMenuItemSpriteメニュー項目でCCMenuを使用する際に問題が発生しました。ゲームがプレイされているデバイスに基づいて、メニュー項目のスプライトを異なる方法でスケーリングしようとしています(iPadでは約1.5倍にスケーリングする必要がありますが、iPhoneでは約0.75倍にスケーリングする必要があります)

私が読んだことから、CCSpriteを直接スケーリングしたり、CCMenuItemSpriteをスケーリングしたりすることはできません。これは、CCMenuに追加されたときに、タッチ長方形が正しく更新されないためです。メニュー項目を拡大縮小するには、CCMenuを拡大縮小する必要があると思います。

これを行うと、スプライトは正しいサイズにスケーリングされているように見えますが、CCMenuの位置座標もスケーリングされているように見えますが、予想とは逆の方向になっています。また、特定のしきい値を超えると、メニューが完全に消えるように見えます。

CCMenuでスプライトをスケーリングする方法について誰か提案がありますか?

前もって感謝します。バズリック

4

3 に答える 3

4

このコードを試してください........

CCMenuItemImage  *Btn1 = [CCMenuItemImage itemWithNormalImage:@"button1.png" selectedImage:@"button1_active.png" target:self selector:@selector(button1_click:)];

CCMenuItemImage  *Btn2 = [CCMenuItemImage itemWithNormalImage:@"button2.png" selectedImage:@"button2_active.png" target:self selector:@selector(button2_click:)];

CCMenu *Action_menu = [CCMenu menuWithItems:Btn1,Btn2, nil];

[Action_menu setPosition:ccp( 79, 288)];

float delayTime = 0.3f;

for (CCMenuItemFont *each in [Action_menu children]) 
    {
        each.scaleX = 0.0f;
        each.scaleY = 0.0f;
        CCAction *action = [CCSequence actions:
                            [CCDelayTime actionWithDuration: delayTime],
                            [CCScaleTo actionWithDuration:0.5F scale:1.0],
                            nil];
        delayTime += 0.2f;
        [each runAction: action];
    }

[self addChild:Action_menu];
于 2012-08-17T05:17:04.130 に答える
2

最終的に解決した方法は次のとおりです。基本的に、最初にメニュー要素を作成し、次に位置/スケーリング/回転を分類しました。これははるかにうまくいくようです。以下のこのコードサンプルは、1つのスプライトを使用して2つの対向する左/右矢印ボタンを作成しているところです。

    [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"ButtonSprites.plist"];
    CCSpriteBatchNode *buttonSprites = [CCSpriteBatchNode batchNodeWithFile:@"ButtonSprites.png"];
    [self addChild:buttonSprites];

    CCSprite *arrowLeftSprite = [CCSprite spriteWithSpriteFrameNameOrFile:@"PageArrow"];
    CCSprite *arrowLeftSpriteSelected = [CCSprite spriteWithSpriteFrameNameOrFile:@"PageArrow"];
    arrowLeftSpriteSelected.opacity = 128;
    CCSprite *arrowRightSprite = [CCSprite spriteWithSpriteFrameNameOrFile:@"PageArrow"];
    CCSprite *arrowRightSpriteSelected = [CCSprite spriteWithSpriteFrameNameOrFile:@"PageArrow"];
    arrowRightSpriteSelected.opacity = 128;

    float buttonWidth = screenSize.width * ButtonWidthPercent;
    int contentPixelWidth = arrowLeftSprite.contentSize.width;
    float scale = buttonWidth / contentPixelWidth;

    CCMenuItemSprite *pageLeftMenu = [CCMenuItemSprite itemFromNormalSprite:arrowLeftSprite selectedSprite:arrowLeftSpriteSelected target:self selector:@selector(buttonPageLeft:)];
    CCMenuItemSprite *pageRightMenu = [CCMenuItemSprite itemFromNormalSprite:arrowRightSprite selectedSprite:arrowRightSpriteSelected target:self selector:@selector(buttonPageRight:)];

    //  First perform the creation
    CCMenu *menu = [CCMenu menuWithItems: mainMenu, pageLeftMenu, pageRightMenu, nil];
    menu.position = ccp(0, 0);

    //  THEN deal with layout,rotation, and scaling
    pageLeftMenu.scale = scale;
    pageLeftMenu.rotation = 180;
    pageRightMenu.scale = scale;

    float arrowHeight = screenSize.height * 0.2;
    pageLeftMenu.position = ccp(screenSize.width * 0.1, arrowHeight);
    pageRightMenu.position = ccp(screenSize.width * 0.9, arrowHeight);

    [self addChild:menu z:2];
于 2012-08-19T01:26:09.713 に答える
2

私のおすすめ?しないでください!

内部的にCCMenuは、メニュー項目に触れるたびにメニュー項目を拡大縮小しました。アイテムを長押しすると、スケールアップ(ズームイン)されます。したがって、メニュー項目に適用するスケーリングは、遅くともメニュー項目に触れると失われます。

そして、お気づきのように、スケーリングはアイテムのタッチ領域に影響します。ズームレベルによっては、アイテムがアイテムの外側のタッチに応答したり、タッチに応答しなかったりする可能性があります。同じ理由で、CCMenuもスケーリングしません。

簡単に言うと、メニュー項目にスケーリングを適用する必要がある場合は、独自のメニュー項目コードを記述してください。おそらく、CCMenuコードに基づいて、不要なものを取り除き、必要な変更を加えることによって。

しかし、実際に最も簡単な方法は、ファイルの接尾辞-hd、-ipad、および-ipadhdを使用してメニュー項目の画像を提供し、それに応じて拡大縮小することです。スケールプロパティでこれを正しくしようとすると、苦痛になります。

于 2012-08-17T10:01:47.387 に答える