【问题标题】:Could not cast value of type 'SKScene'无法转换类型“SKScene”的值
【发布时间】:2016-09-22 23:07:54
【问题描述】:

我创建了一个新的 Xcode 游戏项目。我剥离了项目中的默认动画,并添加了一个新的 Swift 文件和一个新的 .sks,它们都称为 MenuScene。

在我的 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,认为这是问题所在,但错误仍然显示(当我返回时,文本字段似乎随机清除。

import SpriteKit
import GameplayKit

class GameScene: SKScene {

    override func sceneDidLoad() {

    }
}

.

import SpriteKit
import GameplayKit

class MenuScene: SKScene {

    override func sceneDidLoad() {

    }
}

【问题讨论】:

  • 您可以检查文件MenuScene.swift 是否与其他swift文件位于同一目录级别。它可能被添加到错误的位置。
  • 刚查了一下,4个文件都在同一个目录下。可能只是求助于更改文件名,看看是否可行
  • 不需要在同一目录下

标签: sprite-kit swift3 ios10


【解决方案1】:

所以我发现了这个问题。

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

【讨论】:

  • 我也遇到过同样的问题。我认为这是一个错误。如果你在场景中添加一个元素,然后删除它,你会遇到同样的问题。
  • 嗯,这不可能,我在属性检查器中没有名称的情况下可以正常工作,如果您发现它没有保存,请尝试按 Option + S
  • 不知道发生了什么,但设置名称是为我解决问题的唯一方法。这在 Xcode 8 和 8.1 beta 上都有
  • 当你删除名称,然后删除类名,保存,关闭xcode,重新打开它,然后尝试添加自定义类而不添加名称时会发生什么,这会重现你的错误吗?跨度>
  • 我上周左右离开了这个项目,一旦我回到它,我会试试你的建议,看看这是否还在发生
【解决方案2】:

您的问题是您正在尝试将 SKScene 向上转换为 MenuScene。

这无法完成,我看到您已经检查了您的 sks 文件中的自定义类,以确保它设置为 MenuScene,但是您确定正确保存了吗?需要输入并回车,否则场景不会自动保存,离开时会清空。

【讨论】:

  • 我不明白向上转换到 MenuScene 和 GameScene 之间有什么区别。它们都是 SKScene 的子类。我肯定是在输入它并按回车键。将下载最新的 Xcode 测试版,看看是否能解决问题。
  • 没有区别,您的 SKS 自定义类指向 SKScene,而不是 GameScene,因为该字段为空(您在问题中说过)
【解决方案3】:

对于 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) {

  }
}

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

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

开头
class GameScene: SKScene {

将此代码添加到您的 touchesBegan 函数中

   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
}
}

不客气!您应该能够从游戏屏幕点击到菜单屏幕。

【讨论】:

  • 谢谢,但是:1)您可以在某处发布带有这些修复程序的现成项目。因此,任何人都可以在没有额外修复的情况下使用可行的项目:2)为什么它会在控制台中发送垃圾邮件“如果我们在真正的预提交处理程序中,由于 CA 限制,我们实际上不能添加任何新的栅栏”轮换?
【解决方案4】:

我发现了一些奇怪的东西。 我的项目名称有一个“-”字符。 在我从目标名称中删除此角色后,项目可以将 scene.rootNode 转换为 GameScene。

【讨论】:

    【解决方案5】:

    它适用于我的 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
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-02
      • 2016-03-05
      • 2023-03-20
      • 2015-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多