2016-07-01 10 views
0

So habe ich eine Klasse, die eine Unterklasse von SKSpriteNode ist und ich möchte es benachrichtigt werden, wenn das übergeordnete Element oder Szene, wenn es keinen übergeordneten Knoten hat, so dass ich die Größe des Containers kennen . Ich habe versucht, Sie folgendermaßen vorgehen:Erkennen, wenn das übergeordnete Element des Knotens ändert

class MyNode: SKSpriteNode { 

    override var parent: SKNode? { 
     didSet { 

      //code here 

     } 
    } 

    override var scene: SKScene? { 
     didSet { 

      //code here 

     } 
    } 

} 

Allerdings habe ich die Fehlermeldung anzeigt, Cannot observe read-only property 'parent'; it can't change und Cannot observe read-only property 'scene'; it can't change, die mich glauben macht, dass es private Werte irgendwo und diese Eigenschaften werden berechnet. Ich weiß nicht, was ich sonst noch tun soll, außer dass ich jedesmal manuell eine Funktion aufruft, wenn ich meinen Knoten zu etwas anderem hinzufüge, aber ich finde, das ist eine hässliche Lösung. Vielen Dank für Ihre Hilfe. Tut mir leid, wenn die Lösung offensichtlich ist. Ich bin ziemlich neu in SpriteKit.

Antwort

1

Was ich tat, war Erweiterungen für SKScene machen:

import Foundation 
import SpriteKit 

extension SKScene { 

    override public func addChild(node: SKNode) { 

     super.addChild(node) 

     if let myNode = node as? MyNode { 

      myNode.containerSize = self.size 

     } 

    } 

} 

und für SKSpriteNode:

import Foundation 
import SpriteKit 

extension SKSpriteNode { 

    override public func addChild(node: SKNode) { 

     super.addChild(node) 

     if let myNode = node as? MyNode { 

      myNode.containerSize = self.size 

     } 

    } 

} 
+0

Dies ist die beste Lösung: "parent" ist schreibgeschützt, es gibt keinen Setter, so dass Sie es nicht mit 'didSet' beobachten können. Aber es ist die Methode 'addChild()', die indirekt bewirkt, dass sich der Wert von 'Eltern' ändert. –

+0

Warum würden Sie sich überhaupt die Mühe machen, wenn der einzige Punkt die Containergröße ist? containerSize muss nur eine Eigenschaft sein 'var containerSize: CGSize {get {return parent? .size ?? CGSizeZero}} ' – Knight0fDragon

+0

@ Knight0fDragon Ich habe eine Eigenschaft Beobachter darauf, die die Aktionen, die ich will – user3128464

1

Sie legen Klasseneigenschaften für die Erkennung fest, die Sie bei der Initialisierung der Klasse nicht ändern dürfen. Ich würde empfehlen, eine der Game-Loop-Funktionen wie didFinishUpdate einzuchecken. Dann können Sie jeden Frame überprüfen und die richtigen Operationen ausführen.

+0

Danke für den Tipp, aber ich habe gerade eine andere Lösung, die zu funktionieren scheint. Was ich gemacht habe, war Erweiterungen für "SKScene" und "SKSpriteNode" zu machen, und in jedem habe ich "addChild" überschrieben. Dann habe ich innerhalb von 'addChild' nach dem Aufruf der Superfunktion den Typ des Knotens überprüft, der an die Funktion übergeben wurde, um zu sehen, ob es' MyNode' ist. – user3128464

+0

Schön, ja das ist sicherlich eine Lösung. Überprüfst du mehrere Knoten? – Siriss

+0

Was meinen Sie mit "Überprüfen mehrerer Knoten?" – user3128464

Verwandte Themen