【问题标题】:Player controlled node ignoring collisions玩家控制的节点忽略碰撞
【发布时间】:2017-07-27 18:12:38
【问题描述】:

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

作者:

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

碰撞工作正常。

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

加分:

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

谢谢!

【问题讨论】:

    标签: sprite-kit skphysicsbody


    【解决方案1】:

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

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

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

    【讨论】:

    • SKAction 也有同样的问题。根据一些测试,如果动作时间太短,它不会发生碰撞(我使用 update() timeInterval 作为动作持续时间)。我的问题是在 update() 中调用了 move 函数。如果我直接在 keyDown() 中调用它,碰撞工作正常。但是那里的事件,如果我设置一个高移动速度,碰撞再次开始失败。简而言之,使用物理(力、冲量等)来移动物理体
    • 实际上每个手动位置更改都会以某种方式干扰物理系统。坚持一个或另一个总是最好的选择,但这也不是一个规则。如果你应该避免同时以多种方式影响节点的位置。
    • 仅供参考,我尝试降低代码中的移动速度并且碰撞有效。我还尝试提高 Apple 的 Taskbot 游戏的速度,但出现了同样的问题。无论如何,谢谢你的提示
    • 为什么不使用联系人而不是碰撞?当玩家接触到边缘时,停止它移动。或者使用一个 SKConstraint 来限制它的位置或者在 didFinishUpdate 中限制它。
    • @Heyfara 这就是 Whirlwind 所暗示的 - 手动移动可以工作,但它并不可靠,因为您已经向自己证明了这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-01
    相关资源
    最近更新 更多