1

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

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

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

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

提前致谢。巴兹里克

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

我的建议?不!

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

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

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

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

于 2012-08-17T10:01:47.387 回答
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 回答