2011-11-16 2 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

Я постараюсь сделать это как можно более простым.

Чтобы начать добавить новую инициализацию метод вашего уровня сцены, которая принимает в качестве аргумента имени 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]; 
} 

Это просто пример, который дает вам представление, я его не тестировал. Но я надеюсь, что это поможет вам. ;)

Смежные вопросы