我有一个由小SKNodes组成的游戏。它们不能重叠,所以我使用物理体,使它们相互移动。但是,如果一个sknode被动画化以跟随另一个,它会向前推动sknode。将碰撞位掩码设置为0会使它们重叠,因此这不是一个选项。但除此之外,他们互相推动超出我想要的速度。我需要一种方法来摆脱“推动”而不会使用形而上学的身体重叠。我可以设置一个属性来解决这个问题吗?
注意:我使用skanimations来移动我的节点。如果您需要任何相关代码,请告诉我......我不知道从哪里开始。我使用的是Swift 3.0,但我会接受2.2 / 2.3语法的答案。
编辑:真正的解决方案是改变节点的速度,而不是使用SK动作动画移动。
答案 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 ......
答案 3 :(得分:0)
当发生接触时,将移动物体的物理体上的恢复原状更改为0,并设置您不想移动的物体的重量非常高