iphone app中的脚本可以实例化一个变量

时间:2011-01-26 11:25:20

标签: iphone scripting cocos2d-iphone

我试图理解在iphone上使用像lua这样的脚本语言(例如使用cocos2d)的好处,以及它是否有助于解决我的问题(并提高我的编码技能)。 在我的游戏中,我有以下代码:

-(void)MenuItem:(CCMenuItem  *) menuItem {
 switch (menuItem.tag) {
  case 1:
   [[CCDirector sharedDirector] replaceScene:[Level1 scene]];
   break;
  case 2:
   [[CCDirector sharedDirector] replaceScene:[Level2 scene]];
   break;
  case 3:
   [[CCDirector sharedDirector] replaceScene:[Level3 scene]];
   break;
  case 4:
   [[CCDirector sharedDirector] replaceScene:[Level4 scene]];
   break;
  case 5:
   [[CCDirector sharedDirector] replaceScene:[Level5 scene]];
   break;
  case 6:
   [[CCDirector sharedDirector] replaceScene:[Level6 scene]];
   break;
  case 7:
   [[CCDirector sharedDirector] replaceScene:[Level7 scene]];
   break;
  case 8:
   [[CCDirector sharedDirector] replaceScene:[Level8 scene]];
   break; 
  default:
   break;
 }

该函数的问题是如果我有50个级别,此函数将需要3页代码。我想用以下代码替换整个函数:

-(void)MenuItem:(CCMenuItem  *) menuItem {
[[CCDirector sharedDirector] replaceScene:[<script> @"Level" + menuItem.tag</script> scene]];
}

其中脚本&gt; /脚本&GT;将是一种嵌入脚本语言的方法,该脚本语言将连接字符串“Level”和级别编号,从而创建类的名称。所以这个函数将与级别数无关。 所以我的问题是:脚本可以帮忙吗?如果是,它怎么能帮助,如果没有,是否有解决方案呢?

2 个答案:

答案 0 :(得分:5)

我建议:

NSString *levelToLoad = [NSString stringWithFormat:@"Level%d", menuItem.tag];
[[CCDirector sharedDirector] replaceScene:[NSClassFromString(levelToLoad) scene]];

是的,我只是为你节省了数小时的打字时间。

答案 1 :(得分:0)

AppStore规则禁止在您的应用中使用脚本语言。

但这不是你的问题,你可以使用反射API:

[[NSClassFromString([NSString stringWithFormat:@"Level%i", menuItem.tag]) scene]];

这不是最好的方法,因为你可以控制所有的代码,因此你不需要使用它,它“只是工作”并且感觉很烦。 您应该实现一个级别管理器并让它为您搜索给定的级别(示例):

[MyLevelManager levelWithId:menuItem.tag];