2013-10-29 51 views

回答

3

Kobold Kit將回調方法didMoveToParentwillMoveFromParent添加到所有KK *節點類。

這是通過繼承所有SK *節點類並覆蓋相應的addChildremoveChild方法及其變體來實現的。然後他們在節點上調用上面的類別方法,具體取決於節點是添加還是刪除。

不幸的是,我們無法繼承SKNode以向所有SKNode類添加方法 - 所有其他SK * Node仍將原始SKNode作爲其父級。除了子類化之外,您還可以在SKNode類別中添加自定義addChild/removeChild方法(比方說addNode/removeNode),並僅使用這些方法。然後他們會在調用原始的addChild/removeChild實現之前,向節點發送一個willAdd/didRemove消息。

理論上這也可以通過調整SKNode類的addChild/removeChild方法來完成。但是如果我沒有記錯,那是我最初嘗試過的,並且它不起作用 - 我不記得爲什麼,究竟是什麼原因之一,SKNode的子類可以在不調用super的情況下實現自己的addChild/removeChild版本實現或調用超級實現不會運行混合方法。另一個原因可能是內部addChild/removeChild方法直接轉發到底層C++ Sprite Kit引擎,而不是在SKNode類層次結構中向上傳遞。

+0

底線,Sprite Kit可能很大很好,但它缺少的是開源社區... – Jonny

+3

你可以說iOS SDK的同樣的東西... @Jonny –

4

如果不需要Kobold套件,您可以對SKSpriteNode(或其他任何SKNode)進行子類別劃分,並擴展SKNodes擁有的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"); 
} 

這差不多就是斯特芬Itterheim做以達致這功能,正如他在發帖解釋。

+0

這裏的問題可能有幾個其他變體像insertChild,還有像父母的removeChild之類的東西。抓住所有這些可能會變得棘手。無論如何,像遊戲中的暫停彈出層(這可能是一個sknode或skspritenode)的東西是很難得到正確的。 – Jonny

+0

如果您是SKNode/SKSpriteNode的子類,則不會很棘手。但是tbh,如果你依賴於addChild的鉤子,你可能會以錯誤的方式處理事情。 –