Заставить 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))
Это позволяет пользователю перемещать спрайт, все еще испытывая эффекты поля.