2012-08-17 24 views
1

我在使用CCMenu和縮放後的CCMenuItemSprite菜單項時遇到問題。我試圖根據遊戲正在播放的設備不同來調整菜單項的精靈(iPad需要將其縮放到約1.5倍,而在iPhone上約爲0.75x)縮放CCMenu中的CCMenuItemSprite項目

從我的'我們無法直接縮放CCSprite或CCMenuItemSprite,因爲當它添加到CCMenu時,觸摸矩形未正確更新。我相信我必須縮放CCMenu才能縮放菜單項。

每當我這樣做,我的精靈似乎被縮放到正確的大小,但它似乎也縮放了CCMenu位置座標,但方向與我所期望的相反。同樣,一旦我超過了一定的門檻,菜單似乎完全消失了。

有沒有人有任何建議,我應該如何縮放在CCMenu的精靈?

在此先感謝。 Buzzrick

回答

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

有趣的是,你這樣做的方式。經過修改後,我發現如果你先做任何菜單項定位,然後創建菜單,那麼做任何縮放和旋轉,它會更好。我會盡快發佈一些代碼來解釋我的最終答案 – Buzzrick 2012-08-19 01:14:44

2

我的建議?別!

內部CCMenu在觸摸菜單項時縮放菜單項。你會注意到,如果你點擊並按住一個項目,它會放大(放大)。因此,無論您應用於菜單項的縮放比例在觸摸菜單項時最遲都會丟失。

然後,如您所注意到的,縮放會影響項目的觸摸區域。它可能導致項目響應項目外的觸摸,或者根據縮放級別不響應觸摸。出於同樣的原因,我也不會擴展CCMenu。長話短說,如果您必須對菜單項應用縮放,請編寫您自己的菜單項代碼。可能是以CCMenu代碼爲基礎,剝離不需要的東西並進行所需的更改。

但真正最簡單的方法是使用文件後綴-hd,-ipad和-ipadhd提供菜單項圖像並相應地縮放。試圖通過scale屬性來實現這一點是非常痛苦的。

+0

我傾向於同意。 CCMenu在做任何稍微不尋常的事情方面出了名的糟糕之處:縮放,旋轉等。沒有一個能夠很好地工作。我認爲這是cocos2d中最糟糕的部分。真正讓它失敗的唯一部分。 – Buzzrick 2012-08-19 01:13:29

+0

我個人在這種情況下使用CCControlButton :) – uchamp 2014-07-20 08:49:09

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

偉大的傢伙!它也適用於Cocos2d-x(v.2.3.3) – Zappescu 2015-02-03 17:33:13