我可以让物理物体在不相互推动的情况下发生碰撞吗?

Can I have physics bodies collide without pushing each other?

我有一个由四处移动的小 SKNode 组成的游戏。它们不能重叠,所以我使用物理体,让它们相互移动。但是,在一个 sknode 被动画跟随另一个的情况下,它会将 sknode 向前推。将冲突位掩码设置为 0 会使它们重叠,因此这不是一个选项。但除此之外,它们相互推动的速度超出了我想要的速度。我需要一种方法来摆脱 'pushing' 而不会使用 skphysics 物体重叠。我可以设置 属性 来解决这个问题吗?

注意:我使用 skanimations 来移动我的节点。如果您需要任何相关代码,请告诉我...我不知道从哪里开始。我正在使用 Swift 3.0,但我会接受 2.2/2.3 语法的答案。

编辑:真正的解决方案是改变节点的速度,而不是使用 SK 动作动画移动。

您是否尝试在推送 body 时将动态 属性 设置为 false?

设置好后contactTestBitMask你可以这样设置:

myHero.physicsBody!.collisionBitMask = 0

防止碰撞但允许接触。

使用 SKAction 更新动态物理体的位置效果不佳。就像在说 - 嘿,不管物理世界的规则是什么,只要按照我的意愿移动我的节点即可。

第一个解决方案 - 使一个节点以特定距离跟随另一个节点使用 SKConstraint。

import SpriteKit

class GameScene: SKScene {
    override func didMoveToView(view: SKView) {
        let nodeA = SKSpriteNode(color: SKColor.greenColor(), size: CGSize(width: 50, height: 50))
        nodeA.name = "nodeA"
        addChild(nodeA)

        let nodeB = SKSpriteNode(color: SKColor.redColor(), size: nodeA.size)
        nodeB.name = "nodeB"
        addChild(nodeB)

        let followConstraint = SKConstraint.distance(SKRange.init(lowerLimit: nodeB.size.width * 1.5, upperLimit: nodeB.size.width * 1.5), toNode: nodeA)
        nodeB.constraints = [followConstraint]
    }

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        guard let touch = touches.first else {
            return
        }


        childNodeWithName("nodeA")!.runAction(SKAction.moveTo(touch.locationInNode(self), duration: 2))
    }
}

如果您仍然想要物理形体和 SKActions...

  1. 将每个物理体的 "dynamic" 属性 设置为 false。
  2. 如果它们重叠,请检查 didBeginContact(SKPhysicsContactDelegate 协议)。如果是,则删除所有正在改变其位置的操作。提示 - 让物理体比它的节点大一点。

当发生接触时,将移动物体对你的物理体的恢复改为0,并将你不想移动的物体的重量设置得非常高