SKSpriteNode,添加到父钩子中或从父钩子中移除

时间:2013-10-29 02:26:38

标签: sprite-kit

当在父节点上添加和删除SKSpriteNode(或SKNode)时,类中是否有任何(最佳实践)方法来挂钩事件?

2 个答案:

答案 0 :(得分:4)

不需要Kobold Kit,您可以对SKSpriteNode(或任何SKNode)进行子类化,并扩展SKNode拥有的removeFromParent函数。

例如:

<强> FLSprite.m:

#import "FLSprite.h"

@implementation FLSprite

-(void)removeFromParent {
    [super removeFromParent];
    NSLog(@"I print when I'm Removed");
    //here's where you'll add your hooking functions
}

@end

<强> MyScene.m:

-(id)initWithSize:(CGSize)size {    
    if (self = [super initWithSize:size]) {
    FLSprite* sprite = [FLSprite spriteNodeWithColor:[UIColor blackColor] size:CGSizeMake(200, 100)];
        [sprite setPosition:CGPointMake(100.0, 50.0)];
        [self addChild:sprite];
        [sprite removeFromParent];

    }
    return self;
}

至于添加孩子,由于你这样添加了一个孩子(在大多数情况下)[self addChild:node];,你需要在你要添加的视图中扩展addChild。例如,您将以下内容添加到MyScene.m,因为我们正在将精灵添加到该视图中

-(void)addChild:(SKNode *)node {
    [super addChild:node];
    NSLog(@"added child");
}

正如他在帖子中所解释的那样,这正是Steffen Itterheim为实现这一功能所做的。

答案 1 :(得分:3)

Kobold Kit将回调方法didMoveToParentwillMoveFromParent添加到所有KK * Node类。

这是通过继承所有SK * Node类并覆盖相应的addChildremoveChild方法及其变体来实现的。然后,他们在节点上调用上面的类别方法,具体取决于是添加还是删除了节点。

不幸的是,我们不能将SKNode子类化为向所有SKNode类添加方法 - 所有其他SK * Node仍将原始SKNode作为其父级。除了子类化之外,您还可以在SKNode类别中添加自定义addChild / removeChild方法(例如addNode / removeNode)并仅使用这些方法。然后,在调用原始addChild / removeChild实现之前,他们会向节点发送一条willAdd / didRemove消息。

理论上,这也可以通过调用SKNode类上的addChild / removeChild方法来完成。但是,如果我没记错的话,那是我最初尝试的,而且它不起作用 - 我不记得为什么,其中一个原因可能是SKNode的子类可以实现自己的addChild / removeChild版本而不需要调用super实现,或调用超级实现只是不运行调配方法。另一个原因可能是内部addChild / removeChild方法直接转发到底层C ++ Sprite Kit引擎,而不是在SKNode类层次结构中向上传递。