我有联系代表来检查玩家何时遇到障碍物。当此玩家击中障碍物时,障碍物的位置将保存到要使用的变量
var movement : Movement
var collision : Int = 0
init(_ movement : Movement){
self.movement = movement
}
// Body B is the collision giver
// Body A is the contacted node
func didBegin(_ contact: SKPhysicsContact) {
collision += 1
let categories : (taker: UInt32, giver : UInt32) = (contact.bodyB.categoryBitMask, contact.bodyA.categoryBitMask)
if categories.giver == Category.Player && categories.taker == Category.Barrier {
movement.setBack.isOn = true
movement.setBack.barrierPosition = (contact.bodyB.node?.position)!
}
print("Barrier position x")
print(contact.bodyB.node?.position.x)
print("Collision number")
print(collision)
}
然而,问题是我注意到contact.bodyB.node?.position给了我一个不同的值,即使屏障没有移动。由于每次的位置都不同,所以它会抛弃所有其他类。我怎样才能确保每次都能得到准确的值?
修改
添加了一些调试消息:
print("Barrier position x")
print(contact.bodyB.node?.position.x)
print("Collision number")
print(collision)
他们打印出来:
Barrier position x
Optional(156.24853515625)
Collision number
1
然后我再次碰撞
Barrier position x
Optional(151.248504638672)
Collision number
2
答案 0 :(得分:0)
尝试重新排列代码,如下所示:
func didBegin(_ contact: SKPhysicsContact) {
let collision = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask
switch collision {
case Category.Player | Category.Barrier:
if case contact.bodyA.node?.categoryBitMask = Category.Barrier {
movement.setBack.isOn = true
movement.setBack.barrierPosition = (contact.bodyA.node?.position)!
} else {
movement.setBack.isOn = true
movement.setBack.barrierPosition = (contact.bodyB.node?.position)!
}
default:
return
}
}
答案 1 :(得分:0)
嗯,这应该是正确的,因为didBegin
,因此您的内部检查可以被多次调用。想象一下你的球员击中障碍物,障碍物被触及多个点,这是正常的。
如果您只需要保存第一个位置,则可以处理Bool
类似的东西:
var barrierTouched: Bool = false
func didBegin(_ contact: SKPhysicsContact) {
let categories : (taker: UInt32, giver : UInt32) = (contact.bodyB.categoryBitMask, contact.bodyA.categoryBitMask)
if categories.giver == Category.Player && categories.taker == Category.Barrier {
if !barrierTouched {
movement.setBack.isOn = true
movement.setBack.barrierPosition = (contact.bodyB.node?.position)!
barrierTouched = true
}
}
}