2017-01-10 2 views
1

Я создаю игру, где я получаю эту ошибку:0_specialized _fatalerrorMessage (StaticString, StaticString, StaticString, UInt, флаги: UInt32) -> Никогда - SpriteKit

0_specialized _fatalerrorMessage(StaticString, StaticString, StaticString, UInt, flags : UInt32) -> Never

здесь код, где я считаю, авария находится по адресу:

func goToCongratsScene() { 

    if countTouches > 5 { 
    let gameScene:GameScene = GameScene(size: self.size) 
    let transition = SKTransition.reveal(with: SKTransitionDirection.down, duration: 0) 
    gameScene.scaleMode = SKSceneScaleMode.aspectFill 
    self.view!.presentScene(gameScene, transition: transition) 
    } 
} 

The Game Scene

import UIKit 
import SpriteKit 

class GameScene: SKScene { 
    override func didMove(to view: SKView) { 

    backgroundColor = UIColor(red: CGFloat(248), green: CGFloat(248), blue: CGFloat(248), alpha: CGFloat(255)) //SKColor 

    var message = "Good Job! " 
    let label = SKLabelNode(fontNamed: "AppleSDGothicNeo-Bold") 
    label.text = message 
    label.fontSize = 22 
    label.fontColor = SKColor.blue 
    self.backgroundColor = SKColor.black 
    label.position = CGPoint(x: size.width/2, y: size.height/2) 
    addChild(label) 

    run(SKAction.sequence([ 

     SKAction.wait(forDuration: 1.0), 
     SKAction.run(){ 

     var scene = GameOver(size: self.size) 
     let skView = self.view! as SKView 
     skView.ignoresSiblingOrder = true 
     scene.scaleMode = .resizeFill 
     scene.size = skView.bounds.size 
     skView.presentScene(scene) 
    } 
    ])) 
    } 
} 
+1

Добавьте некоторые точки останова в свой код, чтобы определить, в каком коде блокируется приложение. Например, вызвано «didMove» или происходит сбой до – Stefan

+0

, когда я добавляю точку останова и начинаю играть в игру, и говорит, что их точка останова в этом разделе – Robert

+0

добавляет точки останова, пока вы не дойдете до строки, которая приведет к сбой вашего приложения. то вы clikc «переходите к следующей точке останова», и когда он падает, вы знаете, в какой строке проблема. – Fluidity

ответ

0

у меня было трудное время, воссоздавая вашу проблему в вопросе, так что я просто переписал его Ф.О. ты. Вот простая игра ... вы нажимаете шесть раз на главном экране, чтобы выиграть ... тогда он автоматически заставляет вас проигрывать после 1,5 секунд (ваша задержка)

на игре над экраном, которую вы нажимаете для сброса.

Если на главном экране вы перетаскиваете вместо крана, вы теряете мгновенно.

Я могу с радостью объяснить все, если вам нужно. Надеюсь, что это помогает:

import SpriteKit 

// Give us some functions that we can use in all of our scenes (inheritance): 
extension SKScene { 

// We don't need to use `self` anywhere for now, 
// because `size` and `view` are are already members of `SKScene`. 

    func goToGameOverScene() { 
    let scene  = GameOver(size: size) 
    scene.scaleMode = .resizeFill 

    view!.ignoresSiblingOrder = true 
    view!.presentScene(scene) 
    } 

    func goToCongratsScene() { 
    let congratsScene = Congrats(size: size) 
    let transition = SKTransition.reveal(with: SKTransitionDirection.down, 
              duration: 0) 
    congratsScene.scaleMode = .aspectFill 
    view!.presentScene(congratsScene, transition: transition) 
    } 

    func goToGameScene() { 
    let gameScene  = GameScene(size: size) 
    gameScene.scaleMode = .aspectFill 
    view!.presentScene(gameScene) 
    } 

    func makeLabel(text: String) { 
    let label  = SKLabelNode(fontNamed: "AppleSDGothicNeo-Bold") 
    label.text  = text 
    label.fontSize = 22 
    label.fontColor = SKColor.blue 
    label.position = CGPoint(x: size.width/2, y: size.height/2) 
    addChild(label) 
    } 
} 

class GameOver: SKScene { 

    override func didMove(to view: SKView) { 
    makeLabel(text: "Game Over!! Muahahaha!") 
    } 

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    goToGameScene() 
    } 
} 

class Congrats: SKScene { 

    override func didMove(to view: SKView) { 

    backgroundColor = SKColor(red: CGFloat(248), 
           green: CGFloat(248), 
           blue: CGFloat(248), 
           alpha: CGFloat(255)) 

    backgroundColor = SKColor.black // Not sure which color you wanted :) 

    makeLabel(text: "you won... or did you?") 

    run(.sequence([ 
     .wait(forDuration: 1.5), 
     .run() { self.goToGameOverScene() } // We have to use `self` here because in closure. 
    ])) 

    } 
} 

class GameScene: SKScene { 

    var countTouches = 0 

    override func didMove(to view: SKView) { 
    makeLabel(text: "Tap six times to 'win'~!") 
    } 

    // Six taps to win! 
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    countTouches += 1 
    if countTouches > 5 { goToCongratsScene() } 
    } 

    // Game over if you move your finger! 
    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
    goToGameOverScene() 
    } 
} 

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

Здесь я просто отделил все, предоставил ему свою функцию, поэтому вы можете следить за тем, куда движется туда, где мне немного легче.

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