5

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

4

2 回答 2

4

在不需要 Kobold Kit 的情况下,您可以子类化一个 SKSpriteNode(或事实上的任何 SKNode)并扩展removeFromParentSKNodes 拥有的功能。

例如:

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

我的场景.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 为实现此功能所做的工作。

于 2013-10-29T15:21:43.287 回答
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实现,或调用超级实现根本不会运行 swizzled 方法。另一个原因可能是在内部,addChild/removeChild 方法直接转发到底层 C++ Sprite Kit 引擎,而不是在 SKNode 类层次结构中向上传递。

于 2013-10-29T11:00:14.863 回答