В настоящее время я разрабатываю решение для моего объекта 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;
}
}
}
}
}
}
}}