Переместите узел влево и вправо, не щелкая при этом, чтобы коснуться - PullRequest
0 голосов
/ 06 июля 2018

У меня есть спрайт-узел на экране, который игрок может перемещать влево и вправо. Я знаю, как заставить его двигаться влево и вправо, используя touchesMoved, однако, если игрок касается местоположения, узел привязывается к этому местоположению. Например, если узел находился на левой стороне экрана, а игрок касался правой стороны экрана, узел немедленно переместился бы в местоположение касания. Я не хочу такого поведения. Я хочу, чтобы узел двигался только тогда, когда игрок двигает пальцем влево или вправо, а не когда он касается места. Ниже приведен код, который я сейчас использую. Нет кода, который бы влиял на позицию playerNode x в функции touchesBegan или touchesEnded.

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 голосов
/ 06 июля 2018

Я решил свою проблему. Я знал, что должен был по существу переместить узел относительно местоположения касания, но я не был уверен, как это сделать. Вот как я получил это работает.

Сначала я создал переменную, которая была бы равна местоположению касания игроков. Эта переменная устанавливается в 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 местоположений касания.

...