2011-07-07 14 views
1

現在、NSMutableArray * gameObjectsの中に保持されている、ゲームオブジェクトの配列内に保持されているEnemyNode *敵オブジェクトを攻撃するためのオブジェクトBuildingNode * towerのソリューションを考案中です。NSMutableArrayソリューションの助けが必要

私は時には解決策がかなりバグであるため、私のゲームが(一時的に)凍結するという提案された解決策を持っています。

私の解決方法は、各タワーオブジェクトがタワークラスから合成された独自のNSMutableArray *ターゲットを含んでいることです。敵が任意のタワーオブジェクトの範囲外または範囲外に来た場合、gameObjects配列からのEnemyNode *敵オブジェクトの腐食指数は、NSNumberとしてターゲット配列に保存されます。あるいは、敵オブジェクトが範囲外である場合、それは.targets配列から削除されます。
基本的な考え方は、ターゲット配列がタワーの範囲内にある敵のインデックスを保持するということです。

私が直面しているように見える問題は、このtower.targets配列が常に動的に更新されるため、削除されたtower.targetsの特定のインデックスに対して何らかの操作を行っていると思います、私はこのエラーを取得:

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

各BuildingNode *塔は、ソート/希望の敵をコールバックするためtower.targets配列を使用して別の攻撃alogrithmsを持っています。 たとえば、ランダムな攻撃スタイルでは0 & [tow.targets count]の間の数値がランダム化され、対応する[tower.targets intValue]を持つgameObjectsへのポインタを作成できます。このような 何か:

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

だから、これは潜在的な.targets配列からランダムに敵を見つけ、その後、敵へのポインタオブジェクトを作成します。

私は、.targetsインデックスが途中でソートされている場合、操作が先に進むべきではなく、ゲームの失敗率を取り除くことを保証するために多くのif文を入れましたが、それでも例外的に発生します。

私のコード:
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

Unrecognized selector sentに最も近い敵を見つけるでしょう。この場合、BuildingNodeオブジェクトでdistanceメソッド/プロパティゲッターを呼び出しています。

私は見るだけdistanceは、あなたが本当に代わりEnemyNodeの配列のうち、BuildingNodeオブジェクトを引いている示していることEnemyNode *temp = [array objectAtIndex:[[build.targets objectAtIndex:i]intValue]];によって取得されたあなたのtempオブジェクト、上にあります。それがなぜ起こるのかを調べる。

+0

Hrm、私はgameObjectsの反復のためにisMindOfClassの代わりにisKindOfClass:[EnemyNode class]を使用していました。しかし、これが問題なのかどうかは不明ですが、isKindOfClassはそれ自身と子クラスのみを選択します。ありがとうございました。 – Ospho

+0

これは、存在しないオブジェクト上のメソッドを意味するだけではありません。存在するオブジェクト上のメソッドでもかまいませんが、メソッドが存在しないかヘッダーで宣言されていないため、メッセージング(送信側)クラスはそれを認識しません。 –