左右移动节点,而无需快速触摸

时间:2018-07-05 23:42:02

标签: swift sprite-kit skspritenode touchesmoved

我在屏幕上有一个sprite节点,玩家可以左右移动。我知道如何使用touchesMoved使其左右移动,但是,如果玩家触摸某个位置,则节点会捕捉到该位置。 例如,如果该节点位于屏幕的左侧,并且玩家触摸了屏幕的右侧,则该节点将立即移至触摸位置。我不要这种行为。我只希望节点在玩家向左或向右移动手指时移动,而不是在他们触摸某个位置时移动。以下是我当前使用的代码。没有任何代码会影响touchesBegan或touchesEnded函数中的playerNode x位置。

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    for touch in touches
    {
        if game.state == .game
        {
            let position = touch.location(in: playableArea)

            game.playerNode.position.x = position.x

        }
    }
}

如何阻止这种行为的发生,只有在玩家的手指向左或向右移动时才让节点移动?

1 个答案:

答案 0 :(得分:0)

我最终解决了我的问题。我知道我实际上必须相对于触摸位置移动节点,但是我不确定该怎么做。这就是我的工作方式。

首先,我创建了一个变量,该变量将等于玩家的触摸位置。此变量在touchesBegan中设置。

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
{
        if game.state == .game
        {
            let position = touch.location(in: playableArea)

            playerTouchPosition = position
        }
}

我将此变量用作触摸的起点。当玩家移动手指时,它会计算玩家相对于起点移动手指的程度。例如,如果玩家触摸X值100,然后将手指移至X值120,则可以计算出玩家将手指移了20。找到该值后,我将playerTouchPosition设置为touchesMoved。这是为了使下一个动作相对于上一个动作。然后,我将玩家节点移动手指移动的数量。

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    for touch in touches
    {
        if game.state == .game
        {
            let position = touch.location(in: playableArea)
            let newX : CGFloat!

            if position.x > playerTouchPosition.x
            {
                newX = position.x - playerTouchPosition.x
            }else
            {
                newX = -(playerTouchPosition.x - position.x)
            }

            playerTouchPosition = position

            game.playerNode.position.x = game.playerNode.position.x + newX

        }
    }
}

这阻止了玩家节点立即移动到触摸位置X值所在的位置。