如何在SpriteKit游戏中添加普通按钮?

时间:2018-02-04 15:35:48

标签: swift sprite-kit

所以到目前为止我已经制作了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 ...但为什么???有没有方便的方法来添加按钮?

1 个答案:

答案 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!)")
    }
}