nsmutablearray在调用时不添加对象

时间:2012-07-17 00:44:35

标签: cocos2d-iphone null nsmutablearray scheduler

我有一个NSMutable数组,我想添加Sprite,以便我们可以检查它们是否已经碰壁了。我使用此代码执行此操作:

NSString *bulletName = [NSString stringWithFormat:@"tank%d_bullet.png", _type];
bullet = [CCSprite spriteWithSpriteFrameName:bulletName];
bullet.tag = _type;
bullet.position = ccpAdd(self.position, ccpMult(_shootVector, _turret.contentSize.height));        
CCMoveBy * move = [CCMoveBy actionWithDuration:duration position:actualVector];
CCCallBlockN * call = [CCCallBlockN actionWithBlock:^(CCNode *node) {
    [node removeFromParentAndCleanup:YES];
}];

if (!bulletIsGone) {
    [self schedule:@selector(updator:) interval:0.01];

}
else {
    [self unschedule:@selector(updator:)];
}
[bullet runAction:[CCSequence actions:move, call, nil]];
[_layer.batchNode addChild:bullet];
[bulletsArray addObject:bullet];
if ([bulletsArray objectAtIndex:0] == nil) {
    NSLog(@"HELP");
}
NSLog(@"%@", [bulletsArray objectAtIndex:0]);


}

-(void)updator: (ccTime) dt{

for(CCSprite *bulletz in bulletsArray){
    NSLog(@"this is the for loop");
    CGRect rect1 = CGRectMake(bulletz.position.x - bulletz.contentSize.width/2, bulletz.position.y - bulletz.contentSize.height/2, 20, 20);
    if ([_layer isWallAtRect:rect1]) {
        NSLog(@"bulletHitWall");
        [_layer.batchNode removeChild:bulletz cleanup:NO];
        bulletIsGone = YES;
    }
}

}

然而,当我构建并运行时,我得到'(null)'和'HELP'的控制台输出。 “updator”之前的方法是从touchesEnded调用的。有人能看出我做错了吗? 谢谢!

3 个答案:

答案 0 :(得分:3)

你初始化数组吗?这似乎是最可能的原因

在viewDidLoad方法中尝试此操作...

- (void)viewDidLoad
{
  [super viewDidLoad];

  bulletsArray = [NSMutableArray alloc] init];
}

答案 1 :(得分:2)

由于NSMutableArray无法保存nil个对象,因此条件

的唯一方式
[bulletsArray objectAtIndex:0] == nil

可评估为truebulletsArraynil。您需要确保正确分配了数组。一个典型的地方是你班级的指定初始化者。

答案 2 :(得分:1)

为什么要将项目符号添加到另一个数组?您已经有一个包含所有_layer.children的批处理节点。

您确定阵列本身(bulletsArray)不是零吗?在哪里初始化?

最后,您应该考虑使用更高效的CCARRAY_FOREACH进行循环。