2016-04-07 7 views
2

similar questionが見つかりましたが、ユーザーが触れるスプライトを検出して特定しようとしていますが、その方法はわかりません。これが私の変数です:SKSpriteNodeがタッチされたことを検出する方法

var sprites: [[SKSpriteNode]] = [[SKSpriteNode(imageNamed: "a"), SKSpriteNode(imageNamed: "b")], [SKSpriteNode(imageNamed: "c"),SKSpriteNode(imageNamed: "d")]] 

アイデアがspriteNodeを識別し、他のスプライトのためにそれを交換したり、色を変えているが、私はspriteNodesのこのマトリックスでそれを行う方法を知っているドント、私が最初に推測しますそれはスプライトを識別するステップです。

本当にありがとうございます。ありがとう!

+0

こんにちは! 0.0 @rakeshbs – AnaMM

+0

はじめに、スプライトを作成しないでください。名前を設定する必要があります。後で、touchesBeganで、 'nodeAtPoint'または' nodesAtPoint'を使って、どのノードが*触れられているかを調べることができます。*それらの名前に基づいて、適切な処置が取られます。あなたがいくつかのコードを知っている必要があれば... – Whirlwind

+0

実際に、そのリンクのrakeshbsによって投稿された答えは、あなたがそれをどうするべきかです。だからあなたはボタンを作成し、それらの名前をつけ、それらを行列に追加して(必要なら)、彼が掲示したコードを使用しなければなりません。 – Whirlwind

答えて

8

delegationパターンを使用して(これが理由がわからなくても)何をしようとしていますか?基本的には、デリゲート(シーン、またはデリゲートとして設定したもの)に何かを実行するよう指示し、ボタンのtouchesBeganメソッド内から直接行います。また、ボタンの名前をシーンに渡します。

これを実現するには、まずButtonDelegateというプロトコルを定義する必要があります。

protocol ButtonDelegate:class { 

    func printButtonsName(name:String?) 
} 

これはあなたのGameSceneクラスで実装されますが、ボタンのtouchesBegan内から呼び出されるメソッドです。そのプロトコルはprintButtonsName(_:)と呼ばれる任意の準拠クラスはメソッドを実装しなければならないことを述べて要件を定義します。また、このメソッドは、ボタンの名前をそのデリゲート(シーン)に渡すために使用されるので、どのボタンがタップされているかを常に知ることができます。

次はボタンクラスそのものです。 Buttonは次のようになります。

class Button : SKSpriteNode{ 

    weak var delegate:ButtonDelegate? 

    init(name:String){ 
     super.init(texture: nil, color: .purpleColor(), size: CGSize(width: 50, height: 50)) 
     self.name = name 
     self.userInteractionEnabled = true 
    } 

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


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

     delegate?.printButtonsName(self.name) 
    } 
} 

ここで重要なことは、ボタンがタッチを受け入れることを意味し、userInteractionEnabled = trueです。もう1つ重要なことはdelegateプロパティです。すでに述べたように、ボタンはデリゲートとしてシーンを設定します。シーンをボタンのデリゲートとして設定することは、後でボタンを作成するときに実行されます。これを簡単にするには、デリゲートを上司のために働くワーカーと考えてください:)ボス(ボタン)彼のために何かをする(彼の名前を印刷する)。

シーンがButtonDelegateプロトコルに準拠していることを確認してください...なぜこれが重要ですか?作業員(場面)が上司の指示に従わなければならないので重要です(ボタン)。このプロトコルに準拠することで、彼は彼の仕事をする方法を知っていると彼の命令に従うことを確認したところ:)

class GameScene: SKScene, ButtonDelegate { 


    override func didMoveToView(view: SKView) { 

     let play = Button(name:"play") 
     play.delegate = self 
     let stop = Button(name:"stop") 
     stop.delegate = self 

     play.position = CGPoint(x: frame.midX - 50.0, y: frame.midY) 
     stop.position = CGPoint(x: frame.midX + 50.0, y: frame.midY) 

     addChild(play) 
     addChild(stop) 
    } 

    func printButtonsName(name: String?) { 

     if let buttonName = name { 
      print("Pressed button : \(buttonName) ") 
     } 

     //Use switch here to take appropriate actions based on button's name (if you like) 
    } 
} 

労働者は上司との契約をしていると、それはそれです。再生ボタンをタップすると、ボタン自体のtouchesBeganが呼び出されます。このボタンは、デリゲートに、シーンクラス内で定義されたメソッドを使用して名前を表示するように指示します。

+0

WOW !!!ありがとうございました!あなたは本当にあなたの助けに本当に感謝していますか?あなたは素晴らしいです!ありがとう! :D – AnaMM

+0

デリゲートで関数を呼び出す必要があるのはなぜですか?ボタンが必要なアクティビティ自体を行うことができないのはなぜですか、それが触れられたことを認識した瞬間ですか? – Confused

+0

@confusedこれは可能ですが、実際にはボタンを押したときに何が起こるかによって異なります。シーンにノードを追加/削除したり、トランジションを行ったりすることができます。シーンからノードを削除すると、このような状況ではデリゲートが便利になります。あなたはブロックを使用することができ、コードのブロックをボタンインスタンスに渡すことができますが、私は責任を委任するこの方法がより好きです。あなたは* how *ボタンが "活動そのもの"をするべきであることを正確に定義していないので、これ以上コメントすることはできません。 – Whirlwind

0

まず、あなたはここで、スプライトを作成するための別の方法が必要になります方法です:

let spriteA = SKSpriteNode(imageNamed: "a") 
scene.addChild(spriteA) 
let spriteB = SKSPriteNode(imageNamed: "b") 
scene.addChild(spriteB) 
...and so on... 

は、今、私たちは、私たちは、後にタップされたノードを知ることができるようにスプライトの名前を設定する必要があります。

spriteNode.name = "name of the sprite" 

上記の例では、このコードを置くことは、このようなものになります::タッチを検出するために

let spriteA = SKSpriteNode(imageNamed: "a") 
spriteA.name = "a" 
scene.addChild(spriteA) 
let spriteB = SKSPriteNode(imageNamed: "b") 
spriteB.name = "b" 
scene.addChild(spriteB) 
...and so on... 

をごSKSceneサブクラスにこれを置く:

スプライトの名前を追加するには、単にこれを行います
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    let touch = touches.first as UITouch! 
    let touchLocation = touch.locationInNode(self) 
    let targetNode = nodeAtPoint(touchLocation) as! SKSpriteNode 
} 

targetNodeは、タップしたノードです。

スプライトの名前を取得する場合は、targetNode.nameを使用できます。

関連する問題