Cocos2d NSMutable Array在枚举时发生变异

时间:2012-12-30 05:21:28

标签: iphone objective-c cocos2d-iphone nsmutablearray collision

我一直在做一个游戏,在某一点上我没有移除敌人游戏对象的问题(现在它们是CCSprite的子类,我知道这不是最好的方式)

但我不确定当程序在removeChild添加到_targets之后尝试从targetsToDelete NSObject时,我发生了什么更改。

我尝试了移动的东西,我只是不知道在创建数组时我是如何添加或编辑数组的......任何帮助或建议都会很棒!

实际上,如果你有关于如何最好地创建游戏敌人的任何指示,你是否继承CCNode//Projectile Target collision -(void)update:(ccTime)dt { for (spygot *target in _targets) { CGRect targetRect = CGRectMake( target.position.x - (target.contentSize.width/2), target.position.y - (target.contentSize.height/2), target.contentSize.width, target.contentSize.height); //Collision Detection Player CGRect playerRect2 = CGRectMake( _controlledSprite.position.x - (_controlledSprite.contentSize.width/2), _controlledSprite.position.y - (_controlledSprite.contentSize.height/2), _controlledSprite.contentSize.width, _controlledSprite.contentSize.height); NSMutableArray *projectilesToDelete = [[NSMutableArray alloc] init]; for (Projectile *projectile in _projectiles) { NSMutableArray *targetsToDelete = [[NSMutableArray alloc] init]; CGRect projectileRect = CGRectMake( projectile.position.x - (projectile.contentSize.width/2), projectile.position.y - (projectile.contentSize.height/2), projectile.contentSize.width, projectile.contentSize.height); BOOL monsterHit = FALSE; if (CGRectIntersectsRect(projectileRect, targetRect)) { NSLog(@"hit"); target.mhp = target.mhp - 1; monsterHit = TRUE; if (target.mhp <= 0) { [targetsToDelete addObject:target]; } } for (spygot *target in targetsToDelete) { [self removeChild:target cleanup:YES]; [_targets removeObject:target]; } if (monsterHit) { [projectilesToDelete addObject:projectile]; } [targetsToDelete release]; } for (Projectile *projectile in projectilesToDelete) { [_projectiles removeObject:projectile]; [self removeChild:projectile cleanup:YES]; } [projectilesToDelete release]; } ?我听说将它们分成组件类,但我不知道它们的意思。

{{1}}

3 个答案:

答案 0 :(得分:0)

您粘贴的代码看起来都是在for循环内迭代_targets。变量target如何初始化?

答案 1 :(得分:0)

通常当我遇到这种错误时,这是​​因为我在一个块中有代码,或者在一个模糊的线程上有其他方式。你有多确定这段代码不能同时运行多次?

您可以尝试将其包装在以下内容中:

dispatch_async(dispatch_get_main_queue(), ^{
    // do everything here.
});

关于为游戏敌人对象使用CCSprite的建议,我的建议是在它成为问题时修复它。你现在看到它的问题吗?过早优化几乎与首先做错了一样糟糕。在项目结束时你会更清楚你应该如何更早地完成它。 ;)

答案 2 :(得分:0)

我猜你知道在迭代它时你不能从数组中删除元素。这就是你有targetsToDelete数组的原因。

但我认为您很快就会删除目标。

试试这个: 完成迭代主循环并完成将目标收集到targetsToDelete数组,并且仅在主循环完成后移除目标。