(cocos2d) Динамическое создание меню и сцены - PullRequest
0 голосов
/ 16 ноября 2011

После того, как синтаксис Python Objective-C поразил меня!

Я пытаюсь создать меню, которое будет состоять из 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"];

В результате получается тонна повторяющегося кода.Как это можно упростить?

В конце концов, нужно всего лишь изменить сцену и просто передать одну переменную (номер уровня) в методе инициализации.

1 Ответ

2 голосов
/ 16 ноября 2011

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

Для начала добавьте новый метод init к вашей сцене уровня, который принимает в качестве аргумента имя карты, например:

// 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];
}

Добавить в финишер селектора, извлечь элемент меню и создать сцену с соответствующей ей картой тайлов.

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

    [[CCDirector sharedDirector] replaceScene:yourScene];

    [yourScene release];
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...