2017-06-11 9 views
0

Ich bin ein Galaga-Stil Spiel in Swift 3 mit SpriteKit zu schreiben und ich immer einen Fehler erhalten, die Der Typ '[SKNode]' kann nicht dem Typ 'SKSpriteNode!' Zugewiesen werden.

Cannot assign value of type '[SKNode]' to type 'SKSpriteNode!'

sagt Kann mir jemand erklären, was das bedeutet, so dass ich es selbst in der Zukunft beheben und geben auch mir eine mögliche Lösung?

Hier ist die Funktion, wo ich den Fehler:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 

    for touch in touches { 
     let location = (touch as UITouch).location(in: self) 
     if fireButton = self.nodes(at: location) { 
      shoot() 
     } else { 
      let touchLocation = touch.location(in: self) 
      spaceship.position.x = touchLocation.x 
     } 
    } 
} 

Ich erhalte den Fehler auf der Linie mit if fireButton = self.nodes(at: location)

+0

Sie müssen die SKSpriteNode-Klasse auf diesem SKNode eingeben, ich weiß nur, wie es mit Obj-C geht, ich weiß nicht, schnelle (noch) Entschuldigung – TheFlyingProgrammer

+0

Können Sie erklären, was es bedeutet, etwas zu tippen? – Shock9616

Antwort

0

Die Funktion self.nodes(at: location) ein Array aller SKNodes zurückgibt, die location schneiden. Der Fehler tritt auf, weil Sie versuchen, das gesamte Array von SKNodes (d. H. [SKNode]) einer Variablen zuzuweisen, die nur auf einen einzelnen Knoten verweist.

Beachten Sie auch, dass seit self.nodes(at: location) kehrt alle die Knoten, die die spezifische Lage schneiden, müssen Sie durch die Anordnung von Knoten zu durchlaufen um den Knoten zu finden, die Sie suchen.

durch das Array zu durchlaufen, würde ich die Linien

if fireButton = self.nodes(at: location) { 
     shoot() 
} 

mit

let nodes = self.nodes(at: location) 
for node in nodes { 
    if node.name == "fireButton" { 
     shoot() 
    } 
} 

Und an der Stelle zu ersetzen empfehlen, wo Sie fireButton weisen Sie einen Namen wie in

fireButton.name = "fireButton" 
// just an exmaple, rather store these names as constants somewhere in your code 
erklären

Das ist der einfachste Weg, aber Sie müssen sich an alle Namen erinnern, die Sie an Ihren Namen vergeben haben Sprites. Ein alterantive ist eine FireButton Klasse als Unterklasse von SKSpriteNode zu erstellen, erklären fireButton als Instanz von FireButton und stattdessen für Namen überprüfen, können Sie

if node is FireButton { 
    shoot() 
} 

hoffe, das hilft tun!

+0

Ok, was wäre der beste Weg, um das Array zu iterieren? – Shock9616

+0

Ok, es hat diesen Fehler behoben, aber jetzt bekomme ich einen Fehler bei der Initialisierung des FireButton-Sprites, der Thread 1 EXC_BAD_INSTRUCTION (Code = EXC_1386_INVOP, Subcode = 0x0) sagt. Ich werde versuchen, das selbst herauszufinden, weil ich denke, dass ich bereits eine Frage zu diesem Fehler gestellt habe. Wenn Sie sich frei fühlen wollen, werde ich wahrscheinlich eine Zeitlang nicht antworten. Danke für die Hilfe! – Shock9616

+0

Gern geschehen! Der zweite Fehler bedeutet, dass Sie auf ein Objekt zugegriffen haben, das nicht existiert (entweder wurde es noch nicht initialisiert oder wurde bereits freigegeben). Ich denke, das Problem kann sein, wenn du die Optionals mit Hilfe der Option auspackst! . Überprüfen Sie, ob das Objekt nicht null ist, bevor Sie es gewaltsam auspacken. – JohnV

Verwandte Themen