播放器控制的节点忽略冲突

时间:2017-03-07 13:44:59

标签: sprite-kit skphysicsbody

我有一个由玩家控制的SKShapeNode。我想将此节点保留在父节点中。所以我创建了边缘,并使用SKPhysicsBody和碰撞位掩码来阻止我的节点移出其父节点。

当我尝试通过更新每个帧的位置来移动节点时,它只是忽略边缘。这是使用的函数:

func move(direction: MoveDirection, withTimeInterval timeInterval: TimeInterval) {

    var x, y: CGFloat

    switch direction {
    case .North:
        x = 0
        y = movementSpeed * CGFloat(timeInterval)

    case .South:
        x = 0
        y = -movementSpeed * CGFloat(timeInterval)

    case .East:
        x = movementSpeed * CGFloat(timeInterval)
        y = 0

    case .West:
        x = -movementSpeed * CGFloat(timeInterval)
        y = 0
    }

    let sprite = spriteComponent.sprite
    sprite.position = CGPoint(x: sprite.position.x + x, y: sprite.position.y + y)

}

移动效果很好,但节点可以到处去,只是不关心边缘(我打开了skView.showPhysics,所以我可以看到它们)。

但是,如果我更换了这行:

sprite.position = CGPoint(x: sprite.position.x + x, y: sprite.position.y + y)

by:

sprite.physicsBody?.applyForce(CGVector(dx: x, dy: y))

碰撞工作正常。

如果我们想让它们碰撞,我们必须使用物理移动物体。但我在Apple的文档中没有看到任何有关此限制的内容。这种行为是预期的吗?或者我错过了什么?

奖励点:

在Apple提供的TaskBot游戏中,玩家的位置是(或似乎)通过设置node.position来改变(代码有点......复杂,所以不太确定)。如果有人可以给我一个提示?

谢谢!

1 个答案:

答案 0 :(得分:1)

如果您手动移动SKSpriteNode,则不会发生冲突,因为您通过说&#34来覆盖物理引擎;将此节点放在那里无论什么"。

如果您希望物理引擎可靠地生成碰撞,那么您只需要使用物理引擎通过力或冲动来移动对象。

如果手动将节点移动到产生碰撞的位置,物理引擎将尝试将其移走,但如果继续尝试移动节点,结果将无法预测。