我正在为高中编程类(class)创建一个 Swift 项目。我似乎无法解决这个问题,类的其他人似乎也没有任何想法。
首先,我创建了一个新的 Swift 项目,并选择了一种游戏格式。
然后,我使用一些基本代码为我的游戏制作第一个关卡,这是一个迷宫游戏,其中迷宫根据用户如何倾斜设备而不是球移动。
这是我的 GameScene.swift
:
import SpriteKit
import CoreMotion
var accelupdateinterval = 0.1
var accelmultiplier = 15.0
class GameScene: SKScene {
let manager = CMMotionManager()
override func didMoveToView(view: SKView) {
manager.startAccelerometerUpdates()
manager.accelerometerUpdateInterval = accelupdateinterval
manager.startAccelerometerUpdatesToQueue(NSOperationQueue.mainQueue()){
(data, error) in
self.physicsWorld.gravity = CGVectorMake(CGFloat((data?.acceleration.x)!) * CGFloat(accelmultiplier), CGFloat((data?.acceleration.y)!) * CGFloat(accelmultiplier))
}
}
override func update(currentTime: CFTimeInterval) {
/* Called before each frame is rendered */
}
}
我想要一个应用程序打开的主菜单,即 mainMenu.storyboard
:
我成功地将应用程序启动到 mainMenu.storyboard
(当我测试 level1.sks
时,关卡物理效果很好),但我无法弄清楚如何继续。
目标:当人们点击 mainMenu.storyboard
中的相应图像时,我希望他们能够进入 level1.sks
(以及我稍后添加的级别) .
我无法使用添加 Storyboard Reference 的方法来对其进行连接,因为 Storyboard Reference 不允许我选择 level1.sks
。
我还很想知道当玩家图标触及球门时如何将用户带回主菜单(此屏幕截图中顶部附近的蓝色物体):
最佳答案
因此,要做到这一点,我认为最好的方法是创建另一个 ViewController 子类,可能命名为 LauncherViewController,它将呈现您的 SKScene。然后在你的 Storyboard中添加这个 viewController 并让你的菜单在图像按下时转到它。
这是 LauncherViewController 的开始
class LauncherViewController: UIViewController {
var gameScene: GameScene!
override func viewDidLoad() {
}
override func viewWillAppear() {
presentGameScene()
}
func presentGameScene(){
let skView = self.view as! SKView
skView.showsFPS = false
skView.showsNodeCount = false
skView.ignoresSiblingOrder = true
gameScene.size = skView.bounds.size
gameScene.scaleMode = .AspectFill
skView.presentScene(gameScene)
}
}
在你的菜单 Controller 中,你有一个像这样的prepareForSegue:
override func prepareForSegue(segue: UIStoryBoardSegue, sender: AnyObject?) {
if segue.identifier == "yourSegue" {
let destinationViewController = segue.destinationViewController as! LauncherViewController
destinationViewController.gameScene = GameScene()
}
要让 LauncherViewController 在用户完成迷宫时关闭 gameScene,请使用委托(delegate)模式。所以在 GameScene 中添加一个协议(protocol)在你的类之上
protocol GameDelegate {
func gameFinished()
}
让您的 LauncherViewController 符合此委托(delegate)并将 gameScene 的委托(delegate)变量设置为 self(见下文)
class LauncherViewController: UIViewController, GameDelegate {
var gameScene: GameScene!
override func viewDidLoad() {
gameScene.delegate = self
}
override func viewWillAppear() {
presentGameScene()
}
func presentGameScene(){
let skView = self.view as! SKView
skView.showsFPS = false
skView.showsNodeCount = false
skView.ignoresSiblingOrder = true
gameScene.size = skView.bounds.size
gameScene.scaleMode = .AspectFill
skView.presentScene(gameScene)
}
func gameFinished(){
// this forces LauncherViewController to dismiss itself
dismissViewControllerAnimated(true, completion: nil)
}
}
在GameScene中添加一个变量来保存委托(delegate)(LauncherViewController)并添加一个调用委托(delegate)函数的函数。您还需要添加逻辑来知道游戏何时结束,因为我还没有这样做。
class GameScene: SKScene {
let manager = CMMotionManager()
var delegate: GameDelegate!
override func didMoveToView(view: SKView) {
manager.startAccelerometerUpdates()
manager.accelerometerUpdateInterval = accelupdateinterval
manager.startAccelerometerUpdatesToQueue(NSOperationQueue.mainQueue()){
(data, error) in
self.physicsWorld.gravity = CGVectorMake(CGFloat((data?.acceleration.x)!) * CGFloat(accelmultiplier), CGFloat((data?.acceleration.y)!) * CGFloat(accelmultiplier))
}
}
func gameOver(){
delegate.gameFinished()
}
override func update(currentTime: CFTimeInterval) {
/* Called before each frame is rendered */
// it's probably easiest to add the logic for a gameOver here
if gameIsOver {
gameOver()
}
}
}
这里可能会有一些错误,因为我是在手机上写的,所以如果您不确定或不起作用,请在下面评论。
关于ios - 从 Storyboard图像连接到 SpriteKit 场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37282070/