2017-02-05 6 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 дает мне другое значение, хотя барьер не двигался. Поскольку позиция различна каждый раз, тогда она отбрасывает все остальные классы. Как я могу удостовериться, что получаю точное значение каждый раз?

EDIT

Добавлено некоторые отладочные сообщения:

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 (_ контакт: SKPhysicsContact), вы можете вызвать функцию положения барьера следующим образом: movement.setBack.barrierPosition = (барьерNode 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

 Смежные вопросы

  • Нет связанных вопросов^_^