Нужна помощь с решением NSMutableArray - PullRequest
1 голос
/ 07 июля 2011

В настоящее время я разрабатываю решение для моего объекта BuildingNode * tower, которое находится внутри NSMutableArray * gameObjects, для атаки на вражеские объекты EnemyNode *, также содержащиеся в массиве gameObjects.

У меня есть предлагаемое решение, которое иногда приводит к зависанию моей игры (временно), поскольку используемое решение довольно глючное.

Мое решение состоит в том, что каждый объект башни содержит свои собственные цели NSMutableArray *, которыесинтезирован из класса Tower.Если враг попадает в зону действия или вне зоны действия любого данного объекта башни, соответствующий ему индекс объекта EnemyNode * из массива gameObjects сохраняется как NSNumber в массив целей или, в качестве альтернативы, если объект противника находится вне зоны действия,он удален из массива .targets.
По сути, идея состоит в том, что массив целей содержит индексы любого врага, находящегося в пределах видимости башни.

Проблема, с которой я, похоже, сталкиваюсь, заключается в том, чтоэтот массив tower.targets постоянно обновляется динамически, я считаю, что если я выполняю какую-то операцию с определенным индексом tower.targets, который затем удаляется, я получаю эту ошибку:

- [BuildingNode distance]: нераспознанный селектор, отправленный экземпляру 0x2dd140

Каждая башня BuildingNode * имеет различные атакующие алогриты, которые используют массив tower.targets для вызова обратно отсортированного / желаемого врага.Например, стиль случайной атаки будет рандомизировать число между 0 & [tower.targets count], затем я могу создать указатель на gameObjects с соответствующим [tower.targets intValue].Примерно так:

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 Ответ

1 голос
/ 07 июля 2011

Unrecognized selector sent = вызов метода для объекта, который не существует.В этом случае вы вызываете метод distance метода / свойства для объекта BuildingNode.

Единственный distance, который я вижу, находится на вашем temp объекте, который извлекается EnemyNode *temp = [array objectAtIndex:[[build.targets objectAtIndex:i]intValue]]; Это указывает на то, что вы действительно вытаскиваете объект BuildingNode из массива вместо EnemyNode.Узнайте, почему это происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...