我可以让物理机构碰撞而不互相推动吗?

时间:2016-06-21 03:45:20

标签: ios swift sprite-kit skphysicsbody

我有一个由小SKNodes组成的游戏。它们不能重叠,所以我使用物理体,使它们相互移动。但是,如果一个sknode被动画化以跟随另一个,它会向前推动sknode。将碰撞位掩码设置为0会使它们重叠,因此这不是一个选项。但除此之外,他们互相推动超出我想要的速度。我需要一种方法来摆脱“推动”而不会使用形而上学的身体重叠。我可以设置一个属性来解决这个问题吗?

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

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

4 个答案:

答案 0 :(得分:0)

您是否尝试在被推送的主体上将动态属性设置为false?

答案 1 :(得分:0)

设置contactTestBitMask后,您可以设置:

myHero.physicsBody!.collisionBitMask = 0

防止碰撞但允许接触。

答案 2 :(得分: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. 设置&#34;动态&#34;每个物理机构的财产都是假的。
  2. 如果重叠,请检入didBeginContact(SKPhysicsContactDelegate协议)。如果它是真的,则删除所有改变其立场的行动。提示 - 使物理体比它的节点大一点。

答案 3 :(得分:0)

当发生接触时,将移动物体的物理体上的恢复原状更改为0,并设置您不想移动的物体的重量非常高