【发布时间】:2016-10-30 18:50:59
【问题描述】:
我正在测试 SpriteKit 的功能,但遇到了问题。我正在阅读位掩码、碰撞、类别和联系。我知道它们是什么,至少,我不明白类别位掩码的意义,但是我得到了冲突位掩码,这是我解决问题所需要的。
好的,所以我的问题是我有两种不同类型的精灵:object 和 second。 名称并没有多大意义,但这只是为了的测试。我想让第二个有冲动,我想让对象有一种力量。我能够在精灵上应用各自的向量,但我不希望它们相互碰撞。我希望他们直接通过,忽略彼此的存在。
我试图通过相互分配不同的冲突位掩码来解决这个问题:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
let texture = SKTexture(imageNamed: "pokeball")
let object = SKSpriteNode(texture: texture)
object.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: object.size.width,height: object.size.height))
object.physicsBody?.affectedByGravity = false
object.yScale = 0.5
object.xScale = 0.5
for t in touches {
object.position = t.location(in: self)
}
self.addChild(object)
object.physicsBody?.collisionBitMask = UInt32(4)
object.physicsBody?.applyForce(CGVector(dx: 0, dy: 10))
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
let texture = SKTexture(imageNamed: "purple")
let second = SKSpriteNode(texture: texture)
let impulse : Double = 20
let x = (impulse * Double(cosf(45)))
let y = Double(impulse * Double(sinf(45)))
let vector = CGVector(dx: x, dy: y)
second.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: second.size.width,height: second.size.height))
second.yScale = 1.5
second.xScale = 1.5
second.physicsBody?.isDynamic = true
for t in touches {
second.position = t.location(in: self)
}
self.addChild(second)
second.physicsBody?.collisionBitMask = UInt32(1)
second.physicsBody?.applyImpulse(vector)
}
所以对象的位掩码为 4:
object.physicsBody?.collisionBitMask = UInt32(4)
第二个位掩码为 1:
second.physicsBody?.collisionBitMask = UInt32(1)
我运行了模拟器,但它们仍然相互碰撞,所以我上网并试图寻找一些答案:我找到了一个说我必须使用如下数字的答案:
这些是位掩码,你不能使用任意数字 1,2,3,4,5 - 你必须使用 1,2,4,8,16 等等 -
有人可以解释为什么吗?但是,这不是问题,因为我使用的是 1 和 4
我遇到的下一个问题说我必须使用二进制数(0100)和(0010),我试过了,同样的问题:仍然碰撞。
我会留下碰撞的照片: Collisions
有人知道为什么会这样吗?如果这是一个非常愚蠢的错误或已经问过的问题,我提前道歉,我只是找不到它。
【问题讨论】:
-
看看这个:stackoverflow.com/a/39064710/3402095 寻找类别位掩码的默认值。那里都有解释。
-
指定一个物理体的碰撞位掩码为 4 只是意味着它与 categoryBitMask 为 4 的物理体发生碰撞(实际上是设置了 '4' 位,但让我们从最简单的开始例子)。如果您还没有看到任何 categoryBitMasks,那么事情就不会起作用。
标签: swift sprite-kit