2015-04-10 3 views
1

, когда я пытаюсь запустить мою игру, я получаю этуSwift Xcode "EXC_BAD_INSTRUCTION"

fatal error: unexpectedly found nil while unwrapping an Optional value 

с ошибкой Thread

EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)" 

Это происходит на этой строке кода

HighscoreLbl.text = NSString(format: "Highscore : %i", Highscore)

В моих играх

import SpriteKit 

class GameScene: SKScene, SKPhysicsContactDelegate { 


var movingGround: CSMovingGround! 
var hero: CSHero! 
var cloudGenerator: CSCloudGenerator! 
var wallGenerator: CSWallGenerator! 
var wall: CSWall! 
var scoreLabel = UILabel() 
var score = Int() 
var isStarted = false 

var heroCategory: UInt32 = 1<<1 
var wallCategory: UInt32 = 1<<2 
var groundCategory: UInt32 = 1<<2 
var invisCategory: UInt32 = 1<<3 
let walls = CSWall() 

var HighscoreLbl: UILabel! 
var Highscore = 0 


override func didMoveToView(view: SKView) { 
    backgroundColor = UIColor(red: 159.0/255.0, green: 201.0/255, blue: 244.0/255.0, alpha: 1.0) 

    /* 
    let backgroundTexture = SKTexture(imageNamed: "background.png") 
    let backgroundImage = SKSpriteNode(texture: backgroundTexture, size: view.frame.size) 
    backgroundImage.position = view.center 
    addChild(backgroundImage) 
    */ 

    var HighscoreDefault = NSUserDefaults.standardUserDefaults() 

    if (HighscoreDefault.valueForKey("Highscore") != nil){ 
     Highscore = HighscoreDefault.valueForKey("Highscore") as NSInteger! 
     HighscoreLbl.text = NSString(format: "Highscore : %i", Highscore) 
    } 


    // add ground 
    movingGround = CSMovingGround(size: CGSizeMake(view.frame.width, kCSGroundHeight)) 
    movingGround.position = CGPointMake(0, view.frame.size.height/2) 

    self.addChild(movingGround) 

    // add hero 
    hero = CSHero() 
    hero.position = CGPointMake(70, movingGround.position.y + movingGround.frame.size.height/2 + hero.frame.size.height/2) 
    hero.physicsBody = SKPhysicsBody(rectangleOfSize: hero.size) 
    hero.physicsBody?.dynamic = true 
    hero.physicsBody?.allowsRotation = false 
    hero.physicsBody!.collisionBitMask = heroCategory | wallCategory 
    hero.physicsBody!.contactTestBitMask = wallCategory | heroCategory | groundCategory 
    self.addChild(hero) 
    hero.breathe() 


    // add cloud generator 
    cloudGenerator = CSCloudGenerator(color: UIColor.clearColor(), size: view.frame.size) 
    cloudGenerator.position = view.center 
    addChild(cloudGenerator) 
    cloudGenerator.populate(7) 
    cloudGenerator.startGeneratingWithSpawnTime(5) 

    // add wall generator 

    wallGenerator = CSWallGenerator(color: UIColor.clearColor(), size: view.frame.size) 
    wallGenerator.position = view.center 
    wallGenerator.physicsBody = SKPhysicsBody(edgeLoopFromRect : wallGenerator.frame) 
    wallGenerator.physicsBody?.dynamic = true 
    wallGenerator.physicsBody?.categoryBitMask = wallCategory 
    wallGenerator.physicsBody?.affectedByGravity = false 
    wallGenerator.physicsBody!.collisionBitMask = 0 
    wallGenerator.physicsBody!.contactTestBitMask = invisCategory 

    self.addChild(wallGenerator) 


    let ground1 = SKSpriteNode(color: UIColor.clearColor(), size: CGSizeMake(view.frame.size.width, 15)) 
    ground1.position = view.center 
    ground1.physicsBody = SKPhysicsBody(rectangleOfSize: ground1.size) 
    ground1.physicsBody!.dynamic = false 
    ground1.physicsBody!.affectedByGravity = false 
    ground1.physicsBody!.categoryBitMask = groundCategory 
    ground1.physicsBody!.collisionBitMask = groundCategory | heroCategory 
    self.addChild(ground1) 

    let ground2 = SKSpriteNode(color: UIColor.clearColor(), size: CGSizeMake(view.frame.size.width, 20)) 
    ground2.position = CGPointMake(284, 98) 
    ground2.physicsBody = SKPhysicsBody(rectangleOfSize: ground2.size) 
    ground2.physicsBody!.dynamic = false 
    ground2.physicsBody!.affectedByGravity = false 
    ground2.physicsBody!.categoryBitMask = groundCategory 
    ground2.physicsBody!.collisionBitMask = groundCategory | heroCategory 
    self.addChild(ground2) 

    let ground3 = SKSpriteNode(color: UIColor.clearColor(), size: CGSizeMake(20, 500)) 
    ground3.position = CGPointMake(100, 100) 
    ground3.physicsBody = SKPhysicsBody(rectangleOfSize: ground3.size) 
    ground3.physicsBody?.dynamic = true 
    ground3.physicsBody?.affectedByGravity = false 
    ground3.physicsBody?.categoryBitMask = invisCategory 
    ground3.physicsBody!.collisionBitMask = 0 
    ground3.physicsBody!.contactTestBitMask = wallCategory 
    self.addChild(ground3) 

    physicsWorld.contactDelegate = self 

    scoreLabel = UILabel(frame: CGRect(x: 10, y: 15, width: 100, height: 20)) 
    scoreLabel.backgroundColor = UIColor(red: 0.6, green: 0.1, blue: 0.1, alpha: 0) 
    scoreLabel.textColor = UIColor.blackColor() 
    self.view?.addSubview(scoreLabel) 

    HighscoreLbl = UILabel(frame: CGRect(x: 10, y: 0, width: 300, height: 20)) 
    HighscoreLbl.textColor = UIColor.blackColor() 
    self.view?.addSubview(HighscoreLbl) 


} 


func start() { 
    isStarted = true 
    hero.stop() 
    hero.startRunning() 
    movingGround.start() 

} 

func addScore() { 
    score++ 
    scoreLabel.text = NSString(format: "Score : %i", score) 
    if (score > Highscore){ 
     Highscore = score 
     HighscoreLbl.text = NSString(format: "Highscore : %i", Highscore) 

     var HighscoreDefault = NSUserDefaults.standardUserDefaults() 
     HighscoreDefault.setValue(Highscore, forKey: "Highscore") 
     HighscoreDefault.synchronize() 
    } 

} 

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { 
    if !isStarted { 
     start() 
     score = 0 
     scoreLabel.text = NSString(format: "Score : %i", score) 
     wallGenerator.startGeneratingWallsEvery(0.5) 
    } else { 
     hero.flip() 
    } 


} 

func didBeginContact(contact: SKPhysicsContact) { 
    var firstBody = SKPhysicsBody() 
    var secondBody = SKPhysicsBody() 
    if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask { 
     firstBody = contact.bodyA 
     secondBody = contact.bodyB 
    } else { 
     firstBody = contact.bodyB 
     secondBody = contact.bodyA 
    } 

    if firstBody.categoryBitMask == invisCategory || secondBody.categoryBitMask == invisCategory { 
     self.addScore() 
    } 


    if (firstBody.categoryBitMask & UInt32(heroCategory)) != 0 && (secondBody.categoryBitMask & UInt32(wallCategory)) != 0 { 
     self.addScore() 
     wallGenerator.removeFromParent() 
     let reveal = SKTransition.flipHorizontalWithDuration(0.5) 
     let scene = GameOverScene(size: self.size, won: false) 
     self.view?.presentScene(scene, transition: reveal) 
     scoreLabel.removeFromSuperview() 
    } 


} 


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

} 
} 
+0

'self.Highscore' не относится к типу' NSInteger'. Это может быть вашей проблемой. – ravron

+0

@RileyAvron Извините, что вы подразумеваете под этим? Я новичок в кодировании, мне нужно добавить self.Highscore? Это то, что вы имели ввиду? –

+0

Упс, это была красная селедка. См. Мой ответ для актуальной проблемы. – ravron

ответ

2

Эта линия:

HighscoreLbl.text = NSString(format: "Highscore : %i", Highscore) 

неявно разворачивает HighscoreLbl перед тем как инициализировать его, позже:

HighscoreLbl = UILabel(frame: CGRect(x: 10, y: 0, width: 300, height: 20)) 
HighscoreLbl.textColor = UIColor.blackColor() 
self.view?.addSubview(HighscoreLbl) 

Это вызывает ваш крах. Вы должны инициализировать переменную, прежде чем пытаться ее использовать.

+0

Спасибо :) Это исправило мою проблему !! –

+0

Написание этого в 2016 году, и это по-прежнему правильный ответ :) –

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