Заставить SKFieldNode влиять на SKSpriteNode, когда скорость спрайта задается явно?

У меня есть сцена SpriteKit с SKFieldNode.linearGravityField(withVector:)и SKSpriteNodeу которого есть physicsBody. Пользователь перемещает спрайт пальцем.

Я перемещаю спрайт, явно устанавливая его update(_:), что вызывает проблему: поле не влияет на спрайт, когда палец пользователя касается экрана, потому что мой код переопределяет его. Когда палец пользователя не касается экрана, поле работает как надо.

Вот как я устанавливаю спрайт velocity:

      override func update(_ currentTime: TimeInterval) {
    //NOTE: intensityX and intensityY are based on how far the user has dragged their finger, and are set in touchMoved().

    if intensityX != 0.0 {
        mainCharacter?.physicsBody?.velocity.dx = intensityX
    }
    if intensityY != 0.0 {
        mainCharacter?.physicsBody?.velocity.dy = intensityY
    }
}

И вот как я создаю поле:

      let field = SKFieldNode.linearGravityField(withVector: vector_float3(-9.0,0,0))

field.region = SKRegion(size: CGSize(width: screenWidth, height: screenHeight*0.1))
        
field.position = CGPoint(x: screenWidth, y: screenHeight*0.2)
        
addChild(field)

Вопрос: Как мне сделать так, чтобы поле влияло на спрайт, даже когда спрайт перемещается пользователем?

Спасибо!

1 ответ

Решение этой проблемы состоит в том, чтобы приложить некоторую силу к спрайту. physicsBodyвместо того, чтобы явно задавать его скорость. Явное задание его скорости отменяет физику поля, что нехорошо.

В update(_:), я сейчас использую applyForce(_:).

      mainCharacter?.physicsBody?.applyForce(CGVector(dx: someForceX, dy: 0.0))

Это позволяет пользователю перемещать спрайт, все еще испытывая эффекты поля.

Другие вопросы по тегам