当精灵的速度被明确设置时,让 SKFieldNode 影响 SKSpriteNode?

Make an SKFieldNode affect an SKSpriteNode when the sprite's velocity is being explicitly set?

我有一个带有 SKFieldNode.linearGravityField(withVector:) 的 SpriteKit 场景和一个带有 physicsBodySKSpriteNode。用户用手指移动精灵。

我通过在 update(_:) 中显式设置它的 velocity 来移动精灵,这会导致一个问题:当用户的手指触摸屏幕时,该字段不会影响精灵,因为我的代码覆盖它。当用户的手指没有触摸屏幕时,该字段会按预期工作。

我是这样设置精灵的 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)

问题:我怎样才能让它即使在用户移动精灵时场也会影响精灵?

谢谢!

这个问题的答案是对精灵 physicsBody 施加一些力,而不是明确设置它的速度。明确设置其速度会覆盖场的物理特性,这并不好。

update(_:) 中,我现在使用 applyForce(_:)

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

这允许用户移动 sprite,同时仍然体验场的效果。