如何在 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 游戏:跨多个场景的按钮和节点