2011-11-16 116 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]; 
} 

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