2014-12-26 6 views
2

Swift로 SpriteKit을 사용하여 게임을 만들고 있습니다.SkScene에서 UIViewController로 NSNotificationCenter 사용

인터페이스 빌더를 사용하여 자동 레이아웃을 사용할 수 있도록 모든 버튼 (메뉴, 재시도 등)을 배치합니다. 그런 다음 NSNotificationCenter를 사용하여 SKScene에이 버튼을 게임 오버 기능으로 표시합니다. SKN에서 UIKit을 표시하는 데 NSNotificationCenter를 사용하는 데 아무런 문제가 없습니다.

여기 내 문제는 내가 시도하고 최선을 다해 설명 할 것입니다.

게임 오버가 발생하면 retry라는 UIButton이 표시됩니다. 재시도 기능을 위해 SKScene에 NSNotificationCenter 옵저버를 설정하고 viewController의 버튼에 대해 IBAction에서 postNotificationName을 호출합니다. 알림은 내가 처음 게임을로드 할 때 완벽하게 작동합니다. 재생하고 다시 시도하고 재생하고 다시 시도 할 수 있습니다.

그러나 메인 메뉴로 돌아가 게임을 다시로드하고 다시 시도하면 게임이 중단됩니다. 가끔은 그냥 (lldb). 인식 할 수없는 셀렉터가 인스턴스로 전송 된 다른 시간입니다. 이 인의 ViewController

class GameSceneViewController: UIViewController{ 

@IBOutlet weak var homeBtn: UIButton! 
@IBOutlet weak var retryBtn: UIButton! 

var userDefaults = NSUserDefaults.standardUserDefaults() 

//MARK: Button Actions 
@IBAction func returnToMenu(sender: UIButton) { 

    self.dismissViewControllerAnimated(true, completion: nil) 
} 

@IBAction func retryGame(sender: UIButton) { 

    NSNotificationCenter.defaultCenter().postNotificationName("retrygame", object: nil) 

} 
    override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 

    var scene: GameScene! 
    let skView = view as SKView 
    skView.showsFPS = false 
    skView.showsNodeCount = true 
    skView.showsPhysics = false 

    skView.ignoresSiblingOrder = true 

    scene = GameScene(size: skView.bounds.size) 
    scene.scaleMode = .AspectFill 

    skView.presentScene(scene) 

} 

이것은 GameScene입니다 : 여기

내가 지금까지 가지고있는 코드입니다
class GameScene: SKScene { 

//MARK: The View 
override func didMoveToView(view: SKView) { 

    self.backgroundColor = UIColor.grayColor() 
    setUpGame() 

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "retry", name: "retrygame", object: nil) 

} 

func retry(){ 

    print("test") 
} 

왜 이런 일이 무엇입니까? 왜 관측자는 첫 번째 놀이를 위해 먼저 일하지만, 나가서보기로 돌아간 후에 실패합니까? 더 이상 필요하지 않은 정보는 단지 의견을 게시하십시오. 어떤 도움이라도 정말 감사 할 것입니다!

답변

5

개체가 초기화되지 않은 상태에서 NSNotificationCenter에서 옵저버로 GameScene을 제거해야합니다.

아래 코드는 문제를 해결합니다.

deinit { 
    NSNotificationCenter.defaultCenter().removeObserver(self) 
} 
+0

답장을 보내 주셔서 감사합니다. 정확히 내가 이것을 어디에 추가합니까? GameSceneViewController 또는 GameScene (SkScene)에 이것을 추가합니까? – PoisonedApps

+0

통지에 대한 관찰자 인 오브젝트에이를 추가합니다. 귀하의 경우에는 GameScene입니다. self 나 GameScene 인스턴스를 전달할 때 addObserver()를 호출하면 객체가 관찰자라는 것을 추론 할 수 있습니다. – Cezar

관련 문제