即使我看不出为什么需要这样做,你所尝试的事情可以使用委托模式
(delegation pattern)来实现。基本上,你将告诉你的代理(场景或者任何你设置为代理的东西)去为你做某些事情,并且你可以直接从按钮的
touchesBegan
方法中执行这个操作。同时,你也会把按钮的名称传递给场景。
要实现这个功能,首先你需要定义一个名为
ButtonDelegate
的协议。该协议定义了一个要求,即任何符合条件的类都必须实现一个叫做
printButtonsName(_:)
的方法:
protocol ButtonDelegate:class {
func printButtonsName(name:String?)
}
这是在你的
GameScene
类中实现的方法,但是要从按钮的
touchesBegan
中调用它。同时,这个方法将用于将按钮的名称传递给其代理(场景),这样你就可以知道哪个按钮被点击了。
接下来是按钮类本身。
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
,这意味着按钮将接受触摸。另一个重要的事情是 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) ")
}
}
}
就是这样。当您点击播放按钮时,按钮本身的touchesBegan
将被调用,然后按钮将使用场景类内定义的方法告诉其代理打印其名称。
nodeAtPoint
或nodesAtPoint
来检查哪个节点被触摸,并根据它们的名称采取适当的操作。如果您需要一些代码,请告诉我... - Whirlwind