2016-04-07 13 views
2

Ich finde eine similar question, aber ich versuche zu erkennen und zu identifizieren, welche Sprite der Benutzer berühren, und ich weiß nicht, wie das geht. Dies ist mein Variable:Wie kann ich feststellen, dass SKSpriteNode berührt wurde

var sprites: [[SKSpriteNode]] = [[SKSpriteNode(imageNamed: "a"), SKSpriteNode(imageNamed: "b")], [SKSpriteNode(imageNamed: "c"),SKSpriteNode(imageNamed: "d")]] 

Die Idee ist es, die spriteNode identifizieren und sie dann für andere Sprite ersetzen oder die Farbe ändern, aber ich weiß nicht, wie es mit dieser Matrix von spriteNodes zu tun, ich denke, die ersten Schritt es ist das Sprite identifizieren.

Ich schätze Ihre Hilfe wirklich! Vielen Dank!

+0

Hallo! 0.0 @rakeshbs – AnaMM

+0

Für den Anfang, erstellen Sie keine Sprites wie das. Sie müssen ihre Namen festlegen. Später, in touchesBegan, können Sie 'nodeAtPoint' oder' nodesAtPoint' verwenden, um zu überprüfen, welcher Knoten berührt * ist und basierend auf ihrem Namen entsprechende Aktionen ausführt. Wenn Sie etwas Code benötigen, lassen Sie wissen ... – Whirlwind

+0

Eigentlich ist die Antwort, die von rakeshbs in diesem Link gepostet wird, wie Sie es tun sollten. Sie müssen also Schaltflächen erstellen, benennen, in die Matrix einfügen (wenn Sie möchten) und den von ihm geposteten Code verwenden. – Whirlwind

Antwort

8

Was Sie versuchen zu tun (auch wenn ich keinen Grund dafür sehe), kann unter Verwendung delegation Muster durchgeführt werden. Im Grunde werden Sie Ihrem Delegierten (der Szene oder was auch immer Sie als Delegierter einstellen) sagen, dass Sie etwas für Sie tun sollen, und Sie werden das direkt innerhalb der touchesBegan Methode der Schaltfläche tun. Außerdem geben Sie den Namen der Schaltfläche an eine Szene weiter.

Um dies zu ermöglichen, müssen Sie zuerst ein Protokoll namens ButtonDelegate definieren. Das Protokoll definiert eine Anforderung, die besagt, dass jede konforme Klasse ein Verfahren printButtonsName(_:) genannt zu implementieren hat:

protocol ButtonDelegate:class { 

    func printButtonsName(name:String?) 
} 

die Methode Dies ist die in Ihrer GameScene Klasse implementiert wird, sondern von innen Schaltfläche touchesBegan genannt. Außerdem wird diese Methode verwendet, um den Namen einer Schaltfläche an ihren Delegaten (Szene) zu übergeben, damit Sie immer wissen, welche Schaltfläche angetippt wird.

Das nächste, was ist Schaltfläche Klasse selbst. Button könnte wie folgt aussehen:

class Button : SKSpriteNode{ 

    weak var delegate:ButtonDelegate? 

    init(name:String){ 
     super.init(texture: nil, color: .purpleColor(), size: CGSize(width: 50, height: 50)) 
     self.name = name 
     self.userInteractionEnabled = true 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 


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

     delegate?.printButtonsName(self.name) 
    } 
} 

Das Wichtigste hier ist userInteractionEnabled = true, was bedeutet, dass Taste berührt akzeptieren. Eine andere wichtige Sache ist eine delegate Eigenschaft. Wie bereits erwähnt, wird bei Buttons die Szene als ihr Delegierter festgelegt. Das Einstellen einer Szene als Delegat von Schaltflächen wird später ausgeführt, wenn wir einige Schaltflächen erstellen ... Um dies für Sie einfacher zu machen, denken Sie an einen Delegierten als Arbeiter, der für seinen Chef arbeitet :) Der Chef (ein Knopf) sagt seinem Arbeiter (eine Szene), um etwas für ihn zu tun (um seinen Namen auszudrucken).

