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.
Hallo! 0.0 @rakeshbs – AnaMM
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
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