2012-01-18 64 views
1

我在插入同一精灵的多个子项并访问它(或在运行时为它们设置位置)时遇到问题。请提醒任何合适的方法,最好指出我的错误。这是我的方法。添加和访问CCSprites

//In the Init Method... 

//int i is defined in the start. 

    for (i = 1; i < 4; i++) 

    { 

     hurdle = [CCSprite spriteWithFile:@"hurdle1.png"]; 

     [self addChild:hurdle z:i tag:i]; 

     hurdle.position = CGPointMake(150 * i, 0); 

    } 

它将所有的精灵分布在画布上。然后在一些“更新函数”中,我打电话给这个。

hurdle.position = CGPointMake(hurdle.position.x - 5, 10); 

if (hurdle.position.x <= -5) { 
    hurdle.position = ccp(480, 10); 
} 

它的工作原理,但正如所料,只有一个实例水平移动。我希望所有的情况下被移动,所以我试图用这个....

for (i = 1; i < 4; i++){ 

    [hurdle getChildByTag:i].position = CGPointMake(hurdle.position.x - 5, 10); 

//OR 
    [hurdle getChildByTag:i].position = CGPointMake([hurdle getChildByTag:i].position.x - 5, 10); 

} 

我试图让各种场所登录并意识到getChildByTag不工作我想的方式用它。

回答

2

问题出在最后一块代码中。您应该在for循环中为每个CCSprite创建一个本地引用。

既然你添加的精灵到self,你会找回它们为self

for (i = 1; i < 4; i++){ 
    CCSprite * enumHurdle = [self getChildByTag:i]; 
    enumHurdle.position = CGPointMake(enumHurdle.position.x - 5, 10); 
} 

孩子要小心,如果您创建的任何其他精灵这种方式在同一场景中。给任何两个精灵设置相同的标签是一个糟糕的设计。

关于避免重复标签的编辑。

如果你知道你会有多少个精灵。使用标签枚举并通过名称引用精灵。

如果不是,知道有多少组,并限制组的大小可以使其可管理。

ie 说你有3个部分的代码,你在这里生成精灵。您可以在您的m的enum(下@implementation线),并把限制有

// Choose names that describe the groups of sprites 
enum { kGroupOne = 0, // limiting the size of each group to 100 
    kGroupTwo = 100, // (besides the last group, but that is not important) 
    kGroupThree = 200, 
}; 

然后当您创建的每个组

// group 1 
for (i = kGroupOne; i < 4; i++){ 
    // set up code here 
} 

// group 2 
// g2_size is made up, insert whatever you want 
for (i = kGroupTwo; i < g2_size; i++) { 
    // set up code here 
} 
. 
. 
. 

然后在组检索

for (i = kGroupOne; i < 4; i++){ 
    CCSprite * enumHurdle = [self getChildByTag:i]; 
    enumHurdle.position = CGPointMake(enumHurdle.position.x - 5, 10); 
} 
. 
. 
. 

希望能激发你的创造力。现在有一些乐趣。

+0

我应该声明enumHurdle作为一类? CCSprite? – 2012-01-18 06:35:20

+0

@ToughGuy这是正确的。谢谢,我会编辑它。 – 2012-01-18 06:44:48

+0

非常感谢您的帮助。但是现在我对加入更多精灵毫无头绪,但是想要避免共享相同的标签:D – 2012-01-18 07:05:34

0

我经常做的事情就是我想要以类似的方式加入CCNode并将该CCNode添加到该图层的同类组对象。

我会创建一个从CCNode

得出这样我就可以把我所有的逻辑节点和接入然后通过[自儿童]

for(CCSprite *hurdle in [self children]) { 
    // Do what you need to do 
}