ios - 从 Storyboard图像连接到 SpriteKit 场景

标签 ios xcode swift segue scene

我正在为高中编程类(class)创建一个 Swift 项目。我似乎无法解决这个问题,类的其他人似乎也没有任何想法。

首先,我创建了一个新的 Swift 项目,并选择了一种游戏格式。

new project template

然后,我使用一些基本代码为我的游戏制作第一个关卡,这是一个迷宫游戏,其中迷宫根据用户如何倾斜设备而不是球移动。 这是我的 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:

menu storyboard

我成功地将应用程序启动到 mainMenu.storyboard (当我测试 level1.sks 时,关卡物理效果很好),但我无法弄清楚如何继续。

目标:当人们点击 mainMenu.storyboard 中的相应图像时,我希望他们能够进入 level1.sks(以及我稍后添加的级别) .

我无法使用添加 Storyboard Reference 的方法来对其进行连接,因为 Storyboard Reference 不允许我选择 level1.sks

我还很想知道当玩家图标触及球门时如何将用户带回主菜单(此屏幕截图中顶部附近的蓝色物体):

game maze screenshot

最佳答案

因此,要做到这一点,我认为最好的方法是创建另一个 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/

相关文章:

ios - +[RLMRealm setDefaultRealmPath :] not found when upgrading from old version of Realm

iphone - 如何创建与越狱 iOS 上的守护进程通信的应用程序 GUI?

ios - 导航标题自定义 View 操作未触发

ios - 无法使用 Swift 读取 Firebase 数据

iphone - 来自 Hockey 的 CrashReport,使用 NSPlaceholderDictionary 的尴尬 Stacktrace

ios - Swift localizedStringWithFormat 数字输出而不是文本

android - 在 iOS/Android 中运行 node.js

ios - 体系结构 armv7 SSZipArchive 的 undefined symbol

ios - 提交测试版 iPhone 应用程序到商店

ios - 使用 URL 方案在应用程序之间切换 (iOS)