2017-02-05 29 views
0

我有一个联系人代表来检查玩家何时碰到屏障。当这个球员击打屏障,屏障的位置将被保存到使用联系人代表节点没有给出相同的位置

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

您遇到过什么样的位置差的?就像给我一个印刷位置和预期位置的例子。 – Pierce

回答

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

它没有工作,仍然有相同的问题 – Pablo

+0

你可以尝试的另一件事是做一个协议,它有一个函数返回节点的位置,然后使屏障节点符合协议,然后在didBegin( _ contact:SKPhysicsContact),你可以调用障碍的位置函数如下:move.setBack.barrierPosition =(barrierNode as!ProtocolThatReturnsPosition).returnPosition()。 – gionti

0

UMH,这应该是正确的,因为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 
     } 
    } 
} 
+0

当我运行一个调试消息时,似乎didBegin方法每次碰撞只运行一次,所以我认为干草不是问题 – Pablo

+0

因此,你是否绝对确信你每次只有一次碰撞和玩家之间的碰撞** * *发生碰撞? –

+0

是的,我添加了一些调试消息,编辑帖子。还测试了你的代码,这是同样的问题 – Pablo

相关问题