我发现了一个类似的问题,但是我试图检测并识别用户触摸哪个Sprite,但我不知道该怎么做。这是我的变量:
var sprites: [[SKSpriteNode]] = [[SKSpriteNode(imageNamed: "a"), SKSpriteNode(imageNamed: "b")], [SKSpriteNode(imageNamed: "c"),SKSpriteNode(imageNamed: "d")]]
这个想法是先确定spriteNode,然后将其替换为其他sprite或更改颜色,但是我不知道如何使用此spriteNodes矩阵来实现它,我想第一步是确定sprite。
您正在尝试执行的操作(即使我没有看到这样做的原因)也可以使用委派模式来完成。基本上,您将告诉您的代表(场景或您设置为代表的任何对象)为您做某事,然后您将直接在按钮的touchesBegan方法内执行该操作。另外,您还将按钮的名称传递给场景。
touchesBegan
为此,首先必须定义一个名为的协议ButtonDelegate。该协议定义了一个要求,该要求指出任何符合条件的类都必须实现一种称为的方法printButtonsName(_:):
ButtonDelegate
printButtonsName(_:)
protocol ButtonDelegate:class { func printButtonsName(name:String?) }
这是将在您的GameScene类中实现的方法,但是是在button的内部调用的touchesBegan。同样,此方法将用于将按钮的名称传递给其委托(场景),因此您将始终知道点击了哪个按钮。
GameScene
接下来是按钮类本身。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,这意味着按钮将接受触摸。另一个重要的事情是delegate财产。如前所述,按钮将场景设置为其委托。当我们创建一些按钮时,将场景设置为按钮的代表将在稍后完成…为了使您更轻松,请考虑将代表视为为老板工作的工人:)老板(一个按钮)告诉他的工人(一个场景)为他做某事(打印他的名字)。
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) } }
就是这样。当您点击播放按钮时,touchesBegan按钮本身将被调用,然后该按钮将告诉其委托使用场景类内部定义的方法打印其名称。