如何检查SKSpriteNode是否还触及了从SKSpriteNode继承的其他类型?

时间:2016-02-22 02:00:43

标签: class types sprite-kit touch

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

@interface Hero : SKSpriteNode

和一个非播放的角色元素:

@interface StaticLevelElement : SKSpriteNode  

我需要检查哪一个被触及并相应地调用正确的方法(从Hero或StaticLevelElement类的方法)。

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

2 个答案:

答案 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(是) )当你在touchesEndedtouchesCancelled时,以及某种识别属性,以消除进行大量搜索的需要,并且几乎可以像

那样进行调用
  if(node.isTouched && node.identifier == "StaticLevelElement")
  {
       //do stuff pertaining to StaticLevelElement 
  }