0

我一直在做游戏,在某个时候我没有遇到删除敌人游戏对象的问题(现在它们是子类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];
}
4

3 回答 3

0

看起来您粘贴的代码全部来自for循环迭代_targets。变量如何target初始化?

于 2012-12-30T05:55:14.633 回答
0

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

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

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

至于关于将 CCSprite 用于游戏敌人对象的建议,我的建议是在出现问题时修复它。你现在看到它的问题了吗?过早的优化几乎和一开始就做错一样糟糕。在项目结束时,您会更好地了解您应该如何更早地完成它。;)

于 2012-12-30T06:25:33.460 回答
0

我猜你知道在迭代数组时不能从数组中删除元素。这就是为什么你有targetsToDelete数组。

但在我看来,您确实很快就会删除目标。

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

于 2013-01-02T21:05:19.323 回答