2015-05-13 26 views
1

嘿傢伙即時通訊我的雪碧套件遊戲有一個巨大的問題。我是新來的,我試圖做一種小行星遊戲,只是爲了鍛鍊我學到的東西。意外地發現零,而解包一個可選值 - Sprite Kit

我的問題是,我的小行星是無限的,他們不停止,除非玩家被擊中。我的代碼是如下:

對於流星:

func addMeteor() { 

     let bigMeteor = SKSpriteNode(imageNamed: "meteor1") 

     let bigMeteorAux = bigMeteor 
     let sizeX = UInt32(CGRectGetMaxX(self.frame)) 
     let randomX = CGFloat(arc4random_uniform(sizeX)) 
     var impulse : CGVector! 

     bigMeteorAux.position = CGPoint(x: randomX, y: size.height + 100) 
     impulse = CGVector(dx: 0, dy: -30) 
     bigMeteorAux.physicsBody = SKPhysicsBody(texture: bigMeteor.texture, size: bigMeteor.size); 
     bigMeteor.physicsBody?.affectedByGravity = false 
     bigMeteor.physicsBody?.allowsRotation = false 
     bigMeteorAux.physicsBody?.friction = 0.0 
     bigMeteorAux.physicsBody!.categoryBitMask = CollisionCategoryAsteroids 
     bigMeteorAux.name = "Asteroid" 

     foregroundNode!.addChild(bigMeteorAux) 

     bigMeteorAux.physicsBody!.applyImpulse(impulse) 

    } 

林調用函數與動作:

runAction(SKAction.repeatActionForever(
     SKAction.sequence([ 
      SKAction.runBlock(addMeteor), 
      SKAction.waitForDuration(1.0) 
      ]) 
     )) 

完美到現在爲止,遊戲作品就好了。這是播放器代碼:

playerNode = SKSpriteNode(imageNamed: "spaceshipv2") 
    playerNode!.physicsBody = SKPhysicsBody(texture: playerNode!.texture, size: playerNode!.size); 
    playerNode!.xScale = 0.5 
    playerNode!.yScale = 0.5 
    playerNode!.position = CGPoint(x: size.width/2.0, y: 220.0) 
    playerNode!.physicsBody!.linearDamping = 1.0 
    playerNode!.physicsBody!.allowsRotation = false 
    playerNode!.physicsBody?.affectedByGravity = false 
    playerNode!.physicsBody!.categoryBitMask = CollisionCategoryPlayer 
    playerNode!.physicsBody!.contactTestBitMask = 
     CollisionCategoryAsteroids 
    playerNode!.name = "Player" 
    //addChild(playerNode!) 
    foregroundNode!.addChild(playerNode!) 

而最後的接觸FUNC:

func didBeginContact(contact: SKPhysicsContact) { 

     var nodeB = contact.bodyB!.node! 

     if nodeB.name == "Asteroid" { 

      println("Touched") 
      nodeB.removeFromParent() 
     } 

    } 

所以我的問題,節點B啓動,因爲某些原因,有時當小行星撞擊玩家此代碼的工作只是罰款,但其他時候,當小行星擊中玩家遊戲崩潰,我得到

fatal error: unexpectedly found nil while unwrapping an Optional value

程序進入聯繫功能後。

有關如何解決此問題的任何想法或解決方案?多謝! =)

回答

1

崩潰來自兩個強制拆解調用之一:bodyB!node!。通過這樣寫,你就斷言你確信他們永遠不會成爲nil

查找其中一個是零的情況的方法,將代碼分解成可以使用斷點檢查的行。

var bodyB = contact.bodyB 
if bodyB == nil { 
    // breakpoint here 
} 
var nodeB = bodyB!.node 
if nodeB == nil { 
    // breakpoint here 
} 
if nodeB!.name = "Asteroid" // etc. 

一旦代碼停止你可以檢查對象,並試圖找出爲什麼他們nil和解決問題。

+0

Thx很多mundi。 :)我不得不對你的代碼做一些改動,但無論如何,就像我對Cadin說的那樣,我想知道爲什麼相同的代碼給我80%的時間是一個有效的節點名稱,但其他20%給了我一個零。不要對我有任何意義。但是,無論如何! :)也許我應該在將節點添加到場景之前檢查是否有有效的名稱。 :) – Gusfat

1

我不知道爲什麼節點就要到了零,而且可以避開暴跌不會強迫展開的零值:

if let nodeB = contact.bodyB?.node? 
    if nodeB.name == "Asteroid" { 
     println("Touched") 
     nodeB.removeFromParent() 
    } 
} 

隨後的代碼位將只運行,如果這些自選能被成功解開。

+0

我雖然這樣做,但無論如何,我想了解發生了什麼。不合邏輯的是,有時候你的代碼使用一個有效的名字創建一個節點,並且在10〜15個循環中有1個(從我的測試中,但它不是一個常量值),相同的代碼使節點的值爲零。 oO 從我讀到的這一點來看,這是一個有效的方式來製作一個無盡的遊戲。我仍然想明白爲什麼即時獲得零,但thx很多的幫助。 :) – Gusfat

相關問題