画面上に 10x10 のタイルがある SKTileMapNode に他ならないゲームの世界を想像してみてください。
ユーザーがタイルに触れます。
SKTileMapNode は、どのタイルがタッチされたかを知る方法を提供しますか? または、どのタイルがタッチされた位置にあるかを判断するために座標ハントを行う必要がありますか?
または、これを行う必要がある他の方法はありますか?
画面上に 10x10 のタイルがある SKTileMapNode に他ならないゲームの世界を想像してみてください。
ユーザーがタイルに触れます。
SKTileMapNode は、どのタイルがタッチされたかを知る方法を提供しますか? または、どのタイルがタッチされた位置にあるかを判断するために座標ハントを行う必要がありますか?
または、これを行う必要がある他の方法はありますか?
を使用すると、 の関数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)
}
次に、TilemapEditor に userData を追加した場合、これを取得できます。userData に含める値は、タイルなどを移動するのにコストがかかる場合があります。
let data = tile.userData?.value(forKey: "myKey")
Recognizer を使用する利点は、タップ、パン、および長押しを、互いに干渉しない別々の機能できれいに処理できることです。でジェスチャ認識機能を初期化しSKScene
ます。
override func didMove(to view: SKView) {
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.handleTapFrom(recognizer:)))
tapGestureRecognizer.numberOfTapsRequired = 1
view.addGestureRecognizer(tapGestureRecognizer)
}