以编程方式向GameScene.swift添加按钮,按下时转换场景

时间:2016-11-28 06:50:46

标签: swift sprite-kit swift3

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

SpriteKit中的Swift 3。

1 个答案:

答案 0 :(得分:3)

你是什么意思转换到新视图?在制作SpriteKit游戏时,我们倾向于在S​​KScenes之间转换而不是视图。因此,不要尝试为每个场景创建不同的视图或viewControllers,只需直接在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)
      }
 }

您还可以使用协议查看Apples示例游戏DemoBots以获取另一个按钮类示例。

希望这有帮助