我想打破我的游戏,所以它可以将功能传递给其他类 - 例如。 CollisionHandler等,例如:
[collisionHandler handleCollisions:enemies forPlayer:player];
我可以通过两种方式创造“敌人”。阵列。
我可以自己维护它,在他们被创造和杀死时推动和弹出敌人。但这意味着在敌人的阶级中,而不仅仅是这样做..
[self removeFromParent]
我需要添加更多代码来告诉主游戏场景删除项目等。
或者我可以在需要时使用enumerateChildNodesWithName
创建数组。例如,在我的主游戏循环中
-(void)run
{
NSMutableArray *enemies = [self getNodesWithName:@"enemy"];
[collisionHandler handleCollisions:enemies withPlayer:player];
}
-(NSMutableArray*)getNodesWithName:(NSString*)name
{
NSMutableArray *result = [NSMutableArray alloc] init];
[self enumerateNodesWithName:@"enemy" usingBlock:^{[result addObject:node];}];
return result;
}
这一切都可以正常使用2,并减少维护我自己的敌人阵列,游戏对象,子弹等的需要
但我的问题是 - 当有很多物品时,这会变得迟钝吗?与自己维护一个对象数组相比,每个帧的枚举和创建数组效率极低吗?或者iOS会快速枚举,不会出现问题吗?
答案 0 :(得分:1)
我不会认为enumerateNodesWithName非常有效,因为它需要做很多字符串比较。
您可以做的是创建一个NSMutableDictionary,其中包含所有节点作为值,其名称为键。每当您向场景添加节点时,只需将其添加到字典中即可。这样,找到要删除的节点要快得多。只要确保你保持字典是最新的。
答案 1 :(得分:1)
在IOS 8中,SKNode的-enumerateChildNodesWithName:usingBlock:很慢。原因是许多开发人员在枚举时修改节点树导致许多崩溃(NSMutableArray在枚举崩溃时被修改)。
鉴于此,SKNode -enumerate ..在这些情况下更新为崩溃安全,尽管现在它更慢。