Okay, also stellen Sie sicher, dass die Szene mit einem ButtonDelegate Protokoll übereinstimmt ... Warum ist das wichtig?Es ist wichtig, weil der Arbeiter (Szene) den Anweisungen seines Chefs folgen muss (ein Knopf). Durch dieses Protokoll entspricht, wird der Arbeiter einen Vertrag mit seinem Chef zu machen, wo bestätigt wird, dass er weiß, wie seine Arbeit zu tun und wird seine Befehle folgen :)

class GameScene: SKScene, ButtonDelegate { 


    override func didMoveToView(view: SKView) { 

     let play = Button(name:"play") 
     play.delegate = self 
     let stop = Button(name:"stop") 
     stop.delegate = self 

     play.position = CGPoint(x: frame.midX - 50.0, y: frame.midY) 
     stop.position = CGPoint(x: frame.midX + 50.0, y: frame.midY) 

     addChild(play) 
     addChild(stop) 
    } 

    func printButtonsName(name: String?) { 

     if let buttonName = name { 
      print("Pressed button : \(buttonName) ") 
     } 

     //Use switch here to take appropriate actions based on button's name (if you like) 
    } 
} 

Und das ist es. Wenn Sie auf die Wiedergabetaste tippen, wird die touchesBegan auf einer Schaltfläche selbst aufgerufen, dann wird der Delegat aufgefordert, seinen Namen mit der in der Szenenklasse definierten Methode auszudrucken.

+0

WOW !!! Vielen Dank! Du hast keine Ahnung, wie sehr ich deine Hilfe schätze! Du bist unglaublich! Vielen Dank! : D – AnaMM

+0

Warum muss eine Funktion im Delegaten aufgerufen werden? Warum kann der Knopf nicht die erforderliche Aktivität selbst ausführen, in dem Moment, als er feststellte, dass er berührt wurde? – Confused

+0

@confused Nun, Sie können, aber es hängt wirklich davon ab, was passieren soll, wenn die Taste gedrückt wird. Vielleicht möchten Sie einen Knoten zu einer Szene hinzufügen/entfernen oder einen Übergang durchführen. Oder entfernen Sie den Knoten aus einer Szene. In diesen Situationen wäre delegate nützlich. Sie können jedoch Blöcke verwenden und einen Codeblock an eine Schaltflächeninstanz übergeben, aber ich mag diese Art der Delegierung von Verantwortung. Du hast nicht wirklich definiert, was du genau damit meinst * wie * Button sollte "Aktivität selbst machen", also kann ich mehr als das nicht wirklich kommentieren. – Whirlwind

0

Zuerst müssen Sie einen anderen Weg, um das Sprite zu erstellen, hier sind ein Weg:

let spriteA = SKSpriteNode(imageNamed: "a") 
scene.addChild(spriteA) 
let spriteB = SKSPriteNode(imageNamed: "b") 
scene.addChild(spriteB) 
...and so on... 

Jetzt braucht man einen Namen für das Sprite setzen, damit wir wissen, welche Knoten später abgegriffen wird. dies einen Namen für ein Sprite fügen Sie einfach tun:

spriteNode.name = "name of the sprite" 

Setzen Sie diesen Code in dem obigen Beispiel so etwas wie folgt aussehen:

let spriteA = SKSpriteNode(imageNamed: "a") 
spriteA.name = "a" 
scene.addChild(spriteA) 
let spriteB = SKSPriteNode(imageNamed: "b") 
spriteB.name = "b" 
scene.addChild(spriteB) 
...and so on... 

zu erkennen, berührt diese setzen in Ihre SKScene Unterklasse:

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    let touch = touches.first as UITouch! 
    let touchLocation = touch.locationInNode(self) 
    let targetNode = nodeAtPoint(touchLocation) as! SKSpriteNode 
} 

Der targetNode ist der Knoten, den Sie angetippt haben. Wenn Sie den Namen des Sprites erhalten möchten, können Sie targetNode.name verwenden.

Verwandte Themen