2016-10-01 49 views
2

想象一下,遊戲世界無非是一個SKTileMapNode,屏幕上有10x10個圖塊。SKTileMapNode:檢測到感動瓷磚?

用戶觸摸一個圖塊。

SKTileMapNode提供了一種方法來知道哪個瓷磚被觸摸過?或者是否需要進行座標狩獵來確定觸摸位置中的哪個圖塊?

或者還有其他方式應該這樣做嗎?

回答

4

使用UITapGestureRecognizer您可以使用SKTileMapNode中的tileDefinition函數來檢索觸摸的圖塊。

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

然後,如果您在TilemapEditor中添加了userData,則可以檢索到該數據。價值觀用戶數據,包括可能通過成本瓷磚移動等

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

使用識別器的是,點擊,平移和長按可以在不同的功能處理乾淨不互相干擾的優點。您在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以這種方式可用,所以用戶可以圍繞比屏幕更大的tilemap平移,而不必處理touchesBegun,touchesMoved等? – Confused

+0

我對手勢識別器一無所知。在這裏閱讀,似乎他們可以附加/寫入任何視圖。 https://developer.apple.com/library/content/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/GestureRecognizer_basics/GestureRecognizer_basics.html ....是一個SKView是SpriteKit的UIView的唯一的子類,是那裏必須按順序被系統調用? – Confused