我正在为我的对象BuildingNode *塔设计一个解决方案,该解决方案保存在NSMutableArray * gameObjects中,以攻击也存放在gameObjects数组中的EnemyNode *敌人对象。
我有一个建议的解决方案偶尔会导致我的游戏冻结(暂时),因为所采用的解决方案非常错误。
我的解决方案是每个塔对象都包含自己的NSMutableArray *目标,这些目标是从塔类合成的。如果敌人进入范围或超出任何给定塔对象的范围,则来自gameObjects数组的EnemyNode *敌方对象的相应索引将作为NSNumber保存到目标数组中,或者如果敌方对象超出范围,它将从.targets数组中删除 基本上这个想法是目标数组保存了塔内范围内任何敌人的指数。
我似乎面临的问题是因为这个tower.targets数组一直在动态更新,我相信如果我对某个特定的tower.targets索引进行某种操作,然后将其删除,我收到这个错误:
- [BuildingNode distance]:无法识别的选择器发送到实例0x2dd140
每个BuildingNode *塔都有不同的攻击算法,使用tower.targets数组来回调已排序/想要的敌人。 例如,随机攻击风格将随机化0到0之间的数字。 [tower.targets count]然后我可以使用相应的[tower.targets intValue]创建一个指向gameObjects的指针。 像这样:
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;
}
}
}
}
}
}
}}
答案 0 :(得分:1)
Unrecognized selector sent
=在不存在的对象上调用方法。在这种情况下,您在distance
对象上调用BuildingNode
方法/属性getter。
我看到的唯一distance
位于您的temp
对象上,该对象由EnemyNode *temp = [array objectAtIndex:[[build.targets objectAtIndex:i]intValue]];
检索。这表示您实际上正在将BuildingNode
对象从数组中拉出而不是EnemyNode
。找出发生这种情况的原因。