枚举时的数组突变

时间:2016-09-26 13:07:41

标签: objective-c nsmutablearray nsexception mutation

所以只有当我在游戏中有两个敌人的情况下,我的问题才会发生。如果它是一对一......我没有得到这个问题。

请查看我的代码,看看你是否可以收集到为什么我会收到这个致命的错误。

从玩家目标阵列中删除目标

-(void)removeTarget:(PlayerClass *)target withSender:(PlayerClass *)sender {
    if ([sender.targets containsObject:target]) {
        [sender.targets removeObject:target];
    }
}

将目标添加到玩家目标数组

-(void)addTarget:(PlayerClass *)target withSender:(PlayerClass *)sender {

    //check if target already exists

    if ([sender.targets count] > 0) {
        for (PlayerClass *players in sender.targets) {
            if ([players.name isEqualToString:target.name]) {
                //Checked if exists, if target exists in list then move on.
                goto outer;
            }
        }
    }

    [sender.targets addObject:target];

    outer:;
}

在更新中确定他们是否是目标

-(void)update:(CFTimeInterval)currentTime {
/* Called before each frame is rendered */

for (PlayerClass *player in _players) {
    ....

    if (player.health > 0) { //If player is alive!

       ....
        //Checks if the player has targets, if so & visible - Engage.
        if ([player.targets count] > 0) {
            for (PlayerClass *enemy in player.targets) {
                if (![player.team isEqualToString:enemy.team]) {
                    if (enemy.health > 0) {
                        if ([self lineOfSightBetweenPlayers:player andPlayer:enemy]) {
                            [self attackWithPlayer:player againstPlayer:enemy];
                            break;
                        } else {
                            [player removeTarget:enemy withSender:player];
                        }
                    } else {
                        [player removeTarget:enemy withSender:player];
                    }
                } else {
                    [player removeTarget:enemy withSender:player];
                }
            }
        }


    }

现在从调试开始我已经收集到玩家不会将他们的队友添加为目标。但是,如果玩家能够在对方球队中看到多个目标,则他们将聚集多个目标。但是,我猜测的问题在于我从阵列中删除目标的技术?任何人都可以检查并确保我在这里没有提供男生错误吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

非常简单的修复。没有在盒子外面思考......当代码开始变得非常大时,这往往会发生!

        //Checks if the player has targets, if so & visible - Engage.
        if ([player.targets count] > 0) {
            for (PlayerClass *enemy in player.targets) {
                if (![player.team isEqualToString:enemy.team]) {
                    if (enemy.health > 0) {
                        if ([self lineOfSightBetweenPlayers:player andPlayer:enemy]) {
                            [self attackWithPlayer:player againstPlayer:enemy];
                            break;
                        } else {
                            [player removeTarget:enemy withSender:player];
                            break;
                        }
                    } else {
                        [player removeTarget:enemy withSender:player];
                        break;
                    }
                } else {
                    [player removeTarget:enemy withSender:player];
                    break;
                }
            }
        }

解决了我的问题,我没有突破。因此在删除后进行枚举。