Реализация тач в игре

Я использую Swift 3 с Xcode 8 и пытаюсь сделать простую игру с помощью SpritKit. В основном то, что я пытаюсь сделать, это позволить игроку перемещать мой спрайт только влево и вправо (перетаскивать его на экран) и после того, как палец понял (прикосновение закончилось), применить импульс к спрайту. Мне удалось это сделать, НО я хочу, чтобы это происходило только при первом касании, поэтому после применения импульса к спрайту игрок больше не может взаимодействовать со спрайтом, пока не произойдет какое-либо столкновение или подобное. Ниже мой код, который работает все время, а не только при первом касании.

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {



}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    for t in touches {

        let location = t.location(in: self)

        if player.contains(location)
        {
            player.position.x = location.x
        }
    }
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    for t in touches {

        if let t = touches.first {

            player.physicsBody?.isDynamic = true
            player.physicsBody?.applyImpulse(CGVector(dx: 0, dy: 50))
        }
    }
}

person Jakša Tomović    schedule 22.10.2016    source источник
comment
Единственное, что вам нужно, это логическая переменная либо в сцене, либо в каком-то вашем пользовательском классе, которая будет отслеживать, разрешено ли взаимодействие. Итак, после того, как вы примените импульс, вы установите логическое значение в false, а позже в didBegin(contact:) вы соответствующим образом измените это логическое значение.   -  person Whirlwind    schedule 22.10.2016
comment
Я мог бы добавить переменный импульс, установленный на единицу по умолчанию, и позволить пользователю взаимодействовать со спрайтом, только если переменный импульс равен > 0. После применения импульса установите импульс на ноль, пока не произойдет контакт.   -  person Jakša Tomović    schedule 22.10.2016
comment
Просто используйте true и false. Я имею в виду, что 1 и 0 будут работать, но в этом нет необходимости. Или, может быть, вы можете использовать некоторые свойства physicsBody, чтобы определить, разрешено ли взаимодействие. Это действительно зависит от того, как работает ваша игра и что вам больше подходит. Но суть в том, что это простая задача, и ее можно выполнить разными способами.   -  person Whirlwind    schedule 22.10.2016


Ответы (1)


Как прокомментировал Whirlwind, вам просто нужно логическое значение, чтобы определить, когда вы должны управлять объектом:

/// Indicates when the object can be moved by touch
var canInteract = true

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    for t in touches {
        let location = t.location(in: self)
        if player.contains(location) && canInteract
        {
            player.position.x = location.x
        }
    }
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    for t in touches {

        if let t = touches.first && canInteract {
            canInteract = false //Now we cant't interact anymore.
            player.physicsBody?.isDynamic = true
            player.physicsBody?.applyImpulse(CGVector(dx: 0, dy: 50))
        }
    }
}
/* Call this when you want to be able to control it again, on didBeginContact
   after some collision, etc... */
func activateInteractivity(){
    canInteract = true
    // Set anything else you want, like position and physicsBody properties
}
person Pietro Pepe    schedule 23.10.2016