2016-01-08 30 views
1

我有一個用作數據容器的Polygon類,但出於調試目的,我想通過將它們作爲子節點添加到SKNode來繪製多邊形。當我這樣做時,我想讓Polygon對象爲它自己添加邊界精靈子元素。由於性能的原因,我只想在多邊形作爲子節點添加到另一個節點時添加這些精靈。當SKNode被添加爲子時檢測

有沒有什麼方法可以讓Polygon對象本身檢測到它已被添加到場景中,還是我需要通過在場景中添加一個額外的createSprites電話來告訴它?

我想我可以輪詢父母的屬性,但我正在尋找事件驅動。

回答

1

在Swift中,您可以定義屬性觀察者,以瞭解您繼承的類的屬性。

你可以在自定義SKNode子類的parent財產觀察變化,就像這樣:

class MyNode : SKNode { 

    override var parent: SKNode? { 
     didSet { 
      // parent node changed; do something 
     } 
    } 
} 

編輯:就像我在評論中提到,在Objective-C(在那裏你可以不使用財產觀察員),您可以改爲使用鍵值觀察(KVO),並觀察SKNodeparent屬性中的更改:

實際代碼:

- (instancetype) init 
{ 
    if (self = [super init]){ 
     // REGISTER for KVO 
     [self addObserver:self 
       forKeyPath:@"parent" 
        options:NSKeyValueObservingOptionNew 
        context:NULL]; 
    } 

    return self; 
} 

- (void) dealloc 
{ 
    // UNREGISTER from KVO 
    [self removeObserver:self forKeyPath:@"parent" context:NULL]; 
} 

// Method that is called when any keyPath you subscribed to is modified 
- (void)observeValueForKeyPath:(NSString *)keyPath 
        ofObject:(id)object 
        change:(NSDictionary *)change 
        context:(void *)context 
{ 
    // (Check keypath in case you are observing several different 
    // properties. Otherwise, remove if statement:) 

    if ([keyPath isEqualToString:@"parent"]) { 

     // parent node changed; do something 
    } 
} 
+2

感謝。我有點含糊。我的問題涉及objective-c。我不認爲我想擴展這些基類。我正在尋找內置的東西,但也許沒有這樣的解決方案。 –

+1

然後,使用鍵值觀察並在屬性「父」更改值時收到通知。 –

1

在Objective-C,你可以做這樣的:

[node addObserver:self forKeyPath:@"parent" options:NSKeyValueChangeOldKey context:nil]; 
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 
    //logic here 
} 

或在這種情況下,簡單地繼承SKNode和覆蓋setParent:

相關問題