【问题标题】:Objective-C / Cocos2D Repeating Code ReductionObjective-C / Cocos2D 重复代码减少
【发布时间】:2012-02-22 03:37:21
【问题描述】:

有人知道我将如何减少以下代码行吗?我在objective-c / cocos2D 上还是相当新的,我的以下代码看起来像火车残骸。如果是 PHP,我可以很容易地创建一个循环来获取所有这些,但我对 obj-c 还不够熟悉,还没有弄清楚。

    dinosaur1_c = [CCSprite spriteWithSpriteFrameName:@"dinosaur1-c.png"];
    dinosaur2_c = [CCSprite spriteWithSpriteFrameName:@"dinosaur2-c.png"];
    dinosaur3_c = [CCSprite spriteWithSpriteFrameName:@"dinosaur3-c.png"];
    dinosaur4_c = [CCSprite spriteWithSpriteFrameName:@"dinosaur4-c.png"];
    dinosaur5_c = [CCSprite spriteWithSpriteFrameName:@"dinosaur5-c.png"];
    dinosaur6_c = [CCSprite spriteWithSpriteFrameName:@"dinosaur6-c.png"];
    dinosaur7_c = [CCSprite spriteWithSpriteFrameName:@"dinosaur7-c.png"];
    dinosaur8_c = [CCSprite spriteWithSpriteFrameName:@"dinosaur8-c.png"];
    dinosaur9_c = [CCSprite spriteWithSpriteFrameName:@"dinosaur9-c.png"];
    dinosaur10_c = [CCSprite spriteWithSpriteFrameName:@"dinosaur10-c.png"];
    dinosaur11_c = [CCSprite spriteWithSpriteFrameName:@"dinosaur11-c.png"];

    [sceneSpriteBatchNode addChild:dinosaur1_c];
    [sceneSpriteBatchNode addChild:dinosaur2_c];
    [sceneSpriteBatchNode addChild:dinosaur3_c];
    [sceneSpriteBatchNode addChild:dinosaur4_c];
    [sceneSpriteBatchNode addChild:dinosaur5_c];
    [sceneSpriteBatchNode addChild:dinosaur6_c];
    [sceneSpriteBatchNode addChild:dinosaur7_c];
    [sceneSpriteBatchNode addChild:dinosaur8_c];
    [sceneSpriteBatchNode addChild:dinosaur9_c];
    [sceneSpriteBatchNode addChild:dinosaur10_c];
    [sceneSpriteBatchNode addChild:dinosaur11_c];

非常感谢任何输入!

【问题讨论】:

  • dinosaur1_c 是您的实例变量,还是临时变量?

标签: objective-c ios xcode cocos2d-iphone reduction


【解决方案1】:

我建议使用NSMutableArray 管理这些对象,如下所示:

NSMutableArray *sprites = [[NSMutableArray alloc] init];
for (int i = 1; i <= 11; i++) {
    id dino = [CCSprite spriteWithSpriteFrameName:[NSString stringWithFormat:@"dinosaur%d-c.png",i]];
    [sprites addObject:dino];
    [sceneSpriteBatchNode addChild:dino];
}

// Since I don't know what your addChild: method does, the 'sprites' array exists to let you access the objects later, outside of the 'for' loop if desired...
// So where you would've used dinosaur4_c before, you would instead use [sprites objectAtIndex:4]
// This also demonstrates how to cast the return value from -objectAtIndex: to a CCSprite *
CCSprite *certainDino = (CCSprite *)[sprites objectAtIndex:4];

// Then, when done working with the sprites
[sprites release];

【讨论】:

  • 为什么不直接使用 C-Array(或 CCArray)?它比链表更快。
  • 你永远不会向“精灵”添加任何东西
  • 感谢您的输入。我可能应该提到恐龙1_c 是实例变量。但是,我仍然不太确定循环的 Dino *dino 部分发生了什么。 *dino 应该来自什么类型的实例变量?
  • 我从未使用过 cocos2d,所以这是一个猜测。我做了一个快速的谷歌搜索,找到了对 CCSprite 接口的引用,该接口定义了 +spriteWithSpriteFrameName: 的返回类型为id,所以我将编辑我的答案以使用它。至于实例变量,我假设它们也在其他地方使用?这就是 NSMutableArray 所完成的;提供另一种方法来创建这些对象并在以后引用它们,而不需要每个对象一行代码。
  • 是的,看起来是这样。非常感谢您抽出宝贵的时间为我服务!我会检查你的答案作为解决方案,因为其他人似乎同意它。 :D
猜你喜欢
  • 2013-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-30
  • 2016-07-24
  • 1970-01-01
  • 2016-01-12
相关资源
最近更新 更多