当在父节点上添加和删除SKSpriteNode(或SKNode)时,类中是否有任何(最佳实践)方法来挂钩事件?
答案 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将回调方法didMoveToParent
和willMoveFromParent
添加到所有KK * Node类。
这是通过继承所有SK * Node类并覆盖相应的addChild
和removeChild
方法及其变体来实现的。然后,他们在节点上调用上面的类别方法,具体取决于是添加还是删除了节点。
不幸的是,我们不能将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类层次结构中向上传递。