根据拖动长度/方向移动精灵

时间:2015-07-30 05:45:55

标签: ios swift sprite-kit

在我的游戏中,我在屏幕底部有一个节点,它喜欢使用触摸沿x轴移动。我希望我的节点可以根据拖动的方向向左或向右移动,也可以移动与拖动相同的距离。因此,如果用户从左向右拖动(CGPoint(x: 200, y: 500)CGPoint(x:300, y: 500)),则节点将向右移动100。这是我试过的,但它没有用。如果有人有办法解决这个问题,我真的很感激

 override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {

        let touch = touches.first as! UITouch
        let touchLocation = touch.locationInNode(self)
        firstTouch = touchLocation

 override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) {
        let touch = touches.first as! UITouch
        let touchLocation = touch.locationInNode(self)
        secondTouch = touchLocation

        if gameStarted {

            let change = secondTouch.x - firstTouch.x
            let move = SKAction.moveToX(greenGuy.position.x + change, duration: 0.1)

            greenGuy.runAction(move)     
    }
}

2 个答案:

答案 0 :(得分:1)

使用以下代码更新touchesMoved

let touch = touches.first as! UITouch
let touchLocation = touch.locationInNode(self)
secondTouch = touchLocation

if gameStarted { 
   let change = secondTouch.x - firstTouch.x
   //Update greenGuys position
   greenGuy.position = CGPoint(x: greenGuy.position.x + change, y:greenGuy.position.y)
   //Update the firstTouch
   firstTouch = secondTouch 
}

我以前评论过没有使用SKAction的原因是因为我们不知道两次touchesMoved方法调用之间会经过多长时间,所以我们不知道确切地在SKAction duration输入的时间。

答案 1 :(得分:0)

你有一个很好的开始。首先,改变:

let move = SKAction.moveToX(greenGuy.position.x + change, duration: 0.1)

为:

let move = SKAction.moveByX(greenGuy.position.x + changeInX, duration: moveDuration)

如果您想要进行二维移动,请改用SKAction moveByX:ChangeInX y:ChangeInY duration:moveDuration。现在,您还有一些基于滑动持续时间/距离的变量。您为moveDuration选择的持续时间将取决于您,它将是某个系数和滑动距离的乘积。

要获取滑动距离: 我建议你放弃触摸方法并使用UIGestureRecognizer。你需要的是UIPanGestureRecognizer。 这是一个有用的链接,详细说明了它的用法:UISwipeGestureRecognizer Swipe length。 基本上它具有在用户开始或结束滑动/拖动动作时设置的不同状态。然后,您可以在那些时刻取locationInView并计算它们之间的距离:D

希望我能帮到你。我知道touchesMoved也是一种方法,但我过去遇到了问题(不必要的滞后和不确定性),手势识别器更直观,更容易使用。