我如何检测到SKSpriteNode已被触摸
我发现一个类似的问题 ,但我试图检测和识别用户触摸哪个Sprite,我不知道该怎么做。 这是我的变数:
var sprites: [[SKSpriteNode]] = [[SKSpriteNode(imageNamed: "a"), SKSpriteNode(imageNamed: "b")], [SKSpriteNode(imageNamed: "c"),SKSpriteNode(imageNamed: "d")]]
这个想法是确定spriteNode,然后将其replace为其他sprite或更改颜色,但我不知道如何使用spriteNodes这个matrix做到这一点,我猜测它的第一步是识别精灵。
我真的很感谢你的帮助! 谢谢!
你正在尝试做什么(即使我没有看到这个原因)可以使用委托模式来完成。 基本上,你会告诉你的委托(场景,或任何你设置为一个委托)为你做一些事情,你会直接从button的touchesBegan
方法。 此外,您将传递button的名称到一个场景。
要做到这一点,首先你必须定义一个名为ButtonDelegate
的协议。 该协议定义了一个要求,规定任何符合的类必须实现一个名为printButtonsName(_:)
:
protocol ButtonDelegate:class { func printButtonsName(name:String?) }
这是将在您的GameScene
类中实现的方法,但在button的touchesBegan
调用。 此外,此方法将用于将button的名称传递给它的代理(场景),所以您将始终知道哪个button被点击。
接下来的事情是button类本身。 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
,这意味着button将接受触摸。 另一个重要的事情是delegate
财产。 如前所述,button将把场景设置为他们的代表。 设置一个场景作为button的代表将在稍后创build一些button时完成…为了让您更容易,可以将委托人想象成一个为他的老板工作的工作者:)老板(一个button)告诉他的工人一个场景)为他做点什么(打印他的名字)。
好吧,让我们确保这个场景符合ButtonDelegate
协议…为什么这很重要? 这很重要,因为工人(场景)必须按照老板的命令(一个button)。 通过遵守这个协议,工人正在与他的老板签订合同,确认他知道如何做他的工作,并将按照他的命令:)
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) } }
就是这样。 当你点击播放button时,button上的touchesBegan
会被调用,然后这个button会告诉它的委托使用scene class里面定义的方法来打印它的名字。
首先,你需要另一种方式来创build精灵,这里有一个方法:
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
。