2016-09-22 3 views
3

Я создал новый проект Xcode Game. Я удалил анимацию по умолчанию в проекте и добавил новый файл Swift и новый .sks, называемый MenuScene.Не удалось отличить значение типа «SKScene»

В моей 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() { 

    } 
} 
+0

Вы можете проверить, что файл 'MenuScene.swift' находится на том же уровне каталога, что и другие быстрые файлы. Возможно, оно было добавлено не в том месте. –

+0

Только что проверено, и все 4 файла находятся в одном каталоге. Может просто прибегнуть к изменению имен файлов и посмотреть, будет ли это работать. – Sawyer05

+0

не обязательно должен находиться в том же каталоге – Knight0fDragon

ответ

0

Ваша проблема вы пытаетесь к базовому типу SKScene к MenuScene.

Это не может быть сделано, я вижу, у вас есть проверил ваш пользовательский класс в вашем файле sks, чтобы убедиться, что он установлен в MenuScene, но вы уверены, что сохранили его правильно? Вам нужно ввести его и нажать enter, если вы этого не сделаете, тогда сцена не будет автоматически сохранять его, и когда вы уйдете, он очистит его.

+0

Я не понимаю, какая разница между upcast и MenuScene против GameScene. Они оба являются подклассами SKScene. Я определенно печатаю его и нажимаю. Собираясь загрузить последнюю версию Xcode, проверьте, устраняет ли это проблему. – Sawyer05

+0

Нет никакой разницы, ваш собственный класс SKS указывает на SKScene, а не GameScene, потому что поле пустое (что вы сказали в своем вопросе) – Knight0fDragon

3

Так что я выяснил проблему.

Для файла .sks мне пришлось добавить имя в сцену в инспекторе атрибутов (хотя в GameScene оно было пустым). Как только я это сделал, значение пользовательского класса сохранено, и файл теперь загружается без ошибки. Не уверен, что это ошибка или по дизайну.

+0

Я столкнулся с этой же проблемой. Я думаю, что это ошибка. Если вы добавите элемент в сцену, а затем удалите его, вы получите ту же проблему. – Confused

+0

Хммм, что не может быть, у меня он работает нормально, без имени в инспекторе атрибутов, если вы считаете, что это не спасение, попробуйте нажать Option + S – Knight0fDragon

+0

Не знаю, что произошло, но установка имени - единственное, что его разрешило для меня. Это как на Xcode 8, так и на бета-версии – Sawyer05

1

Для Xcode 8.0/8.1 создайте быстрый файл с именем «Menuscene» и файл sks с именем «Menuscene». удалить все в быстром файле Menuscene и вставить этот код

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», нажмите ввод (очень важно). затем на следующей вкладке задайте имя специального класса в «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 
} 
} 

добро пожаловать! вы должны иметь возможность использовать экран игры на экране меню.

+0

Спасибо, но: 1) вы можете разместить где-нибудь готовый проект с этими исправлениями. Таким образом, любой может говорить с работоспособным проектом без дополнительных исправлений: 2) почему он рассылает спам в консоли с помощью «если мы находимся в реальном обработчике pre-commit, мы не можем фактически добавлять какие-либо новые ограждения из-за ограничения CA» при вращении? –

Смежные вопросы