在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"];
结果是大量的重复代码。怎么能简化呢?
毕竟,只需要更改场景,只需在初始化方法中传递单个变量(级别编号)。
答案 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];
}
这只是一个给你一个想法的例子,我还没有测试过。但我希望它会对你有所帮助。 ;)