Objective C - SKNode子类'吞下'触摸?

时间:2014-07-27 17:08:33

标签: ios objective-c sprite-kit sknode

我正在尝试对SKNode进行子类化,以便当您触摸其框架(包围其子项的最小框架)时,touchesBegan::方法会通知它。

然而,似乎只有在触摸SKSpriteNode孩子时才会通知它。我试过重写containsPoint:方法,但没有成功。

这是我的代码:

@interface gameNode : SKNode {
    SKSpriteNode* mainChar;
}

@property (weak, nonatomic) id <gameNodeDelegate> delegate;

@end

@implementation gameNode // When touched, touchesBegan: method not getting called.

-(id) init {
    if (self = [super init]) {

        self.userInteractionEnabled = YES;

        mainChar = [SKSpriteNode node]; // When touched, touchesBegan: method gets called.
        mainChar.color = [SKColor redColor];
        mainChar.size = CGSizeMake(25, 25);
        [mainChar runAction:[SKAction scaleTo:0 duration:0]];
        mainChar.position = CGPointMake(100, 100);
        [self addChild:mainChar];

        SKSpriteNode* n = [SKSpriteNode node]; // When touched, touchesBegan: method gets called.
        n.size = mainChar.size;
        n.position = CGPointMake(-100, -100);
        n.color = [SKColor greenColor];
        [self addChild:n];

        [mainChar runAction:[SKAction customAnimationWithProperties:CUAPropertiesForScaleBounce(CUADirectionTypeIn, 1)]];

    }
    return self;
}

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"That's a touch!");
}

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

}

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

}

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

}

@end

当触摸mainChar和n SKSpriteNodes节点而不是屏幕的其余部分时,我只会遇到触摸事件。

我能想到让它发挥作用的唯一方法是在背景中添加透明的SKSpriteNode,但必须有更好的方法!

我怎样才能让SKNode'吞下'接收到的触摸,无论孩子是否正在接触孩子? ,即我希望通过SKNodes方法触摸touchesBegan::的框架。

更新:我认为这是SKNode框架的问题。当我添加孩子后我这样做..

NSLog(@"Frame Width: %f, Frame Height: %f", self.frame.size.width, self.frame.size.height);

返回的帧的高度和宽度为0.但是,当我执行[self calculateAccumulatedFrame]时,它会返回正确的大小。这是为什么?

更新:这个问题非常混乱。我将坚持使用添加透明SKSpriteNode或使用SKScene的解决方案。对不起,每个人都有困惑,感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

SKNode没有任何内在界限。它不会执行任何绘图,您可以有效地将其视为未在屏幕上呈现。 无法检测到触摸。

您正在寻找的功能最好由SKScene提供。使用SKScene