首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在CCMenu中缩放CCMenuItemSprite项目

在CCMenu中缩放CCMenuItemSprite项目
EN

Stack Overflow用户
提问于 2012-08-17 09:18:04
回答 3查看 2.4K关注 0票数 1

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

据我所知,我们不能直接缩放CCSprite,也不能缩放CCMenuItemSprite,因为当它添加到CCMenu中时,触摸矩形不会正确更新。我相信我必须缩放CCMenu来缩放菜单项。

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

有没有人对如何在CCMenu中扩展精灵有什么建议?

提前谢谢。Buzzrick

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-17 13:17:04

尝试此代码........

代码语言:javascript
复制
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];
票数 4
EN

Stack Overflow用户

发布于 2012-08-17 18:01:47

我的建议是什么?别!

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

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

长话短说,如果您必须对菜单项应用缩放,请编写您自己的菜单项代码。可能是以CCMenu代码为基础,剥离不需要的代码并进行所需的更改。

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

票数 2
EN

Stack Overflow用户

发布于 2012-08-19 09:26:10

下面是我最终解决这个问题的方法:基本上,我首先创建了菜单元素,然后对定位/缩放/旋转进行了排序。这似乎效果要好得多。下面的代码示例是我使用单个sprite创建两个相对的左/右箭头按钮的地方

代码语言:javascript
复制
    [[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];
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11998612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档