2
想象一下,遊戲世界無非是一個SKTileMapNode,屏幕上有10x10個圖塊。SKTileMapNode:檢測到感動瓷磚?
用戶觸摸一個圖塊。
SKTileMapNode提供了一種方法來知道哪個瓷磚被觸摸過?或者是否需要進行座標狩獵來確定觸摸位置中的哪個圖塊?
或者還有其他方式應該這樣做嗎?
想象一下,遊戲世界無非是一個SKTileMapNode,屏幕上有10x10個圖塊。SKTileMapNode:檢測到感動瓷磚?
用戶觸摸一個圖塊。
SKTileMapNode提供了一種方法來知道哪個瓷磚被觸摸過?或者是否需要進行座標狩獵來確定觸摸位置中的哪個圖塊?
或者還有其他方式應該這樣做嗎?
使用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)
}
我誠摯的道歉。我的愚蠢是巨大的。代碼應該放在哪裏? – Confused
你的意思是讓Pan以這種方式可用,所以用戶可以圍繞比屏幕更大的tilemap平移,而不必處理touchesBegun,touchesMoved等? – Confused
我對手勢識別器一無所知。在這裏閱讀,似乎他們可以附加/寫入任何視圖。 https://developer.apple.com/library/content/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/GestureRecognizer_basics/GestureRecognizer_basics.html ....是一個SKView是SpriteKit的UIView的唯一的子類,是那裏必須按順序被系統調用? – Confused