SKSpriteNode的子类和触摸事件

3

我不懂为什么如果我继承了实现了UIResponder协议的SKSpriteNode类,与触摸相关的方法都没有被调用。

比如说,这是一个我正在用作测试的非常简单的类:

//INTERFACE ----------------
#import <SpriteKit/SpriteKit.h>

@interface TestClass : SKSpriteNode

@end

//IMPLEMENTATION -----------
#import "TestClass.h"

@implementation TestClass


- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
     NSLog(@"oook");
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{}
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event{}

@end

如果我将这个类的实例附加到场景中,触摸该对象...什么也不会发生。
我是不是忘了什么?
1个回答

13

我刚刚看到SKNode默认的userInteractionEnabled参数为NO。只需将其设置为YES,代码就能正常工作。


4
但如果被一个不启用交互的Sprite遮挡,那么遮挡的Sprite会吞噬触摸事件… - DogCoffee
@Smick,你是说如果覆盖的精灵启用了userinteractionEnabled = YES,那么可以通过它们进行“点击”吗? - bobmoff
4
我刚试了一下,似乎不管遮盖的精灵是否有 userInteractionEnabled 属性,它都会阻挡下方精灵的触摸事件。我希望能找到一种方法来解决这个问题,因为我想要在前景中移动透明的云朵。 - bobmoff
我看到你已经看了另一篇帖子,但是如果你尝试我的答案,你会发现场景可以在那个点循环遍历所有节点,所以覆盖精灵将会检测到碰撞!但实际的节点beginTouch并没有被调用。 - DogCoffee
2
@AndreyGordeev 这会使按钮渲染在“覆盖”精灵的上方,这就违背了有一个覆盖精灵的目的,因为它不再起到遮挡的作用。我实际上写了一篇关于这个问题的帖子,并在gist上发布了我的解决方案https://gist.github.com/bobmoff/7110052。我不知道是否可以发布自己撰写的博客文章的链接 :) - bobmoff
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接