Ana*_*aMM 4 matrix touch sprite-kit skspritenode swift
我发现了一个类似的问题,但我试图检测并识别用户触摸的哪个Sprite,我不知道该怎么做.这是我的变量:
var sprites: [[SKSpriteNode]] = [[SKSpriteNode(imageNamed: "a"), SKSpriteNode(imageNamed: "b")], [SKSpriteNode(imageNamed: "c"),SKSpriteNode(imageNamed: "d")]]
Run Code Online (Sandbox Code Playgroud)
想法是识别spriteNode,然后将其替换为其他精灵或更改颜色,但我不知道如何使用这个spriteNodes矩阵,我想第一步它识别精灵.
Whi*_*ind 10
您尝试做的事情(即使我没有看到这个原因)也可以使用委托模式来完成.基本上,您将告诉您的代表(场景或您设置为委托的任何内容)为您做一些事情,您将直接从按钮的touchesBegan方法中执行此操作.此外,您将按钮的名称传递给场景.
要实现这一点,首先必须定义一个名为的协议ButtonDelegate.该协议定义了一个要求,该要求声明任何符合要求的类必须实现一个名为的方法printButtonsName(_:):
protocol ButtonDelegate:class {
func printButtonsName(name:String?)
}
Run Code Online (Sandbox Code Playgroud)
这是将在您的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)
}
}
Run Code Online (Sandbox Code Playgroud)
这里重要的是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) ")
}
//Use switch here to take appropriate actions based on button's name (if you like)
}
}
Run Code Online (Sandbox Code Playgroud)
就是这样.当您点击播放按钮时,touchesBegan将调用按钮本身,然后该按钮将告诉其委托使用场景类中定义的方法打印其名称.