我需要检查哪些自定义类SKSpriteNode继承的对象被触及。我的游戏中有一些元素,如:
@interface Hero : SKSpriteNode
和一个非播放的角色元素:
@interface StaticLevelElement : SKSpriteNode
我需要检查哪一个被触及并相应地调用正确的方法(从Hero或StaticLevelElement类的方法)。
我可以使用哪种方法来区分特定类型的类?
答案 0 :(得分:1)
您可以这样做:
if ([node isKindOfClass:[StaticLevelElement class]]){
NSLog(@"Touched node is StaticLevelElement");
}else if([node isKindOfClass:[Hero class]]){
NSLog(@"Touched node is Hero");
}
来自isKindOfClass
:方法:
返回一个布尔值,指示接收器是否为 给定类的实例或继承自的任何类的实例 那个班。
看看这部分:
...或从该类继承的任何类的实例
你应该小心,因为如果你像这样继承StaticLevelElement
:
@interface SubclassOfStaticLevelElement : StaticLevelElement
@end
在内部触摸开始这样做:
if ([node isKindOfClass:[StaticLevelElement class]]){
NSLog(@"Touched node is StaticLevelElement");
}
如果同时触摸StaticLevelElement
的实例和SubclassOfStaticLevelElement
的实例,则该方法将返回true。这是因为SubclassOfStaticLevelElement
继承自StaticLevelElement
。
所以我想,这不是最适合你的方法。在SpriteKit中,在像你这样的情况下,人们经常使用下面的方法(通过设置SKNode's
name属性)。
在Hero's
初始值设定项中(或者您可以在场景中创建时命名节点):
self.name = @"hero";
然后在touchesBegan
:
if ([node.name isEqualToString:@"hero"]){
NSLog(@"Touched node is hero");
}
答案 1 :(得分:1)
您可以覆盖SKSpriteNode子类中的touchesBegan
方法,并相应地执行它们的功能。这为错误留下了最少的更改量,因为只有在系统确定已触摸特定节点时才会调用此方法。
如果您需要从主场景中调用某种方法,则可以使用NSNotificationCenter
向场景发送消息(如果您需要与许多不同的对象进行通信,这也会有效)可以通过让英雄拥有存储场景实例的属性来调用场景方法,或者你可以拥有一个名为isTouched的属性,当你在touchesBegan
和false时,你设置为true(是) )当你在touchesEnded
和touchesCancelled
时,以及某种识别属性,以消除进行大量搜索的需要,并且几乎可以像
if(node.isTouched && node.identifier == "StaticLevelElement")
{
//do stuff pertaining to StaticLevelElement
}