2

我有一个 NSMutable 数组,我想将 Sprites 添加到其中,这样我就可以检查它们是否撞到了墙上。我使用此代码这样做:

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;
    }
}

}

但是,当我构建和运行时,我得到了“(空)”和“帮助”的控制台输出。从 touchesEnded 调用 'updator' 之前的方法。有人可以看到我做错了什么吗?谢谢!

4

3 回答 3

3

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

在你的 viewDidLoad 方法中试试这个......

- (void)viewDidLoad
{
  [super viewDidLoad];

  bulletsArray = [NSMutableArray alloc] init];
}
于 2012-07-17T00:49:33.117 回答
2

既然NSMutableArray不能容纳nil物体,唯一的办法就是条件

[bulletsArray objectAtIndex:0] == nil

可以评估为trueis that bulletsArrayis nil。您需要确保正确分配数组。一个典型的地方是你的类的指定初始化器。

于 2012-07-17T00:49:57.430 回答
1

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

您确定数组本身 ( bulletsArray) 不为零吗?它在哪里初始化?

最后,您应该考虑使用性能更高的CCARRAY_FOREACH循环。

于 2012-07-17T00:51:39.580 回答