2016-10-01 4 views
2

Представьте себе игровой мир, который является не чем иным, как SKTileMapNode с 10x10 плитками на экране.SKTileMapNode: обнаружение затронутой плитки?

Пользователь касается плитки.

Предоставляет ли SKTileMapNode способ узнать, какая плитка была затронута? Или нужно координировать охоту, чтобы определить, какая плитка находится в месте касания?

Или есть другой способ, которым это должно быть сделано?

ответ

4

Используя UITapGestureRecognizer, вы можете получить тротуарную плиту, используя функцию tileDefinition от SKTileMapNode.

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) 
} 

Затем, если вы добавили userData в TilemapEditor, это можно восстановить. Значения, которые включают в USERDATA может стоить для перемещения через плитки и т.д.

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

Преимущество использования распознавателей является то, что Tap, Pan и Длительное нажатие может осуществляться чисто в отдельных функциях, которые не мешают друг другу , Вы инициализируете распознаватель жестов в SKScene.

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

Мои искренние извинения. Моя глупость огромна. Куда должен идти этот код? – Confused

+0

Вы хотите держать Pan доступным таким образом, чтобы пользователь мог кадрировать вокруг плитки больше, чем экран без необходимости обращаться с touchhesBegun, touchhesMoved и т. Д.? – Confused

+0

Я ничего не знаю о распознавателях жестов. Читая здесь, кажется, что они могут быть прикреплены/записаны в любой вид. https://developer.apple.com/library/content/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/GestureRecognizer_basics/GestureRecognizer_basics.html .... поскольку SKView является единственным подклассом SpriteKit UIView, заключается в том, что там, где это должно идти в порядке для вызова системы? – Confused