所以到目前为止我已经制作了2个游戏并且我总是使用touchesBegan函数和SpriteNodes创建一个菜单,如下所示:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in touches {
let location = touch.location(in: self)
if (atPoint(location).name == "playButton"){
startGame()
}
}
}
但是这种方式非常难看,因为只要您触摸按钮,它就会调用相应的操作,但您无法取消它。但是使用普通的UIButton,它只会在您将手指从按钮上移开后调用动作,甚至只需将手指从按钮上移开即可点击按钮。问题是,我不知道如何将UIButton添加到我的MenuScene.swift文件中,我也不使用故事板,因为它只是让我困惑而且我不明白.sks,.swift是怎么回事和.Storyboard文件链接在一起,这对我来说没有意义。我的意思是.sks和.storyboard文件都用于构建GUI但在.sks你不能添加一个UIButton ...但为什么???有没有方便的方法来添加按钮?
答案 0 :(得分:1)
我不会在我的Spritekit代码中使用UIButton,最好在Spritekit中创建自己的Button类并使用它。 sks文件未链接到故事板,它链接到您指定的任何类(GameScene,MenuScene),它甚至可以链接到具有自己的类(ScoreHUD,Castle等)的较小对象。
老实说,你只是在想按钮的事情。想想触摸事件。 touchesBegan在点击对象时触发,如果你想在手指上触发,则触发touchesEnded
这是我为这个例子编写的一个非常简单的按钮类,你可以用它做很多事情,但这涵盖了基础知识。它决定按钮是否会向下或向上单击,如果您将手指从按钮上移开,则不会单击。它使用协议将click事件传递回父级(可能是你的场景)
您还可以将colorSprite /或图像拖到场景编辑器中,并将其设置为自定义类检查器中的“按钮”自定义类,从而将其添加到sks文件中。 按钮类......
protocol ButtonDelegate: class {
func buttonClicked(button: Button)
}
class Button: SKSpriteNode {
enum TouchType: Int {
class down, up
}
weak var buttonDelegate: ButtonDelegate!
private var type: TouchType = .down
init(texture: SKTexture, type: TouchType) {
var size = texture.size()
super.init(texture: texture ,color: .clear, size: size)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
isPressed = true
if type == .down {
self.buttonDelegate.buttonClicked(button: self)
}
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
if let touch = touches.first as UITouch! {
let touchLocation = touch.location(in: parent!)
if !frame.contains(touchLocation) {
isPressed = false
}
}
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
guard isPressed else { return }
if type == .up {
self.buttonDelegate.buttonClicked(button: self)
}
isPressed = false
}
}
在你的GameScene文件中
class GameScene: SKScene, Button {
private var someButton: Button!
private var anotherButton: Button!
func createButtons() {
someButton = Button(texture: SKTexture(imageNamed: "blueButton"), type: .down)
someButton.position = CGPoint(x: 100, y: 100)
someButton.Position = 1
someButton.name = "blueButton"
addChild(someButton)
anotherButton = Button(texture: SKTexture(imageNamed: "redButton"), type: .up)
anotherButton = CGPoint(x: 300, y: 100)
anotherButton = 1
anotherButton = "redButton"
addChild(anotherButton)
}
func buttonClicked(button: Button) {
print("button clicked named \(button.name!)")
}
}