2011-11-16 94 views
0

Python Objective C語法激發了我的思想!(cocos2d)動態創建菜單和場景

我試圖創建一個菜單,將25個按鈕。點擊它將開始適當的級別。這些級別僅通過調用[CCTMXTiledMap tiledMapWithTMXFile:@「lvl_1-25.tmx」];

要創建菜單,我使用:

CCMenuItemSprite *lvl_1_button= [CCMenuItemSprite itemFromNormalSprite:[GameButton buttonWithText:@"lvl 1"] selectedSprite:NULL target:self selector:@selector(lvl1_start)]; 
    ... 
    CCMenu *menu = [CCMenu menuWithItems: lvl_1_button, lvl_2_button, lvl_3_button, nil];  

    [self addChild:menu]; 

場景變化在於:

-(void)lvl1_start 

{ 
    [[CCDirector sharedDirector] replaceScene:[lvl1_start node]]; 

} 

在這種情況下水平之間的差異是最小的。在初始化時在一行中。

-(id) init 
{ 
    if((self=[super init])) 
    { 
     self.tileMap = [CCTMXTiledMap tiledMapWithTMXFile:@"lvl_1.tmx"]; 

結果是一噸重複的代碼。這怎麼可以簡化?

畢竟,只需要改變場景,只需在初始化方法中傳遞一個變量(級別號)即可。

回答

2

我會盡量讓它儘可能簡單。

要開始添加新的init()方法,以你的水平的場景這需要作爲參數tilemap的名稱,例如:

// LevelScene.h 
- (id)initWithTilemapName:(NSString *)tilemap; 

// LevelScene.m 
- (id)initWithTilemapName:(NSString *)tilemap 
{ 
    if ((self = [super init])) 
    { 
     self.tileMap = [CCTMXTiledMap tiledMapWithTMXFile:tilemap]; 
     // ... 

然後使菜單創建更加動態的,在運行循環和準添加您的項目他們有一個標籤(要能區分它們):

CCMenu *menu = [CCMenu menuWithItems:nil]; 
[self addChild:menu]; 

for (int i = 1; i <= 25; i++) 
{ 
    CCMenuItemSprite *lvlItem = 
    [CCMenuItemSprite itemFromNormalSprite:[GameButton buttonWithText:[NSString stringWithFormat:@"lvl%d",i]] selectedSprite:NULL target:self selector:@selector(lvl_start:)]; 
    [lvlItem setTag:i]; 

    [menu addChild:lvlItem]; 
} 

添加到選擇完成,檢索菜單項,並建立與其相應tilemap的現場。

- (void)lvl_start:(CCMenuItemS *)item 
{ 
    LevelScene *yourScene = [[LevelScene alloc] initWithTilemapName:[NSString stringWithFormat:@"lvl%d.tmx",item.tag]; 

    [[CCDirector sharedDirector] replaceScene:yourScene]; 

    [yourScene release]; 
} 

這只是一個給你一個想法的例子,我還沒有測試過它。但我希望它能幫助你。 ;)