如何检测已触摸哪个 SKSpriteNode [英] How do I detect which SKSpriteNode has been touched
问题描述
我发现 类似问题,但我正在尝试检测和识别用户触摸的 Sprite,但我不知道该怎么做.这是我的变量:
I find a similar question, but I am trying to detect and identify which Sprite the user touch, and I don't know how to do that. This is my variable:
var sprites: [[SKSpriteNode]] = [[SKSpriteNode(imageNamed: "a"), SKSpriteNode(imageNamed: "b")], [SKSpriteNode(imageNamed: "c"),SKSpriteNode(imageNamed: "d")]]
这个想法是识别 spriteNode,然后将其替换为其他 sprite 或更改颜色,但我不知道如何使用这个 spriteNodes 矩阵来做到这一点,我猜第一步它是识别 sprite.
The idea is identify the spriteNode and then replace it for other sprite or change the color, but I don´t know how to do it with this matrix of spriteNodes, I guess the first step it´s identify the sprite.
推荐答案
可以使用 委托模式.基本上,您将告诉您的委托(场景,或您设置为委托的任何内容)为您做某事,您将直接在按钮的 touchesBegan
方法中执行此操作.此外,您会将按钮的名称传递给场景.
What you are trying to do (even if I don't see a reason for this) can be accomplished using delegation pattern. Basically, you will tell your delegate (the scene, or whatever you set as a delegate) to do something for you, and you will do that directly from within the button's touchesBegan
method. Also, you will pass the button's name to a scene.
要做到这一点,首先您必须定义一个名为ButtonDelegate
的协议.该协议定义了一个要求,即任何符合要求的类都必须实现一个名为 printButtonsName(_:)
:
To make this happen, first you have to define a protocol called ButtonDelegate
. That protocol defines a requirement which states that any conforming class has to implement a method called printButtonsName(_:)
:
protocol ButtonDelegate:class {
func printButtonsName(name:String?)
}
这是将在您的 GameScene
类中实现的方法,但从按钮的 touchesBegan
中调用.此外,此方法将用于将按钮的名称传递给其委托(场景),因此您将始终知道点击了哪个按钮.
This is the method which will be implemented in your GameScene
class, but called from within button's touchesBegan
. Also, this method will be used to pass a button's name to its delegate (scene), so you will always know which button is tapped.
接下来是按钮类本身.按钮
可能如下所示:
Next thing is button class itself. Button
might look like this:
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
属性.如前所述,按钮将场景设置为它们的代表.稍后我们会在创建一些按钮时将场景设置为按钮的代表...一个场景)为他做点什么(打印他的名字).
The important thing here is userInteractionEnabled = true
, which means that button will accept touches. Another important thing is a delegate
property. As already mentioned, buttons will have the scene set as their delegate. Setting a scene as delegate of buttons will be done later when we create some buttons... To make this easier for you, think of a delegate as a worker who works for his boss :) The boss (a button) tells his worker (a scene) to do something for him (to prints his name).
好的,让我们确保场景符合 ButtonDelegate
协议...为什么这很重要?这很重要,因为工人(场景)必须听从老板(一个按钮)的命令.通过遵守此协议,工人正在与他的老板签订合同,确认他知道如何完成他的工作并将遵守他的命令:)
Okay, so lets make sure that scene conforms to a ButtonDelegate
protocol...Why is this important? It is important because the worker (scene) must follow the orders of his boss (a button). By conforming to this protocol, the worker is making a contract with his boss where confirming that he knows how to do his job and will follow his orders :)
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
将被调用,然后按钮将告诉其代理使用场景类内部定义的方法打印其名称.
And that's it. When you tap the play button, the touchesBegan
on a button itself will be called, then the button will tell its delegate to print its name using the method defined inside of scene class.
这篇关于如何检测已触摸哪个 SKSpriteNode的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!