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.0 @rakeshbs – AnaMM
はじめに、スプライトを作成しないでください。名前を設定する必要があります。後で、touchesBeganで、 'nodeAtPoint'または' nodesAtPoint'を使って、どのノードが*触れられているかを調べることができます。*それらの名前に基づいて、適切な処置が取られます。あなたがいくつかのコードを知っている必要があれば... – Whirlwind
実際に、そのリンクのrakeshbsによって投稿された答えは、あなたがそれをどうするべきかです。だからあなたはボタンを作成し、それらの名前をつけ、それらを行列に追加して(必要なら)、彼が掲示したコードを使用しなければなりません。 – Whirlwind