2016-06-10 2 views
1

В моем маленьком проекте Xcode Я пытаюсь переместить сцены, когда мой SKLabelNode коснулся его, представляет следующую сцену. По какой-то причине в моем методе перехода в сцену я заставляю его хранить его как необязательный. Опция возвращает false. Мои имена файлов верны, и никакие грамматические ошибки в ссылках не будут причиной проблемы здесь, это мой код. Когда я нажимаю мою платформу SKLabelNode, моя платформа ios, которая ее запускает, распознает прикосновение, приложение отключается в консоли, говоря, что необязательное значение возвращает nil. Как я могу решить эту проблему? СпасибоSKScene возвращает nil, когда метод перехода называется

import SpriteKit 

class GameScene: SKScene { 

let next = SKScene(fileNamed: "nextScene") 

override func didMoveToView(view: SKView) { 


    let backgroundimage = SKSpriteNode(imageNamed: "ipbg") 
    backgroundimage.size = CGSize(width: self.frame.size.width, height: self.frame.size.height) 
    backgroundimage.position = CGPoint(x: self.frame.size.width/2, y: self.frame.size.height/2) 
    addChild(backgroundimage) 

    let playButton = SKLabelNode(fontNamed: "") 
    playButton.name = "play" 
    playButton.position = CGPoint(x: self.frame.size.width/2, y: self.frame.size.height/2 + 100) 
    playButton.text = "Play" 

    let wait = SKAction.waitForDuration(2) 
    let run = SKAction.runBlock({ 


     let randomNumber = Int(arc4random_uniform(UInt32(4))) 

     switch(randomNumber){ 

     case (0): 

      playButton.fontColor = UIColor.blueColor() 

     case 1: 

      playButton.fontColor = UIColor.yellowColor() 

     case 2: 

      playButton.fontColor = UIColor.purpleColor() 

     case 3: 

      playButton.fontColor = UIColor.orangeColor() 

     default: print("default") 


     } 

    }) 

    addChild(playButton) 
    var repeatActionForever = SKAction.repeatActionForever(SKAction.sequence([wait, run])) 
    runAction(repeatActionForever) 
} 

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 

    let trans = SKTransition.crossFadeWithDuration(1) 
    let touch = touches.first! as UITouch 
    let touchLocation = touch.locationInNode(self) 
    let touchedNode = nodeAtPoint(touchLocation) 

    if touchedNode.name == "play"{ 


     scene!.view?.presentScene(next!, transition: trans) 

     } 

    } 
} 

func update(currentTime: CFTimeInterval) { 
    /* Called before each frame is rendered */ 
} 
+0

Просьба указать строку кода, в которой приложение вызывает сбой. А также добавьте полное сообщение об ошибке. –

ответ

0

Код, который вы отправили, не компилируется, поэтому трудно найти ошибку.

Однако я хотел бы попробовать заменить метод touchesBegan со следующим

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 

    let trans = SKTransition.crossFadeWithDuration(1) 
    let touch = touches.first! as UITouch 
    let touchLocation = touch.locationInNode(self) 
    let touchedNode = nodeAtPoint(touchLocation) 

    if touchedNode.name == "play"{ 
     guard let nextScene = SKScene(fileNamed: "nextScene") 
      else { fatalError("Could not load nextScene") } 
     self.view?.presentScene(nextScene, transition: trans) 
    } 
} 
0

Там нет необходимости хранить сцену, как это свойство просто добавить его в касаний начал метод.

Также вы должны создать соответствующий быстрый файл и класс для каждой сцены вместо того, чтобы пытаться инициализировать файл .sks с помощью общего объекта SKScene. Строка ... (fileNamed: «nextScene») ищет файл .sks (файл редактора визуального уровня Xcode), если вы еще не создали его, ваше свойство будет равно nil.

Чтобы сделать его работу это сделать:

Сначала убедитесь, что вы создали файл с именем .sks NextScene (правой кнопкой мыши файл в вашем проекте -> New -> Resource -> SpriteKit Scene)

Во-вторых создать новый быстрый файл и создать новый класс NextScene

class NextScene: SKScene { 

} 

чем код загрузки в вашей касаний функции этикетки будет выглядеть следующим образом.

override func touchesBegan... { 
     ... 

     if let nextScene = NextScene(fileNamed: "NextScene") //actually init the corresponding class with the corresponding .sks file 
     /// scene presenting code 
     } 

    } 

Как вы упомянули вашу собственность сцены возвращает необязательную, поскольку fileNamed (.sks файл), указанный может не существует, так что проверить это там. В целом, его лучшая практика для безопасного разворота, как я делаю выше, или код загрузки по умолчанию в GameViewController, вместо того, чтобы просто принудительно разворачивать с помощью! ,

Если вы не используете редактор визуального уровня, чем просто создать класс сцены и игнорировать создание файла .sks и загрузить сцену, как так

let nextScene = NextScene(size: self.size) // use current scene size 
    /// scene presenting code 

Примечание: Ваши имена файлов должны начинаться с прописных букв

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

  • Нет связанных вопросов^_^