我创建了一个新的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() {
}
}
答案 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。