2011-07-07 75 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

那麼它不僅僅意味着一個不存在的對象的方法。它也可能是一個存在的對象的方法,但該方法或者不存在,或者沒有在頭中聲明,所以消息(發送者)類不知道它。 –