2011-07-07 129 views
1

我目前正在为我的对象BuildingNode *塔设计一个解决方案,该解决方案被放置在NSMutableArray * gameObjects内部,攻击EnemyNode *敌对对象,同时也保存在gameObjects数组中。需要帮助NSMutableArray解决方案

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

我的解决方案是,每个塔对象都包含自己的NSMutableArray *目标,它是从Tower类合成的。如果一个敌人进入了任何给定的塔状物体的射程或超出范围,来自gameObjects数组的敌方物体的相应索引被保存为一个NSNumber到目标数组中,或者如果敌方物体超出范围,它将从.targets数组中移除。
基本上这个想法是,目标阵列拥有在塔范围内的任何敌人的指数。

我似乎面临的问题是,因为这个tower.targets数组始终是动态更新的,我相信如果我正在做一些特定索引的tower.targets然后被删除,我得到这个错误:

-[BuildingNode distance]: unrecognized selector sent to instance 0x2dd140

每个BuildingNode *塔有使用tower.targets阵列回调到分拣/所需敌人攻击不同算法的。例如,一个随机的攻击风格会随机化一个介于0 [0]到[0]之间的数字[tower.targets count],然后我可以用相应的[tower.targets intValue]创建一个指向gameObjects的指针。 事情是这样的:

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

因此,这将潜在.targets阵列找到一个随机的敌人,然后创建一个指向对象的敌人。

我已经放入很多if语句来确保在.targets索引被中途排序的情况下,操作不应该继续,从而消除游戏失败率,但它偶尔会偶尔发生。

继承人我的代码:
请注意BuildingNode *塔== BuildingNode *构建。
这只是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

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

唯一distance我看到的是你的temp的对象,这是由EnemyNode *temp = [array objectAtIndex:[[build.targets objectAtIndex:i]intValue]];这表明你真的拉BuildingNode对象出数组,而不是一个EnemyNode的获取上。找出发生的原因。

+0

Hrm,我正在使用isKindOfClass:[EnemyNode类],而不是isMemberOfClass,用于迭代gameObjects。但林不确定这是否是问题,isKindOfClass只会选择自己和子类。我会看看现在会发生什么,谢谢。 – Ospho

+0

那么它不仅仅意味着一个不存在的对象的方法。它也可能是一个存在的对象的方法,但该方法或者不存在,或者没有在头中声明,所以消息(发送者)类不知道它。 –