2016-08-15 6 views
0

私はSpriteKitゲームでPauseButtonクラスを構築していますが、これをアクティブにすると、GameSceneにラベルを描画します。しかし、didMoveToViewの外側(GameSceneの直前)のボタンをインスタンス化して、touchBeganメソッドからさらに「グローバルに」アクセスできるようにする必要があります。GameScene内で呼び出されたクラスに現在のGameSceneインスタンスを渡します

let pauseButton = PauseButton(theTexture: pauseButtonTexture,gameScene:GameScene) 
override func didMoveToView(view: SKView) { 

理想的には私はdidMoveToView以内にそれをインスタンス化することにより、ビューに渡すことができるだろうが、今のように私はこれを行うと、シーンの残りの部分からアクセスする方法がわかりません。それは私のボタンクラスのメソッド内からgameScene.addchild(label)のような何かを行うことができるように私は現在作業中のインスタンスGameSceneを渡す方法はありますか?私はこれに有用な何かを見つけることができなかったので、どんな助けも素晴らしいだろう!

+0

GameSceneメソッドからGameSceneを渡す場合は、「self」を使用してください。 –

+0

@phillipMills引数型は何ですか?? GameScene内で 'didMoveToView'の前に' let pauseButton = PauseButton(theTexture:pauseButtonTexture、gameScene:self) 'を呼び出すとエラー' 'NSobject - >() - > GameSceneを期待される引数型GameScene'に変換できません。 initは次のようになります: 'init(theTexture:SKTexture、gameScene:GameScene){'ありがとう! – Sam

+0

あなたはGameSceneメソッドの中でそれを呼んでいないと言っているようです。 –

答えて

1

基本的には2通りあります。

1)ちょうどこの

var pauseButton: PauseButton! 

などのようdidMoveToViewでそれをインスタンス化よりのようなプロパティを作成します。

override func didMoveToView(view: SKView) { 
    pauseButton = PauseButton(theTexture: pauseButtonTexture,gameScene: self) 
    addChild(pauseButton) 
} 

2)最初にやろうとしたことを実行できるように、遅延インスタンス化を使用します。最も単純な形で

で怠惰varがあなたも、すべて同じ場所にこのボタンの多くのプロパティを追加するので、同じようにそれを行うことができますが、1

lazy var pauseButton: PauseButton = PauseButton(theTexture: pauseButtonTexture,gameScene: self) 

override func didMoveToView(view: SKView) { 

ステップを実行せずに自己を使用することができます。

lazy var pauseButton: PauseButton = { 
     let button = PauseButton(theTexture: pauseButtonTexture,gameScene: self) 
     button.zPosition = 200 
     button.position = CGPoint(x: self.frame.midX, y: self.frame.midY) 
     button.alpha = 0.5 

     return button 
}() 

override func didMoveToView(view: SKView) { 
     addChild(pauseButton) 
} 

すべてのSKNode/SKSpriteNodeなどにはシーンプロパティがあることを覚えておいてください。あなたのボタンクラスがSKNode/SKSpriteNodeのサブクラスである場合、シーンプロパティを取得して、 "as"演算子を使用して初期化メソッドでシーンを渡さずにGameSceneへの参照を取得できます。先端として、例えば

class GameScene: SKScene { 

     lazy var pauseButton: PauseButton = PauseButton(theTexture: pauseButtonTexture,gameScene: self) 

     var someBool = false 

     override func didMoveToView(view: SKView) { 
      addChild(pauseButton) 
      pauseButton.loadPausedLabel() 
     } 

     func someMethod() { 

     }  
} 

class PauseButton: SKSpriteNode { 

     func loadPauseLabel() { 

      // Way 1, reference to current scene but not to specific class 

      guard let scene = scene else { return } 
      // Scene property is optional and is nil until button is added to a Scene so add the guard check. 


      scene.someBool = true  // NOT WORKING 
      scene.someMethod()   // NOT WORKING 

      let label = SKLabelNode(... 
      scene.addChild(label)  // WORKING 

      // Way 2, use "as" to cast to specific scene (e.g GameScene) so you can call properties/methods on it. This is the same as passing GameScene in the init method. 

      guard let gameScene = scene as? GameScene else { return } 
      // Scene property is optional and is nil until button is added to a Scene so add the guard check. 
      // The button must be added to the scene you are trying the as? cast with, in this example GameScene. 


      gameScene.someBool = true  // WORKING 
      gameScene.someMethod()   // WORKING 

      let label = SKLabelNode(... 
      gameScene.addChild(label)  // WORKING 
     } 
} 

、私はpauseButtonサブクラスで一時停止ラベルを追加しないだろう、私はシーンも自己内から、または一時停止のメニューサブクラスからそれを追加します。 また、私は各ボタンをサブクラス化しないでしょう、私はあなたのゲームのすべてのボタンのために使用することができる1クラスを作成します。ボタン名を持つ列挙型を作成し、それを押されたときにボタンを区別するためにinitメソッドに渡すことができます。

ボタンのサブクラスは、アニメーション、テクスチャなどを処理するだけです。リンゴのゲームDemoBotsを例にチェックアウトすることができます。

希望します。

+0

私はこの問題を振り返りながら、 'var pauseButton:PauseButton!'を使って説明できるかどうかを知りたがっていますか?私はそれがオプショナルズと関係していることを知っていますが、私は概念的に完全に把握していません。 'PauseButton'の後ろに'! 'や'? 'を書くのはどういう違いがありますか? – Sam

+1

もちろん、これを2つのコメントに分割する必要があるかもしれません。基本的に! var pauseButtonプロパティのラップを解除していることを意味します。あなたがDidMoveToViewでそれをインスタンス化するときよりも、pauseButton.position、pauseButton.zPositionのようなものを書くことができます。基本的にコンパイラにpauseButtonがあることを伝えているので、私たちはクールです。今、インスタンス化する前にpauseButtonで何かをしようとすると、pauseButtonが常に存在すると言って取引を破ったのでクラッシュします。 – crashoverride777

+1

一方、?を使用する場合は?コンパイラに、この一時停止ボタンがあるかどうかを伝えています。 didMoveToViewでインスタンスを作成するのを忘れた場合、後でvar pauseButtonプロパティにアクセスしようとするとクラッシュすることはありませんが、例えば接触方法。これは型安全のために非常に便利です。特別な場合にのみ表示される特別なブーストボタンも作成する必要があるとします。 ?エラーが発生した場合にコードを安全にします。 – crashoverride777

関連する問題