swift - 以编程方式将按钮添加到 GameScene.swift 并在按下时转换场景

标签 swift sprite-kit swift3

我一直在努力尝试实现一种添加按钮的方法,当按下按钮时,场景会转换到我的第二个 View 。我读过其他帖子,但在 Swift 3 中的某些方面运气为零。我真的很困惑并且尝试过但失败了很多次。希望你能帮忙!谢谢!

SpriteKit 中的 Swift 3。

最佳答案

过渡到新 View 是什么意思?在制作 SpriteKit 游戏时,我们倾向于在 SKScenes 而不是 View 之间进行转换。所以不要尝试为每个场景创建不同的 View 或 View Controller ,直接在 SKScenes 之间转换即可。

关于按钮,有很多可用的教程。您基本上创建一个 SKSpriteNode 作为按钮并在 touchesBegan 中查找它并在按下时执行某些操作。

这里是一个简单的例子

https://nathandemick.com/2014/09/buttons-sprite-kit-using-swift/

您可以创建一个与此类似的按钮子类。

class Button: SKNode {
      let defaultButton: SKSpriteNode
      let activeButton: SKSpriteNode
      var action: () -> ()

      init(defaultButtonImage: String, activeButtonImage: String, buttonAction: @escaping () -> ()) {
           defaultButton = SKSpriteNode(imageNamed: defaultButtonImage)
           activeButton = SKSpriteNode(imageNamed: activeButtonImage)
           activeButton.isHidden = true
           action = buttonAction

           super.init()

           isUserInteractionEnabled = true
           addChild(defaultButton)
           addChild(activeButton)
     }

     required init(coder aDecoder: NSCoder) {
           fatalError("init(coder:) has not been implemented")
     }

     override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        activeButton.isHidden = false
        defaultButton.isHidden = true
     }

     override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        for touch in touches {
             let location = touch.location(in: self)

             if defaultButton.contains(location) {
                  activeButton.isHidden = false
                  defaultButton.isHidden = true
             } else {
                   activeButton.isHidden = true
                   defaultButton.isHidden = false
             } 
        }
     }

     override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
          for touch in touches {
             let location = touch.location(in: self)

             if defaultButton.contains(location) {
                 action()
             }

             activeButton.isHidden = true
             defaultButton.isHidden = false
         }
    }
}

然后在您相关的 SKScene 中添加您的按钮

 class StartScene: SKScene {

      override func didMove(to view: SKView) {

          let playButton = Button(defaultButtonImage: "button", activeButtonImage: "button_active", buttonAction: loadGameScene)
           playButton.position = CGPoint(x: frame.midX, y: frame.midY)
           addChild(playButton)
      }

      func loadGameScene() {
          let scene = GameScene(...)
          let transition = SKTransition....
          scene.scaleMode = .aspectFill
          view?.presentScene(scene, transition: transition)
      }
 }

您还可以查看 Apple 示例游戏 DemoBots,了解另一个使用协议(protocol)的按钮类示例。

希望对你有帮助

关于swift - 以编程方式将按钮添加到 GameScene.swift 并在按下时转换场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40838579/

相关文章:

ios - 禁用 CALayer 隐式动画

ios - 查询 CloudKit 用户记录给出 "Can' t 查询系统类型”

ios - 当应用程序进入后台时停止/启动 NSTimer

iOS - 使用 AVAudioSessionCategoryAmbient 和 duckOthers 和 mixWithOthers 开启静音

ios - AWS iOS Swift 3 Cognito 类型不符合协议(protocol)

regex - 在 Swift 3 中搜索正则表达式

ios - 从不同 VC 访问时,带有完成处理程序的 API 调用函数崩溃

ios - 如何正式构建和测试 iOS Swift 包?

ios - SpriteKit 着色器崩溃 iOS 9 : SKDefaultShading, gl_FragCoord

swift - SKSpriteNode 具有物理主体自动校正方向