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

Posted

技术标签:

【中文标题】如何在 SpriteKit 游戏中添加普通按钮?【英文标题】:How to add normal Buttons in a SpriteKit Game? 【发布时间】:2018-02-04 15:35:48 【问题描述】:

所以到目前为止我已经制作了 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 文件中,而且我也不使用 Storyboard,因为它让我感到困惑,而且我不明白 .sks、.swift和 .Storyboard 文件链接在一起,这对我来说毫无意义。我的意思是 .sks 和 .storyboard 文件都用于构建 GUI,但在 .sks 中你不能添加 UIButton ......但是为什么?有没有方便的方法来添加按钮?

【问题讨论】:

您必须使用 SKSpriteNode 实现您自己的按钮类。例如看这里:***.com/questions/38192205/… 你能添加一个示例代码如何做到这一点吗?以及如何在我添加它的位置调用文件? 使用touchesEnded() - 相当于'touchUpInside' 而touchesBegan() 是'touchdownInside' @SteveIves gee Steve 我在某处听说过... ;) @RonMyschuk 你确实做到了! :-) 我可以看到创建类按钮的好处,但是对于“简单”使用,您可以检查touchesEnded吗? 【参考方案1】:

我不会在我的 Spritekit 代码中使用 UIButton,您最好在 Spritekit 中创建自己的 Button 类并使用它。 sks 文件不链接到故事板,它链接到您指定的任何类(GameScene、MenuScene),它甚至可以链接到具有自己的类(ScoreHUD、Castle 等)的较小对象。

老实说,你只是在想按钮的事情。想想触摸事件。如果您希望在手指向上调用 touchesEnded 时触发,则在单击对象时触发 touchesBegan

这是我为这个例子编写的一个非常简单的按钮类,你可以用它做更多的事情,但这涵盖了基础知识。它决定按钮是向下还是向上单击,如果您将手指从按钮上移开,则不会单击。它使用协议将点击事件传递回父级(可能是你的场景)

您还可以通过将 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!)")
    

【讨论】:

好建议 - 但这个问题不适用于任何“故事板”类型的 UI 元素吗?也许游戏中有一张迷你桌子? 是的,如果您想与它进行触摸交互,因为这个答案的主要目的是告诉 OP 如何将触摸事件从对象返回到场景。

以上是关于如何在 SpriteKit 游戏中添加普通按钮?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SpriteKit / Objective C 中添加“静音”按钮?

如何在情节提要中创建一个按钮以启动在 xcode swift 中使用 spritekit 创建的游戏

SpriteKit Swift 2.0 游戏:跨多个场景的按钮和节点

如何在 SpriteKit 中为游戏添加音乐

添加框阴影错误 - 无法点击我的按钮 - SpriteKit

在 Spritekit 中更改场景,检测按钮上的触摸