Sprite kit 玩家控制的节点忽略碰撞

Sprite kit 玩家控制的节点忽略碰撞,sprite-kit,skphysicsbody,Sprite Kit,Skphysicsbody,我有一个由玩家控制的SKShapeNode。我希望将此节点保持在父节点内。所以我创建了边,并使用SKPhysicsBody和碰撞位掩码来防止节点移动到其父节点之外 当我尝试通过更新每个帧的位置来移动节点时,它只会忽略边。下面是使用的函数: func move(direction: MoveDirection, withTimeInterval timeInterval: TimeInterval) { var x, y: CGFloat switch direction {

我有一个由玩家控制的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)
作者:

碰撞效果很好

感觉上,如果我们想让物体碰撞,就必须用物理学来移动它们。但我在苹果的文档中没有看到任何关于这一限制的内容。那么这种行为是预期的吗?还是我错过了什么

加分:

在苹果提供的TaskBot游戏中,玩家的位置(或看起来)通过设置node.position(代码有点…复杂,所以不太确定)而改变。如果有人能给我一个提示


谢谢大家!

如果手动移动SKSpriteNode,则不会发生碰撞,因为您通过说“无论如何都将此节点放在那里”来覆盖物理引擎

如果希望物理引擎可靠地生成碰撞,则只需使用物理引擎通过力或脉冲移动对象


如果您手动将一个节点移动到它产生碰撞的位置,物理引擎将尝试将其移开,但如果您继续尝试移动该节点,结果将是不可预测的。

SKAction也有同样的问题。根据一些测试,如果操作时间太短,则不会发生冲突(我使用update()timeInterval作为操作持续时间)。在我的例子中,问题是在update()中调用move函数。如果我直接在keyDown()中调用它,则碰撞可以正常工作。但在那个里,若我设定一个高的移动速度,碰撞会再次失败。简而言之,使用物理(力、脉冲等)来移动物理体。实际上,每次手动位置改变都会以某种方式干扰物理系统。坚持一个或另一个总是最好的选择,但这也不是一个规则。不过,如果您应该避免同时以多种方式影响节点的位置。仅供参考,我在代码中尝试降低movementSpeed,冲突仍然有效。我还试图提高苹果Taskbot游戏的速度,同样的问题也出现了。不管怎样,谢谢你的提示你为什么不使用接触而不是碰撞?当玩家接触边缘时,停止移动。或者使用SKConstraint限制其位置或在didFinishUpdate中限制它。@Heyfara这就是Whirlwind所指的-手动移动可以工作,但它不可靠,因为您已经向自己证明了这一点。
sprite.physicsBody?.applyForce(CGVector(dx: x, dy: y))