Swift spritekit多个场景

时间:2014-12-31 11:46:52

标签: ios swift sprite-kit

我是swift的初学者,我做了一个简单的游戏,我想添加一个菜单场景。 这是我到目前为止所做的。

在menueScene.swift中

import Foundation
import spritekit
class MenuScene: SKScene {
  override func didMoveToView(view: SKView) {
    /* Setup your scene here */

    let Label = SKLabelNode(fontNamed:"Chalkduster")
    Label.text = "Choose the Device";
    Label.fontSize = 25;
    Label.position = CGPoint(x:CGRectGetMidX(self.frame), y:665.523254394531);
    self.addChild(Label)

    let Label1 = SKLabelNode(fontNamed: "Chalkduster")
    Label1.text = "light's";
    Label1.fontSize = 20;
    Label1.position = CGPointMake(401.463256835938,545.199401855469)
    self.addChild(Label1)
   }
}

并在GameViewController.swift中

import UIKit
import SpriteKit

extension SKNode {
  class func unarchiveFromFile(file : NSString) -> SKNode? {
    if let path = NSBundle.mainBundle().pathForResource(file, ofType: "sks") {
        var sceneData = NSData(contentsOfFile: path, options: .DataReadingMappedIfSafe, error: nil)!
        var archiver = NSKeyedUnarchiver(forReadingWithData: sceneData)

        archiver.setClass(self.classForKeyedUnarchiver(), forClassName: "SKScene")
        let scene = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as MenuScene
        archiver.finishDecoding()
        return scene
    } else {
        return nil
    }
}


}

class GameViewController: UIViewController {



  override func viewDidLoad() {
    super.viewDidLoad()

    if let scene = MenuScene.unarchiveFromFile("MenuScene") as? MenuScene {
        //if scene = MenuScene.unarchiveFromFile("MenuScene") as? MenuScene {
        // Configure the view.
        let skView = self.view as SKView
        skView.showsFPS = true
        skView.showsNodeCount = true

        /* Sprite Kit applies additional optimizations to improve rendering performance      */
        skView.ignoresSiblingOrder = true

        /* Set the scale mode to scale to fit the window */
        scene.scaleMode = .AspectFill

        scene.size = skView.bounds.size

        skView.presentScene(scene)
    }
}

这在iOS模拟器中没有显示任何内容,也没有错误。我做错了什么。

2 个答案:

答案 0 :(得分:0)

看起来像你想要的Label.position的CGPoints放在视图之外。这是因为x和y值很大。我不知道为什么你的价值这么大,我假设你在使用iPad作为模拟器设备。尝试用它替换它:

    override func didMoveToView(view: SKView) {
    let Label = SKLabelNode(fontNamed:"Chalkduster")
    Label.text = "Choose the Device";
    Label.fontSize = 25;
    Label.position = CGPoint(x:CGRectGetMidX(self.frame), y:20.0);
    self.addChild(Label)

    let Label1 = SKLabelNode(fontNamed: "Chalkduster")
    Label1.text = "light's";
    Label1.fontSize = 20;
    Label1.position = CGPointMake(CGRectGetMidX(self.frame) ,300.0)
    self.addChild(Label1)
}

答案 1 :(得分:0)

我认为使用可视化工具会更容易。 您可以使用文件创建新场景 - >新文件 - > SprikeKitScene。

在这种情况下,您将拥有“MenuScene.sks”文件。 您可以将元素拖放到此场景(标签,精灵等)。 您将把所有逻辑放入“ManuScene.swift”。

主ViewController中的代码,用于在启动时显示菜单:

class YourViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        if let scene = MainMenuScene(fileNamed:"MenuScene") {
            let skView = self.view as! SKView
            skView.ignoresSiblingOrder = true
            scene.scaleMode = .AspectFit
            skView.presentScene(scene)
        }
    }
...
}

稍后如果您需要从另一个场景再次打开菜单,只需调用以下代码:

let nextScene = GameScene(fileNamed: "ManuScene")!
nextScene.scaleMode = .AspectFit
scene?.view?.presentScene(nextScene)