2016-01-04 2 views
0

Я пытаюсь разработать игру как полноценный новичок. Я настраиваю игровую сцену, которая корректно ссылается на объект, называемый таксоном и BlockNode.Невозможно обратиться к объекту за пределами моего класса

Теперь я хочу сделать что-то интерактивным и хочу добавить импульс на таксиNode при нажатии BlockNode. Для этого я настроил func interactive() в моем классе BlockNode, но я не могу получить доступ к моему TaxiNode.

Вот мой код для BlockNode класса

import SpriteKit 

class BlockNode: SKSpriteNode, CustomNodeEvents, InteractiveNode { 

    func didMoveToScene() { 
     print("block added") 
     userInteractionEnabled = true 

    } 

    func interact() { 
     taxiNode.physicsBody!.applyForce(CGVectorMake(0, 400)) 

    } 

    override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     super.touchesEnded(touches, withEvent: event) 
     print("destroy block") 
     //interact() 


    } 

} 

Мой GameScene класса выглядит следующим образом

import SpriteKit 

struct PhysicsCategory { 
    static let None: UInt32 = 0 
    static let Taxi: UInt32 = 0b1 // 1 
    static let Block: UInt32 = 0b10 // 2 
    static let Edge: 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 */ 
} 

protocol CustomNodeEvents { 
    func didMoveToScene() 
} 

protocol InteractiveNode { 
    func interact() 
} 


    class GameScene: SKScene, SKPhysicsContactDelegate { 

    var taxiNode: TaxiNode! 

    override func didMoveToView(view: SKView) { 
     /* Setup your scene here */ 

     // Calculate playable margin 
     let maxAspectRatio: CGFloat = 16.0/9.0 // iPhone 5 
     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(edgeLoopFromRect: playableRect) 
     physicsWorld.contactDelegate = self 
     physicsBody!.categoryBitMask = PhysicsCategory.Edge 

     enumerateChildNodesWithName("//*", usingBlock: {node, _ in 
      if let customNode = node as? CustomNodeEvents { 
       customNode.didMoveToScene() 
      } 
     }) 

     taxiNode = childNodeWithName("taxi") as! TaxiNode 

    } 

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 

    } 

    override func update(currentTime: CFTimeInterval) { 
     /* Called before each frame is rendered */ 
    } 
} 

И я получаю следующее сообщение об ошибке в моем BlockNode Class

«Использование неразрешенной идентификатор «taxiNode»

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

ответ

1

Просмотрите область действия переменных, чтобы узнать больше.

Ваш узел блока не знает, что такое узел такси, и не должен.

Что вам нужно сделать, это дать вашему блоку знать, что такое такси.

Чтобы сделать это, вы должны передать его в:

Сначала установить функцию правильно:

func interact(taxiNode : TaxiNode) { 
    taxiNode.physicsBody!.applyForce(CGVectorMake(0, 400)) 

} 

Затем, когда вы должны взаимодействовать:

blockNode.interact(taxiNode) 

Убедитесь, что вы исправить ваш протокол, чтобы справиться с этим.

protocol InteractiveNode { 
    func interact(taxiNode:TaxiNode) 
} 
+0

Нужно ли ему создавать протокол в этом случае? – Akaino

+0

уверен, почему бы и нет, интерактивные узлы могут взаимодействовать по-разному – Knight0fDragon

+0

Да, правильно. Я был просто curiuos, если он является обязательным в этом конкретном случае, который я предполагаю ist нет. Спасибо хоть! – Akaino

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