2017-02-28 8 views
1

私は、その周りのすべてのロジックをカプセル化したいクラスを持っています。しかし、タッチイベントをGameSceneに渡して、たとえば他のノードを削除することもできます。私はsuper.touchesBegan(touches, withEvent: event)が働くと思ったが、ダイスはなかった。Swift SKSpriteNodeクラスがGameSceneへのタッチを登録していません

私はまた、Delegateパターンを試しましたが、どちらもうまく動作しませんでしたが、そのアプローチは本当に嫌いでした。

import Foundation 
import SpriteKit 

class LevelSelect: SKSpriteNode { 
    var level:Int = 0 

    init(x: CGFloat, y: CGFloat) { 
     // init code ... 
    } 

    required init(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     // logic affecting this class 
     super.touchesBegan(touches, withEvent: event) 
    } 
} 
+0

ノードを触ったときに何かをしようとしていますか、指の位置を特定できませんでしたか? – sicvayne

答えて

3

SKSpriteNode(super.touches ...)のスーパークラスはSKSceneではありません。

また、touchesメソッドをSKSpriteNodeサブクラスに追加すると、実際のノードがシーンではなくタッチされたときにのみ起動されます。これは、通常、ボタンサブクラスなどのものに使用されます。

あなたが望むものがあれば、タッチに直接触れることができます。各SKSpriteNodeは、ノードが入っているシーンにアクセスすることができます(スプライトまでゼロがシーンに追加されます)、オプションのシーン特性を有している。

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     // logic affecting this class 
     scene?.touchesBegan(touches, withEvent: event) 
} 

あなたはまた、あなたのSKSpriteNodeクラスまたはタッチでユーザーとの対話を有効にする必要がありますメソッドは起動しません。

isUserInteractionEnabled = true 

もっと簡単な方法あなたが

class LevelSelect: SKSpriteNode { 
    var level = 0 

    init(x: CGFloat, y: CGFloat) { 
     // init code ... 
    } 

    // Started touches 
    func didStartTouches() { 
     // do something 
    } 
} 

し、あなたが初期化するために作成したプロパティを使用することができ、あなたのGameSceneよりも例えば完了を必要とするすべてのもののためのあなたのLevelSelectクラスのメソッドを作成することになりますそのクラスを呼び出してメソッドを呼び出します。

class GameScene: SKScene { 

    levelSelect = LevelSelect(x: ..., y: ...) 

    ... 

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
      // logic affecting this class 
      levelSelect.didStartTouches() 
    } 
} 

あなたが使用することができ、あなたのSKSpriteNodeクラス(ES)から直接シーンのメソッドを呼び出すには、あなたが例えば

class LevelSelect: SKSpriteNode { 

    ... 

    func callSomeMethodInGameScene() { 
     let gameScene = scene as? GameScene // dont use as!, always use optionals (as?) when doing the as casting 
     gameScene?.removeAllLabels() 

    } 
} 
GameScene内のメソッドを呼び出すことができますので、あなたのGameSceneに、一般的なシーンプロパティをキャストするオペレータ「として」

希望するこれは役に立ちます

+0

これは私の質問にちょうど答える!ありがとうございました。フォローアップ、そのSKSceneの中に住むメソッドを呼び出す方法はありますか?私は 'scene?.removeAllLabels()'を試しましたが、それにアクセスできませんでした。 – cdpalmer

+0

また、私はユーザー名だけでもう一度アップアップすることができます:D – cdpalmer

+1

ちょっと、あなたはメソッドを呼び出すことができます、シーンプロパティをGameSceneにキャストする必要があります。私は自分の答えを更新しました。 – crashoverride777

関連する問題