2013-10-29 11 views
5

से हटा वहाँ किसी भी (सबसे अच्छा अभ्यास) वर्ग के भीतर जिस तरह की घटनाओं जब एक SKSpriteNode (या SKNode) पर जोड़ा गया है और एक माता पिता के नोड से निकाल दिया जाता है हुक करने है?SKSpriteNode, को जोड़ा गया/माता-पिता हुक

उत्तर

3

Kobold Kit सभी केके * नोड कक्षाओं में कॉलबैक विधियों didMoveToParent और willMoveFromParent जोड़ता है।

यह सभी एसके * नोड वर्गों को उपclassing और संबंधित addChild और removeChild विधियों और उनके रूपों को ओवरराइड करके हासिल किया जाता है। इसके बाद वे नोड को ऊपर या हटाए जाने के आधार पर उपरोक्त श्रेणी विधियों को कॉल करते हैं।

दुर्भाग्य से हम सब SKNode वर्गों के लिए तरीकों जोड़ने के लिए SKNode उपवर्ग नहीं कर सकते हैं - अन्य एसके * नोड अभी भी अपने माता पिता के रूप मूल SKNode होगा सब। सबक्लासिंग के अलावा आप एक एसकेएनओडी श्रेणी में कस्टम ऐड चाइल्ड/निकालें चाइल्ड विधियां भी जोड़ सकते हैं (चलो एडनोड/निकालें नोड) और केवल इन का उपयोग करें। फिर वे मूल addChild/removeChild कार्यान्वयन को कॉल करने से पहले नोड को एक इच्छा जोड़ें/किया गया संदेश भेजेंगे।

सैद्धांतिक रूप से यह भी SKNode वर्ग पर addChild/removeChild तरीकों swizzling के द्वारा किया जा सकता है। लेकिन अगर मुझे सही तरीके से याद आया तो मैंने शुरुआत की कोशिश की, और यह काम नहीं किया - मुझे याद नहीं है कि क्यों, कारणों में से एक कारण यह हो सकता था कि एसकेएनओड के उप-वर्ग सुपर-कॉल किए बिना addChild/removeChild के अपने संस्करणों को कार्यान्वित कर सकते हैं कार्यान्वयन, या सुपर कार्यान्वयन को बुलावा बस swizzled विधियों को नहीं चलाता है। एक अन्य कारण हो सकता है कि आंतरिक रूप से addChild/removeChild तरीकों सीधे बजाय अंतर्निहित सी ++ स्प्राइट किट इंजन को भेजी जाती है SKNode वर्ग पदानुक्रम में ऊपर की तरफ पारित किया जा रहा।

+0

नीचे की रेखा, स्प्राइट किट बड़ी और बड़ी हो सकती है लेकिन इसमें क्या कमी है ओपन सोर्स समुदाय है ... – Jonny

+3

आप आईओएस एसडीके के बारे में भी यही बात कह सकते हैं ... @ जॉनी –

4

कोबॉल्ड किट की आवश्यकता के बिना, आप एसकेएसप्रेट नोड (या तथ्य के लिए कोई भी एसकेएनओडी) उप-वर्ग कर सकते हैं और एसकेएनओड्स के 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, और माता-पिता के निकालने की तरह चीजें भी बच्चे। उन सभी को पकड़ना मुश्किल हो सकता है। वैसे भी एक इन-गेम पॉज़ पॉपअप लेयर जैसी चीजें कर रही हैं (शायद यह एक स्नोडोड या स्कसप्रिटिनोड है) सही पाने के लिए मुश्किल है। – Jonny

+0

नहीं यदि आप SKNode/SKSpriteNode उपवर्गीकरण कर रहे हैं, यह मुश्किल नहीं होगा। लेकिन tbh, अगर आप addChild के साथ एक हुक पर भरोसा कर रहे हैं, तो आप शायद गलत तरीके से चीजों के बारे में जा रहे हैं। –

संबंधित मुद्दे