联系委托节点没有给出相同的位置

时间:2017-02-05 01:25:09

标签: swift sprite-kit

我有联系代表来检查玩家何时遇到障碍物。当此玩家击中障碍物时,障碍物的位置将保存到要使用的变量

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

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
        }
    }   
}