Как создать силу, которая не ускоряет объекты постоянно SpriteKit Swift

Поэтому я хочу создать силу, которая перемещает физический объект в сцене, не ускоряя его постоянно. Прямо как в геометрии тире. Поэтому, когда я использую гравитацию, это похоже на падение, но я не хочу, чтобы оно так ускорялось.

Надеюсь, вы поняли, это было немного сложно объяснить. Спасибо

2 ответа

Решение

В терминологии SKPhysicsBody это разница между force (постоянно применяется) и impulse (применяется мгновенно):

Вы можете применить силу или импульс:

  • Сила применяется в течение периода времени, основанного на количестве времени моделирования, которое проходит между моментом, когда вы применяете силу, и когда обрабатывается следующий кадр моделирования. Таким образом, чтобы применить непрерывную силу к телу, вам нужно делать соответствующие вызовы методов каждый раз, когда обрабатывается новый кадр. Силы обычно используются для непрерывного воздействия

  • Импульс мгновенно изменяет скорость тела, которая не зависит от количества времени симуляции, которое прошло. Импульсы обычно используются для немедленных изменений скорости тела.

(Из "Делания физических тел движением" из документации Apple SKPhysicsBody.)

Чтобы применить импульс к своему телу и избежать постоянного ускорения, используйте метод applyImpulse.

В вашей игровой сцене добавьте новый jump() метод, который вызывается из touchesBegan, использование touchesBegan а также touchesEnded установить bool, который отслеживает, когда вы касаетесь экрана. Вы можете использовать didBegin метод вашей сцены, чтобы отслеживать, когда игрок приземляется на землю (или сталкивается с препятствиями и т. д.).

Что-то вроде этого:

class GameScene: SKScene, SKPhysicsContactDelegate {
    var person = SKSpriteNode()
    var isJumping = Bool()
    var isTouching = Bool()

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

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        isTouching = false
    }

    func jump(){
        if isTouching == true {
            if isJumping == false {
                person.physicsBody?.applyImpulse(CGVector(dx: 0, dy: 600))
                isJumping = true
            }
        }
    }

    func didBegin(_ contact: SKPhysicsContact) {
        let bodyA = contact.bodyA.node
        let bodyB = contact.bodyB.node

        // Collided with ground
        if bodyA?.physicsBody?.categoryBitMask == 2 && bodyB?.physicsBody?.categoryBitMask == 1 {
            isJumping = false
            jump()
        }
    }
}
Другие вопросы по тегам