我有一个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调用的。有人能看出我做错了吗? 谢谢!
答案 0 :(得分:3)
你初始化数组吗?这似乎是最可能的原因
在viewDidLoad方法中尝试此操作...
- (void)viewDidLoad
{
[super viewDidLoad];
bulletsArray = [NSMutableArray alloc] init];
}
答案 1 :(得分:2)
由于NSMutableArray
无法保存nil
个对象,因此条件
[bulletsArray objectAtIndex:0] == nil
可评估为true
,bulletsArray
为nil
。您需要确保正确分配了数组。一个典型的地方是你班级的指定初始化者。
答案 2 :(得分:1)
为什么要将项目符号添加到另一个数组?您已经有一个包含所有_layer.children
的批处理节点。
您确定阵列本身(bulletsArray
)不是零吗?在哪里初始化?
最后,您应该考虑使用更高效的CCARRAY_FOREACH进行循环。