swift - Wie erkenne ich, welcher SKSpriteNode berührt wurde?




matrix sprite-kit (2)

Was Sie versuchen (auch wenn ich keinen Grund dafür sehe), können Sie mithilfe eines delegation . Grundsätzlich werden Sie Ihren Delegierten (die Szene oder was auch immer Sie als Delegierten festlegen) touchesBegan , etwas für Sie zu tun, und Sie werden dies direkt über die touchesBegan Methode der Schaltfläche touchesBegan . Außerdem übergeben Sie den Namen der Schaltfläche an eine Szene.

Dazu müssen Sie zunächst ein Protokoll mit dem Namen ButtonDelegate . Dieses Protokoll definiert eine Anforderung, die besagt, dass jede konforme Klasse eine Methode namens printButtonsName(_:) implementieren muss:

protocol ButtonDelegate:class {

   func printButtonsName(name:String?)
}

Dies ist die Methode, die in Ihrer GameScene Klasse implementiert wird, aber über button's touchesBegan . Diese Methode wird auch verwendet, um den Namen einer Schaltfläche an ihren Stellvertreter (Szene) zu übergeben, sodass Sie immer wissen, welche Schaltfläche getippt ist.

Das nächste ist die Button-Klasse. Button könnte so 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)
    }  
}

Wichtig ist hier userInteractionEnabled = true , was bedeutet, dass die Schaltfläche Berührungen akzeptiert. Ein weiteres wichtiges Element ist eine delegate Eigenschaft. Wie bereits erwähnt, wird bei Schaltflächen die Szene als Delegat festgelegt. Das Festlegen einer Szene als Schaltflächendelegierter erfolgt später, wenn wir einige Schaltflächen erstellen ... Um dies für Sie zu vereinfachen, stellen Sie sich einen Delegierten als einen Arbeiter vor, der für seinen Chef arbeitet :) Der Chef (eine Schaltfläche) teilt seinem Arbeiter mit ( eine Szene), um etwas für ihn zu tun (um seinen Namen zu drucken).

ButtonDelegate also sicher, dass die Szene einem ButtonDelegate Protokoll entspricht ... Warum ist das wichtig? Dies ist wichtig, da der Arbeiter (die Szene) die Anweisungen seines Chefs (eine Schaltfläche) befolgen muss. Durch die Einhaltung dieses Protokolls schließt der Arbeiter einen Vertrag mit seinem Chef, in dem er bestätigt, dass er weiß, wie er seine Arbeit macht und seine Anweisungen befolgen wird :)

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 der touchesBegan auf einer Taste selbst aufgerufen, und die Taste weist den Delegierten an, seinen Namen mit der in der touchesBegan definierten Methode zu drucken.

Ich finde eine ähnliche Frage , aber ich versuche zu erkennen und zu identifizieren, welches Sprite der Benutzer berührt, und ich weiß nicht, wie das geht. Das ist meine Variable:

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

Die Idee ist, den SpriteNode zu identifizieren und ihn dann durch einen anderen zu ersetzen oder die Farbe zu ändern, aber ich weiß nicht, wie ich das mit dieser Matrix von SpriteNodes machen soll. Ich denke, der erste Schritt ist, den Sprite zu identifizieren.


Zunächst benötigen Sie einen anderen Weg, um das Sprite zu erstellen. Hier ist ein Weg:

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

Jetzt müssen wir einen Namen für das Sprite festlegen, damit wir später wissen, welcher Knoten angetippt wird. So fügen Sie einen Namen für ein Sprite hinzu:

spriteNode.name = "name of the sprite"

Das Einfügen dieses Codes in das obige Beispiel sieht ungefähr so ​​aus:

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...

Um Berührungen zu erkennen, fügen Sie diese in Ihre SKScene-Unterklasse ein:

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 targetNode .

Wenn Sie den Namen des Sprites erhalten targetNode.name können Sie targetNode.name .







skspritenode