需要帮助NSMutableArray解决方案

时间:2011-07-07 03:56:26

标签: objective-c arrays cocos2d-iphone nsarray sorting

我正在为我的对象BuildingNode *塔设计一个解决方案,该解决方案保存在NSMutableArray * gameObjects中,以攻击也存放在gameObjects数组中的EnemyNode *敌人对象。

我有一个建议的解决方案偶尔会导致我的游戏冻结(暂时),因为所采用的解决方案非常错误。

我的解决方案是每个塔对象都包含自己的NSMutableArray *目标,这些目标是从塔类合成的。如果敌人进入范围或超出任何给定塔对象的范围,则来自gameObjects数组的EnemyNode *敌方对象的相应索引将作为NSNumber保存到目标数组中,或者如果敌方对象超出范围,它将从.targets数组中删除 基本上这个想法是目标数组保存了塔内范围内任何敌人的指数。

我似乎面临的问题是因为这个tower.targets数组一直在动态更新,我相信如果我对某个特定的tower.targets索引进行某种操作,然后将其删除,我收到这个错误:

  

- [BuildingNode distance]:无法识别的选择器发送到实例0x2dd140

每个BuildingNode *塔都有不同的攻击算法,使用tower.targets数组来回调已排序/想要的敌人。 例如,随机攻击风格将随机化0到0之间的数字。 [tower.targets count]然后我可以使用相应的[tower.targets intValue]创建一个指向gameObjects的指针。 像这样:

EnemyNode *enemy = (EnemyNode *)[gameObjects objectAtIndex:[[tower.targets objectAtIndex:rand]intValue]];

所以这将从潜在的.targets数组中找到一个随机敌人,然后为敌人创建一个指针对象。

我已经添加了很多if语句,以确保在排序中间删除.targets索引的情况下,操作不应该继续,从而消除游戏失败率,但它仍然偶尔发生。

见下我的代码:
请注意,BuildingNode * tower == BuildingNode * build 这只是gameObjects中迭代的片段。

 //Potential Enemies (Indices) Add and Delete/
 if (enemy.distance < build.atk_distance && !enemy.isExploding){
       NSNumber *index = [NSNumber numberWithInt:[array indexOfObject:enemy]];
        if(![build.targets containsObject:index]){
            [build.targets addObject:index];
            }
        }
        else {
            NSNumber *index = [NSNumber numberWithInt:[array indexOfObject:enemy]];
            if ([build.targets containsObject:index]){
                [build.targets removeObject:index];
            }
        }
  }

//瞄准//最近的算法。  //会找到最近的建筑物敌人

 if (enemy.distance < build.atk_distance){
     if (!build.isAttacking || build.atk_id == 0){
           if ([build.targets count]){
                if ([build.atk_style isEqualToString:@"near"]){
                    int l_dist;
                    for (int i = 0; i < [build.targets count]; i++){
                        //Grab the Enemy from Targets
                        if ([build.targets objectAtIndex:i]){
                            if([array objectAtIndex:[[build.targets objectAtIndex:i]intValue]]){
                                EnemyNode *temp = [array objectAtIndex:[[build.targets objectAtIndex:i]intValue]];
                                if (temp){
                                    int c_dist = temp.distance;
                                    if (!l_dist || c_dist < l_dist){
                                        l_dist = c_dist;
                                        build.atk_id = temp.uniqueID;
                                        build.isAttacking = YES;
                                    }
                                }
                            }
                        }
                    }
                }
 }}

1 个答案:

答案 0 :(得分:1)

Unrecognized selector sent =在不存在的对象上调用方法。在这种情况下,您在distance对象上调用BuildingNode方法/属性getter。

我看到的唯一distance位于您的temp对象上,该对象由EnemyNode *temp = [array objectAtIndex:[[build.targets objectAtIndex:i]intValue]];检索。这表示您实际上正在将BuildingNode对象从数组中拉出而不是EnemyNode。找出发生这种情况的原因。

相关问题