2016-10-01 2 views
2

Stellen Sie sich eine Spielwelt vor, die nichts anderes ist als ein SKTileMapNode mit 10x10 Kacheln auf dem Bildschirm.SKTileMapNode: berührte Fliese erkennen?

Der Benutzer berührt eine Kachel.

Bietet SKTileMapNode eine Möglichkeit zu wissen, welche Kachel berührt wurde? Oder müssen Koordinatenjagden durchgeführt werden, um zu bestimmen, welche Fliese sich an der Stelle der Berührung befindet?

Oder gibt es eine andere Möglichkeit, dass dies getan werden sollte?

Antwort

4

Mit einem UITapGestureRecognizer können Sie die berührte Kachel mit der Funktion tileDefinition von SKTileMapNode abrufen.

func handleTapFrom(recognizer: UITapGestureRecognizer) { 
    if recognizer.state != .ended { 
        return 
    } 

    let recognizorLocation = recognizer.location(in: recognizer.view!) 
    let location = self.convertPoint(fromView: recognizorLocation) 

    guard let map = childNode(withName: "background") as? SKTileMapNode else { 
     fatalError("Background node not loaded") 
    } 

    let column = map.tileColumnIndex(fromPosition: location) 
    let row = map.tileRowIndex(fromPosition: location) 
    let tile = map.tileDefinition(atColumn: column, row: row) 
} 

Wenn Sie userData im TilemapEditor hinzugefügt haben, kann dieser abgerufen werden. Werte in Userdata enthalten kosten könnten sein durch die Fliese zu bewegen usw.

let data = tile.userData?.value(forKey: "myKey") 

Der Vorteil der Verwendung Recognizers ist, dass Tap, Pan und Langes Drücken sauber in separaten Funktionen bearbeitet werden können, die miteinander nicht stören . Sie initialisieren den Gestenerkenner in SKScene.

override func didMove(to view: SKView) { 
    let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.handleTapFrom(recognizer:))) 
    tapGestureRecognizer.numberOfTapsRequired = 1 
    view.addGestureRecognizer(tapGestureRecognizer) 
} 
+0

Ich entschuldige mich aufrichtig. Meine Dummheit ist immens. Wohin soll dieser Code gehen? – Confused

+0

Meinen Sie, Pan auf diese Weise verfügbar zu halten, damit der Benutzer eine Kachelkarte, die größer ist als der Bildschirm, schwenken kann, ohne mit Berührungen umgehen zu müssenBegun, touchesMoved usw.? – Confused

+0

Ich weiß nichts über Gestenerkenner. Lesen Sie hier, es scheint, dass sie in jeder Ansicht angebracht/geschrieben werden können. https://developer.apple.com/library/content/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/GestureRecognizer_basics/GestureRecognizer_basics.html .... ist, dass ein SKView SpriteKit einzige Unterklasse von UIView ist, ist das, wo dies in Reihenfolge gehen muss vom System angerufen werden? – Confused

Verwandte Themen