2016-07-06 2 views
0

タイトルは、**の行に致命的なエラーが表示されています。しかし、それはどのようにすることができますか分からない?それは多くの演劇の後にのみ起こります。たぶん、それは配列からサウンドファイルを取得するため?また、didBeginContact関数の青い月に1回も発生します。アンラップ中のオプションなし値

var soundFiles = ["gary1", "gary2","gary3","gary4","gary5","gary6","gary7","gary8","gary9","gary10","gary11","gary12","gary13","gary14",] 
var audioPlayer: AVAudioPlayer = AVAudioPlayer() 

func setupAudioPlayer(file: NSString, type: NSString){ 
     let path = NSBundle.mainBundle().pathForResource(file as String, ofType: type as String) 
     **let url = NSURL.fileURLWithPath(path!)** 
     do { 
      try audioPlayer = AVAudioPlayer(contentsOfURL: url) 
     } 
     catch { 
      print("Player not available") 
     } 
    } 



func playRandomSound() { 
     let range: UInt32 = UInt32(soundFiles.count) 
     let number = Int(arc4random_uniform(range)) 

     self.setupAudioPlayer(soundFiles[number], type: "mp3") 

     self.audioPlayer.play() 
    } 
} 

FUNC didBeginContact(連絡先:SKPhysicsContact)コードは時々しかなく、他の人が作業しているときは、{

// 1 
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 
} 

// 2 
if ((firstBody.categoryBitMask & PhysicsCategory.Monster != 0) && 
    (secondBody.categoryBitMask & PhysicsCategory.Projectile != 0)) { 
*** projectileDidCollideWithMonster(firstBody.node as! SKSpriteNode, monster: secondBody.node as! SKSpriteNode)** 
} 
+1

場合によっては動作しない場合がありますが、いくつかのセーフガードを追加してから、ステートメントを印刷してクラッシュの状況を正確に確認することをお勧めします。たとえば、 'setupAudioPlayer()'関数に 'guard let path = ...'を追加します。他の人には、パラメータが何であったかを印刷します。また、SwiftのStringの代わりにNSStringをパラメータとして使用する理由はありますか? – TheBrownCoder

+0

いいえ理由はありません。あなたのガードを手伝ってパスの提案をさせてもらえますか? – BARIIIIIIICODE

+1

その場合は、コードを整理するために文字列に切り替えることをお勧めします。ガードステートメントは次のようになります: 'path(); path(); path {}; ) ");パスがnil(クラッシュを防ぐ)でなければ、あなたのコードは続くでしょう。そして、もしそれがnilになったら、ファイルとタイプが何であるかを知ることができます。 – TheBrownCoder

答えて

1

、私はからの保護をお勧めしているあなたの条件を確認するために、ガード文を使用して力アンラップコードが失敗しました。

func setupAudioPlayer(file: String, type: String){ 
    guard let path = NSBundle.mainBundle().pathForResource(file as String, ofType: type) else { 
     print("Failed to get path – file: \(file) type: \(type)") 
     return 
    } 
    let url = NSURL.fileURLWithPath(path) 
    do { 
     try audioPlayer = AVAudioPlayer(contentsOfURL: url) 
    } 
    catch { 
     print("Player not available") 
    } 
} 

この方法では、パスがnilではないことがわかっている場合にのみ、このコードは続行されます。

同様に、ガードステートメントを使用して2番目の問題をデバッグすることもできます。更新されたif文の例を次に示します。

if ((firstBody.categoryBitMask & PhysicsCategory.Monster != 0) && 
(secondBody.categoryBitMask & PhysicsCategory.Projectile != 0)) { 
    guard let firstNode = firstBody.node as? SKSpriteNode, let secondNode = secondBody.node as? SKSpriteNode else { 
     print("Could not Cast nodes. FirstNode Type: \(firstBody.node.dynamicType) SecondNode type: \(secondBody.node.dynamicType)") 
     return 
    } 
    projectileDidCollideWithMonster(firstBody.node as! SKSpriteNode,  monster: secondBody.node as! SKSpriteNode) 
} 

ご不明な点がありましたら教えてください。

+0

これまでのところ数分間ゲームを走らせていないか、クラッシュしていません。承認済みと表示されます。ありがとうございました。 – BARIIIIIIICODE

+0

@BARIIIIIIICODE運が良かった! – TheBrownCoder

関連する問題