缩放 CCMenuItem在 CCMenu 中的精灵项目



我在使用 CCMenu 和缩放的 CCMenuItemSprite 菜单项时遇到问题。 我正在尝试根据玩游戏的设备以不同的方式缩放菜单项精灵(iPad 需要将其缩放到大约 1.5 倍,而在 iPhone 上大约是 0.75 倍)

从我所读到的内容来看,我们不能直接缩放CCSprite或CCMenuItemSprite,因为当它添加到CCMenu时,触摸矩形没有正确更新。 我相信我必须缩放 CCMenu 才能缩放菜单项。

每当我这样做时,我的精灵似乎都会缩放到正确的大小,但它似乎也会缩放 CCMenu 位置坐标,但方向与我预期的相反。 此外,一旦我超过某个阈值,菜单似乎就会完全消失。

有人对我应该如何在 CCMenu 中缩放精灵有任何建议吗?

提前谢谢。巴兹里克

试试这段代码。

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];

我的建议?不要!

CCMenu 会在您触摸菜单项时对其进行缩放。如果您点击并按住某个项目,您会注意到这一点,该项目会放大(放大)。因此,您应用于菜单项的任何缩放最迟在触摸菜单项时都会丢失。

然后,正如您所注意到的,缩放会影响项目的触摸区域。它可能导致项目响应项目外部的触摸,或不响应触摸,具体取决于缩放级别。出于同样的原因,我也不会扩展CCMenu。

长话短说,如果必须对菜单项应用缩放,请编写自己的菜单项代码。可能通过基于CCMenu代码并去除您不需要的内容并进行所需的更改。

但实际上最简单的方法是使用文件后缀 -hd、-ipad 和 -ipadhd 提供菜单项图像并相应地缩放。试图用 scale 属性做到这一点是很痛苦的。

这是我

最终解决它的方式:基本上我首先创建了菜单元素,然后我整理了定位/缩放/旋转。 这似乎效果更好。下面的代码示例是我使用单个精灵创建两个相对的左/右箭头按钮的地方

    [[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];

最新更新