无法输入'SKScene'类型的值

时间:2016-09-22 23:07:55

标签: sprite-kit swift3 ios10

我创建了一个新的Xcode Game项目。我删除了项目中的默认动画,并添加了一个新的Swift文件和一个名为MenuScene的新.sks。

在我的GameViewController中,我将GameScene的引用替换为MenuScene,因为我希望首先启动此场景:

override func viewDidLoad() {
    super.viewDidLoad()

    // Load 'GameScene.sks' as a GKScene. This provides gameplay related content
    // including entities and graphs.
    if let scene = GKScene(fileNamed: "MenuScene") {

        // Get the SKScene from the loaded GKScene
        if let sceneNode = scene.rootNode as! MenuScene? {

            // Set the scale mode to scale to fit the window
            sceneNode.scaleMode = .aspectFill

            // Present the scene
            if let view = self.view as! SKView? {
                view.presentScene(sceneNode)

                view.ignoresSiblingOrder = true

                view.showsFPS = true
                view.showsNodeCount = true
            }
        }
    }
}

当我尝试启动时,我收到以下错误:

Could not cast value of type 'SKScene' (0x1105624) to 'Spritekit10.MenuScene' (0x104c38).

如果我将其更改回GameScene,它似乎具有完全相同的设置,一切似乎都很好。

任何人都可以指出我正确的方向,问题是什么?

在自定义类下的MenuScene.sks上,我添加MenuScene认为这是问题,但错误仍然显示(当我回到它时,文本字段似乎随机清除。< / p>

import SpriteKit
import GameplayKit

class GameScene: SKScene {

    override func sceneDidLoad() {

    }
}

import SpriteKit
import GameplayKit

class MenuScene: SKScene {

    override func sceneDidLoad() {

    }
}

5 个答案:

答案 0 :(得分:3)

所以我想出了这个问题。

对于.sks文件,我必须在属性检查器中为场景添加一个名称(即使它在GameScene中是空白的)。完成此操作后,保存自定义类值,现在加载文件时没有错误。不确定这是错误还是设计。

答案 1 :(得分:1)

对于Xcode 8.0 / 8.1,创建一个名为“Menuscene”的swift文件和一个名为“Menuscene”的sks文件。 删除Menuscene swift文件中的所有内容并插入此代码

import SpriteKit
import GameplayKit

class Menuscene: SKScene {

override func didMove(to view: SKView) {
    let menutext = SKLabelNode()
    menutext.text = "MEnuscene"
    menutext.position = CGPoint(x: 0, y: 0)
    menutext.fontSize = 120

    self.backgroundColor = UIColor.blue
    addChild(menutext)

}


override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    let gamescene = SKScene(fileNamed: "GameScene")
    gamescene?.scaleMode = .fill
    self.scene?.view?.presentScene(gamescene!,transition: SKTransition.doorsCloseHorizontal(withDuration: 1.0))

}

override func update(_ currentTime: TimeInterval) {

  }
}

并在属性检查器选项卡中,将name设置为“Menuscene”,按Enter键(非常重要)。然后在下一个选项卡上,将自定义类名设置为“Menuscene”,按Enter键(非常重要)。

在Gamescene.swift文件中,仔细检查以确保您的课程以

开头
class GameScene: SKScene {

将此代码添加到touchesBegan func

   override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    let Menuscene = SKScene(fileNamed: "Menuscene")
    Menuscene?.scaleMode = .fill
    self.scene?.view?.presentScene(Menuscene!,transition: SKTransition.doorsOpenVertical(withDuration: 1.0))

    }

最后在你的Gameviewcontroller文件中,删除所有内容并插入此代码

import UIKit
import SpriteKit
import GameplayKit

class GameViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()

    if let view = self.view as! SKView? {
        // Load the SKScene from 'GameScene.sks'
        if let scene = SKScene(fileNamed: "Menuscene") {
            // Set the scale mode to scale to fit the window
            scene.scaleMode = .aspectFill

            // Present the scene
            view.presentScene(scene)
        }

        view.ignoresSiblingOrder = true

        view.showsFPS = true
        view.showsNodeCount = true
    }
}

override var shouldAutorotate: Bool {
    return true
}

override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    if UIDevice.current.userInterfaceIdiom == .phone {
        return .allButUpsideDown
    } else {
        return .all
    }
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Release any cached data, images, etc that aren't in use.
}

override var prefersStatusBarHidden: Bool {
    return true
}
}

欢迎你!你应该能够从游戏屏幕点击到菜单屏幕。

答案 2 :(得分:0)

您的问题是您正在尝试将SKScene转播到MenuScene。

这是无法做到的,我发现你已经在你的sks文件中检查了你的自定义类,以确保它被设置为MenuScene,但是你确定你保存了它吗?您需要输入并按Enter键,否则,场景将不会自动保存,当您离开时将清除它。

答案 3 :(得分:0)

它适用于我的iOS 10.3.1。

override func viewDidLoad() {
    super.viewDidLoad()

    let fileName = "GameScene"

    // Load 'GameScene.sks' as a GKScene. This provides gameplay related content
    // including entities and graphs.
    guard let scene = GKScene(fileNamed: fileName) else {
        return
    }

    guard let sceneNode = scene.rootNode as? GameScene ?? GameScene(fileNamed: fileName) else {
        return
    }

    // Copy gameplay related content over to the scene
    sceneNode.entities = scene.entities
    sceneNode.graphs = scene.graphs

    // Set the scale mode to scale to fit the window
    sceneNode.scaleMode = .aspectFill

    // Present the scene
    if let view = self.view as! SKView? {
        view.presentScene(sceneNode)

        view.ignoresSiblingOrder = true

        view.showsFPS = true
        view.showsNodeCount = true
    }
}

答案 4 :(得分:0)

我发现了一些奇怪的东西。 我的项目名称带有一个“-”字符。 从目标名称中删除此字符后,该项目可以将scene.rootNode投射到GameScene。