(cocos2d)动态创建菜单和场景

时间:2011-11-16 10:29:12

标签: objective-c cocos2d-iphone

在Python之后,Objective-C语法让我大吃一惊!

我正在尝试创建一个25个按钮的菜单。单击它将启动是适当的级别。只有调用[CCTMXTiledMap tilesMapWithTMXFile:@“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 个答案:

答案 0 :(得分: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];
}

这只是一个给你一个想法的例子,我还没有测试过。但我希望它会对你有所帮助。 ;)