在SKSpriteNode(或SKNode)添加到父節點和從父節點刪除時,類中是否有任何(最佳實踐)方式來掛鉤事件?SKSpriteNode,添加到父鉤子或從父鉤子刪除
回答
Kobold Kit將回調方法didMoveToParent
和willMoveFromParent
添加到所有KK *節點類。
這是通過繼承所有SK *節點類並覆蓋相應的addChild
和removeChild
方法及其變體來實現的。然後他們在節點上調用上面的類別方法,具體取決於節點是添加還是刪除。
不幸的是,我們無法繼承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類層次結構中向上傳遞。
如果不需要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做以達致這功能,正如他在發帖解釋。
這裏的問題可能有幾個其他變體像insertChild,還有像父母的removeChild之類的東西。抓住所有這些可能會變得棘手。無論如何,像遊戲中的暫停彈出層(這可能是一個sknode或skspritenode)的東西是很難得到正確的。 – Jonny
如果您是SKNode/SKSpriteNode的子類,則不會很棘手。但是tbh,如果你依賴於addChild的鉤子,你可能會以錯誤的方式處理事情。 –
- 1. 如何刪除git鉤子
- 2. 從'woocommerce_email_customer_details'鉤子中刪除'email_addresses'動作
- 3. 將類添加到子代時從父類中刪除類
- 4. JPA父子刪除
- 5. 從父刪除一個孩子,並將其作爲同級添加到父
- 6. 將WooCommerce鉤子添加到Wordpress頁面
- 7. 我如何添加linting到預鉤鉤子
- 8. 將子串添加到數組,並從父字符串中刪除該子串
- 9. 刪除孩子SKSpriteNode
- 10. Ember.js - 調用父模型掛鉤來加載子數據
- 11. Subversion空格刪除提交鉤子
- 12. 如何從父SKSpriteNode中刪除小孩SKSpriteNode而不殺小孩
- 13. TSLint預先掛鉤鉤子
- 14. 刪除後將SKSpriteNode兒童添加回父項
- 15. 如何刪除孩子(Movieclip)並添加到新的父級(Movieclip)
- 16. 刪除父和子記錄
- 17. 用父/子刪除問題
- 18. 刪除父和子對象
- 19. 刪除鉤
- 20. 從循環中刪除父級帖子
- 21. 從父級刪除所有子節點?
- 22. 從父在淘汰賽中刪除子
- 23. 從jquery中的父div刪除子div
- 24. 從父母刪除子集合
- 25. PyQt4:從其父母中刪除孩子
- 26. 刪除父刪除其子女的jQuery
- 27. 如何在linux下添加posix鉤子?
- 28. Ember組件:如何添加didInsertElement鉤子
- 29. 在elisp函數上添加鉤子
- 30. Codeigniter:在模型中添加鉤子
底線,Sprite Kit可能很大很好,但它缺少的是開源社區... – Jonny
你可以說iOS SDK的同樣的東西... @Jonny –