2016-11-24 12 views
3

Так вот у меня есть этот кодКак сделать заявление работы только для выбранного уровня в Sprite Kit

if collision == PhysicsCategory.Cat | PhysicsCategory.Bed { 
      print("SUCCESS") 
      win() 
      if currentLevel < 10 { 
       currentLevel += 1 
      } 

И в основном это утверждение работает для каждого уровня, что у меня есть. Я хочу, чтобы это сделать, как это только один уровень

if collision == PhysicsCategory.Cat | PhysicsCategory.Bed| PhysicsCategory.Bottle { 
      print("SUCCESS") 
      win() 
      if currentLevel < 10 { 
       currentLevel += 1 
      } 

Но если я буду использовать его, это будет означать, что столкновение с бутылкой будет необходимо в каждом отдельном уровне, однако я хочу использовать его только в одном уровень

я пользуюсь быстрым

спасибо!

ДЛЯ @Mundi

Вот код в GameScene

import SpriteKit 
Game scene 
protocol EventListenerNode { 
    func didMoveToScene() 
} 
protocol InteractiveNode { 
    func interact() 
} 

struct PhysicsCategory { 
    static let None: UInt32 = 0 
    static let Cat: UInt32 = 0b1 // 1 
    static let Block: UInt32 = 0b10 // 2 
    static let Bed: UInt32 = 0b100 // 4 
    static let Edge: UInt32 = 0b1000 // 8 
    static let Label: UInt32 = 0b10000 // 16 
    static let Spring:UInt32 = 0b100000 //32 
    static let Hook: UInt32 = 0b1000000 //64 
    static let Bottle: UInt32 = 0b10000000 //64 

} 

class GameScene: SKScene, SKPhysicsContactDelegate { 

    var bedNode: BedNode! 
    var catNode: CatNode! 
    var lineNode: LineNode! 
    var bottleNode: BottleNode! 
    var desiredCollision = PhysicsCategory.Cat | PhysicsCategory.Bed 


    var playable = true 

    override func didMove(to view: SKView) { 
     // Calculate playable margin 
     let maxAspectRatio: CGFloat = 16.0/9.0 
     let maxAspectRatioHeight = size.width/maxAspectRatio 
     let playableMargin: CGFloat = (size.height - maxAspectRatioHeight)/2 
     let playableRect = CGRect(x: 0, y: playableMargin, 
            width: size.width, height: size.height-playableMargin*2) 
     physicsBody = SKPhysicsBody(edgeLoopFrom: playableRect) 
     physicsWorld.contactDelegate = self 
     physicsBody!.categoryBitMask = PhysicsCategory.Edge 

     enumerateChildNodes(withName: "//*", using: { node, _ in 
      if let eventListenerNode = node as? EventListenerNode { 
       eventListenerNode.didMoveToScene() 


      } 

     }) 

     bedNode = childNode(withName: "bed") as! BedNode 
     catNode = childNode(withName: "//cat_body") as! CatNode 
     bottleNode = childNode(withName: "bottle") as! BottleNode 




    func didBegin(_ contact: SKPhysicsContact) { 
     let collision = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask 

     if collision == PhysicsCategory.Label | PhysicsCategory.Edge { 

      let labelNode = contact.bodyA.categoryBitMask == PhysicsCategory.Label ? 
       contact.bodyA.node : 
       contact.bodyB.node 

      if let message = labelNode as? MessageNode { 
       message.didBounce() 
      } 
     } 

     if !playable { 
      return 
     } 


     if currentLevel == 20 { // or whatever level you want 
      desiredCollision |= PhysicsCategory.Bottle 

     } 

     if collision == desiredCollision { 
      print ("Win") 
      win() 


     } else if collision == PhysicsCategory.Cat | PhysicsCategory.Edge { 
      print("FAIL") 
      lose() 

и вот код из моего BottleBode

импорт SpriteKit

class BottleNode: SKSpriteNode, EventListenerNode { 
    func didMoveToScene() { 
     print("bottle added to scene") 

     let bedBodySize = CGSize(width: 40.0, height: 30.0) 
     physicsBody = SKPhysicsBody(rectangleOf: bedBodySize) 
     physicsBody!.isDynamic = true 

     physicsBody!.categoryBitMask = PhysicsCategory.Bottle 
     physicsBody!.collisionBitMask = PhysicsCategory.Block | PhysicsCategory.Edge | PhysicsCategory.Spring | PhysicsCategory.Spring 
     parent!.physicsBody!.contactTestBitMask = PhysicsCategory.Bed | PhysicsCategory.Edge 

    } 
} 

Я сделал, как вы сказали мне однако он все еще не работает, и когда CatNode касается земли, я теряю con и я получаю сообщение об ошибке.

Вот картина того, как он не работает https://i.stack.imgur.com/0JrMJ.png

и здесь ошибка.

https://i.stack.imgur.com/8VGRd.png

Не могли бы вы сказать мне, что случилось?

Спасибо большое

ответ

2

Возможно без специальной переменной и более сжато:

var desiredCollision = PhysicsCategory.Cat | PhysicsCategory.Bed 
if currentLevel == 7 { // or whatever level you want 
    desiredCollision |= PhysicsCategory.Bottle 
} 

if collision = desiredCollision { 
// ... 
+0

Гораздо более элегантный, чем мой ответ. Я думал, что есть лучший способ, но не мог думать об одном. – Nik

+0

@Mundi Спасибо! Где было бы лучшее место для его вставки? –

+0

Точно, где находится ваш старый код. – Mundi

2

Вы можете использовать вложенные if-то еще заявления первой проверки, если это особый уровень, а затем решить, какой вариант использовать, основываясь на результатах этого. Это будет выглядеть примерно так:

var useSpecialCollision: bool // Change this to true/false based on when the level changes 

if useSpecialCollision == true { 

    if collision == PhysicsCategory.Cat | PhysicsCategory.Bed| PhysicsCategory.Bottle { 
      print("SUCCESS") 
      win() 
      if currentLevel < 10 { 
       currentLevel += 1 
      } 
    } 

} else { 

    if collision == PhysicsCategory.Cat | PhysicsCategory.Bed { 
     print("SUCCESS") 
     win() 
     if currentLevel < 10 { 
      currentLevel += 1 
     } 
    } 

} 

Это приводит к тому, что ваши операторы if/code в другой оператор if определяют, какой код запускать. Не очень сложно ... Не опрятных либо ...

+0

Nik, Не могли бы вы Проверьте мой пост выше, я обновил его, как предложил Mundi, я Думаю, я где-то ошибся? Спасибо –

+0

@KateYashenko В чем проблема? – Nik

+0

Это не работает, я предоставил фотографии выше. Пожалуйста, проверьте это Большое вам спасибо! –