Class 如何检查已接触的SKSpriteNode是否也是从SKSpriteNode继承的其他类型?

Class 如何检查已接触的SKSpriteNode是否也是从SKSpriteNode继承的其他类型?,class,types,sprite-kit,touch,Class,Types,Sprite Kit,Touch,我需要检查我的自定义类SKSpriteNode继承对象中的哪一个被触及。我的游戏中有一些元素,比如: @interface Hero : SKSpriteNode 和非播放角色元素: @interface StaticLevelElement : SKSpriteNode 我需要检查哪一个已经被触动,并相应地调用适当的方法(要么是来自Hero的方法,要么来自StaticLevelElement类) 我可以使用哪种方法来区分特定类型的类?您可以这样做: if ([node isKindOf

我需要检查我的自定义类SKSpriteNode继承对象中的哪一个被触及。我的游戏中有一些元素,比如:

@interface Hero : SKSpriteNode
和非播放角色元素:

@interface StaticLevelElement : SKSpriteNode  
我需要检查哪一个已经被触动,并相应地调用适当的方法(要么是来自Hero的方法,要么来自StaticLevelElement类)


我可以使用哪种方法来区分特定类型的类?

您可以这样做:

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
的实例和
子类staticlevelment
的实例,则该方法将返回true。这是因为
子类StaticLevelElement
继承自
StaticLevelElement

所以我想,这不是你的最佳方法。在SpriteKit中,在类似您的情况下,人们通常使用以下方法(通过设置
SKNode的
属性)

在您的
英雄的
初始值设定项中(或者您可以在场景中创建节点时命名节点):

然后在您的
触摸中开始

if ([node.name isEqualToString:@"hero"]){
    NSLog(@"Touched node is hero");
}

您可以这样做:

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
的实例和
子类staticlevelment
的实例,则该方法将返回true。这是因为
子类StaticLevelElement
继承自
StaticLevelElement

所以我想,这不是你的最佳方法。在SpriteKit中,在类似您的情况下,人们通常使用以下方法(通过设置
SKNode的
属性)

在您的
英雄的
初始值设定项中(或者您可以在场景中创建节点时命名节点):

然后在您的
触摸中开始

if ([node.name isEqualToString:@"hero"]){
    NSLog(@"Touched node is hero");
}

您可以在SKSpriteNode子类中重写
touchESBERTED
方法,并相应地执行它们的函数。这会留下最少的错误更改,因为只有当系统确定特定节点已被触摸时,才会调用此方法

如果需要从主场景调用某种方法,则可以使用
NSNotificationCenter
向场景发送消息(如果需要与许多不同的对象通信,这也会起作用),您可以通过让英雄拥有存储场景实例的属性来调用场景方法,或者您可以有一个名为isTouched的属性,当您在
touchesBegind
中时,您可以将其设置为true(Yes),当您在
toucheSend
touchesCancelled
中时,您可以将其设置为false(No),以及某种标识属性,以消除进行广泛搜索的需要,并且可以执行类似于

  if(node.isTouched && node.identifier == "StaticLevelElement")
  {
       //do stuff pertaining to StaticLevelElement 
  }

您可以在SKSpriteNode子类中重写
touchESBERTED
方法,并相应地执行它们的函数。这会留下最少的错误更改,因为只有当系统确定特定节点已被触摸时,才会调用此方法

如果需要从主场景调用某种方法,则可以使用
NSNotificationCenter
向场景发送消息(如果需要与许多不同的对象通信,这也会起作用),您可以通过让英雄拥有存储场景实例的属性来调用场景方法,或者您可以有一个名为isTouched的属性,当您在
touchesBegind
中时,您可以将其设置为true(Yes),当您在
toucheSend
touchesCancelled
中时,您可以将其设置为false(No),以及某种标识属性,以消除进行广泛搜索的需要,并且可以执行类似于

  if(node.isTouched && node.identifier == "StaticLevelElement")
  {
       //do stuff pertaining to StaticLevelElement 
  }