2016-07-06 3 views
0

제목에 **으로 줄에 치명적인 오류가 있음을 알리는 메시지가 표시됩니다. 그래도 그것이 어떻게 될 수 있는지 모르겠지만? 그것은 많은 연극 이후에만 발생합니다. 어쩌면 그 배열에서 사운드 파일을 받기 때문에? 또한 didBeginContact 함수에서 파란 달에 매번 발생합니다.언 래핑 중 선택 값 값

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

이 경우 문자열을 코드로 정리하는 것이 좋습니다. guard 명령문은 다음과 같이됩니다 :'path (path) : path (path) : path (path) ';) "); return}'그렇다면 path가 nil (크래쉬 방지)이 아닌 경우에만 코드가 실행되고, nil이 아닌 경우 파일과 유형을 확인할 수 있습니다. – TheBrownCoder

답변

1

, 나는-펼쳤다 힘 조건을보고 가드 문을 사용하여에 대한 보호 추천하는 아래 당신의 코드가 실패했습니다. 당신이 그 경로가 nil이 아닌 확신하는 경우

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") 
    } 
} 

이 방법, 코드는 계속 : 두 가지 방법을 다시 작성하려면 문제가 있었다.

마찬가지로, guard 문을 사용하여 두 번째 문제를 디버깅 할 수도 있습니다. 다음은 업데이트 된 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