2012-06-12 52 views
1

我想通過使用CCSpriteBatchNode來減少OpenGL調用和內存使用的次數。Cocos2D 2.0 - 使用CCSpriteBatchNode,CCMenuItem和CCmenu

我需要創建使用此代碼CCMenu:

CCSpriteBatchNode *batchNode = [CCSpriteBatchNode batchNodeWithFile:@"atlasGeral.png"]; 

CCSprite *inputNormal = [CCSprite spriteWithSpriteFrameName:@"normalInput.png"]; 
CCSprite *inputPressed = [CCSprite spriteWithSpriteFrameName:@"PressedInput.png"]; 
[batchNode addChild:inputNormal]; 
[batchNode addChild:inputPressed]; 


CCMenuItem *input = 
    [CCMenuItemSprite itemWithNormalSprite:inputNormal 
          selectedSprite:inputPressed 
            target:self 
           selector:@selector(InputMenu:)]; 
CCMenu *mInputMenu = [CCMenu menuWithItems:input, nil]; 

這與消息斷言失敗catrastophically轟然 - [CCMenuItemSprite的addChild:Z:標籤:]

任何線索?順便說一句,有人可以創建或指向一些教程,正確解釋如何將這個CCSpriteBatchNode與CCMenus,CCMenuItems等其他元素一起使用嗎?幾乎所有最重要的功能都沒有Cocos2D文檔。

謝謝。

回答

1

那麼,inputNormal和inputPress精靈是批處理節點的子節點。因此,當您嘗試將它們再次添加爲另一個節點後代時,因爲它們已經有了父節點,所以可可嗚聲。不能做我害怕。 imnsho,批處理節點嚴重超額。改善收益只能在極少數有限的使用情況下獲得。

再次,直接從CCMenuItemSprite代碼(1.0.1版本)

-(void) setNormalImage:(CCNode <CCRGBAProtocol>*)image 
{ 
    if(image != normalImage_) { 
     image.anchorPoint = ccp(0,0); 
     image.visible = YES; 

     [self removeChild:normalImage_ cleanup:YES]; 
     [self addChild:image]; 

     normalImage_ = image; 
    } 
} 

的菜單項試圖將(已孩子)的精靈添加到自身。沒有豆子。

+0

謝謝。對於我看到的這些CCSpriteBatchNode遠非真正有用的東西。它們的使用非常有限,並且存在很多問題。或許,唯一的解決方案是創建我自己的CCMenu類的類! – SpaceDog

+0

如果圖像相當大,或者大多數圖像被縮放和旋轉,CCSpriteBatchNode可以是一個巨大的性能節省。由於精靈批處理節點沒有其他限制,只允許將精靈作爲子節點,所以儘早將它們融入到您的設計中。 – LearnCocos2D

+0

@ LearnCocos2D - 就您提到的用例達成一致,前提是您並未嘗試在圖層中的不同zOrder上交織來自多個紋理的圖形對象。我可能錯過了如何向一個圖層添加多個批處理節點,但是所有的子精靈都被引用到一個唯一的z軸(該圖層)。 – YvesLeBorg