UITapGesture和TouchesBegan正在视图中生成不同的位置

时间:2017-08-06 15:52:44

标签: swift sprite-kit uitapgesturerecognizer gamekit touchesbegan

我正在使用 SKTileMaps CameraNode 以及 GameplayKit SpriteKit

我想要使用的代码错误地在“视图”中找到位置

func handleTapFrom(_ sender: UITapGestureRecognizer)
{
    let location = sender.location(in: self.view)
    if (map.contains(location))
    {
        let tRow = map.tileRowIndex(fromPosition: location)
        let tColumn = map.tileColumnIndex(fromPosition: location)
        let movePosition = map.centerOfTile(atColumn: tColumn, row: tRow)
        let moveAction = SKAction.move(to: movePosition, duration:1.0)
        cam.run(moveAction)
    }

}    

正常工作的代码是在self(而非self.view)中查找位置,这是正确的

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) 
{
    let firstTouch = touches.first?.location(in: self)
    if (map.contains(firstTouch!))
    {
        let tRow = map.tileRowIndex(fromPosition: firstTouch!)
        let tColumn = map.tileColumnIndex(fromPosition: firstTouch!)
        let movePosition = map.centerOfTile(atColumn: tColumn, row: tRow)
        let moveAction = SKAction.move(to: movePosition, duration:1.0)
        cam.run(moveAction)
    }
}

基于位置的列和行是正确的,我遇到的问题是即使触摸位于同一位置,两个函数之间的位置(xfloat,yfloat)也不同

这两段代码都在GameScene类中,但我无法弄清楚为什么它们有不同的位置?以及如何修复点击手势,使其找到的位置与touchesBegan中的位置相同。

很抱歉,如果这令人困惑或无法理解。我很高兴有机会澄清。

1 个答案:

答案 0 :(得分:0)

handleTapFrom功能中,该位置应来自convertPoint

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

    let location = sender.location(in: sender.view!)
    let targetLocation = self.convertPoint(fromView: location)

    if map.contains(targetLocation) {
        // Your code here
    }
}