2017-09-23 6 views
2

私のアプリケーションに大きな問題が発生しました。私のMainMenuシーンは、新しいMainMenuシーンに移行するときに割り当て解除されません。SKSceneがdeinitしない

//GameViewController 

override func viewDidLoad() { 
    super.viewDidLoad() 

    if let view = self.view as! SKView? { 
     // Load the SKScene from 'GameScene.sks' 
     if let scene = MainMenu(fileNamed: "MainMenu") { 
      scene.scaleMode = .aspectFill 
      view.presentScene(scene) 
     } 
} 

enter image description here

私は、次のコードを持つ新しいSKSceneを入力してボタンをタップ:

let transition = SKTransition.doorsOpenHorizontal(withDuration: 1.0) 
let next_scene = LuckyScene(fileNamed: "LuckyScene") 
next_scene?.scaleMode = scaleMode 
view?.presentScene(next_scene!, transition: transition) 

それは私のラッキーシーンをopenesが、それは主からdeinit関数を呼び出すことはありません。メニュー。

私がラッキーシーンから同じことをした場合、たとえばシーンを離れてメインメニューに戻ると、シーンが割り当て解除されて大きな問題を残してしまいます。

let transition = SKTransition.doorsOpenHorizontal(withDuration: 1.0) 
let next_scene = MainMenu(fileNamed: "MainMenu") 
next_scene?.scaleMode = scaleMode 
view?.presentScene(next_scene!, transition: transition) 

ユーザがLucky Sceneに入ってから離れると、新しいMainMenuシーンが作成されます。私は新しいものに移行したときに、私のMainMenuシーンの割り当てが解除取得されていないのはなぜ

enter image description here

+0

あなたのMainMenuへの参照があります。そのプロパティを見つけて弱くする – Fluidity

+0

https://developer.apple.com/ライブラリ/コンテンツ/ドキュメント/ Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html – Fluidity

答えて

0

長い時間がたって、答えが見つかりました。問題は、このSKActionが削除されなかったことです。

let bear_animation : SKAction = SKAction.repeatForever(SKAction.sequence([SKAction.run(idle_animation), SKAction.wait(forDuration: 2.0), SKAction.run(wave_animation), SKAction.wait(forDuration: 3.0)]))   
run(bear_animation, withKey: "bear_animation") 

func idle_animation() 
{ 
    left_arm.run(idle_left_arm)  
    right_arm.run(idle_right_arm) 
    body.run(idle_body) 
} 

func wave_animation() 
{ 
    right_arm.run(wave_right_arm_1) 
    right_arm.run(wave_right_arm_2) 
    left_arm.run(wave_left_arm) 
    body.run(wave_body) 
    left_pupil.run(wave_pupil) 
    right_pupil.run(wave_pupil) 
    left_eyebrow.run(wave_eyebrow) 
    right_eyebrow.run(wave_eyebrow) 
} 

私は新しいシーンを提示していたときに、このようなコードを追加しました。

removeAction(forKey: "bear_animation") 

let transition = SKTransition.doorsOpenHorizontal(withDuration: 1.0) 
let next_scene = LuckyScene(fileNamed: "LuckyScene") 
next_scene?.scaleMode = scaleMode 
view?.presentScene(next_scene!, transition: transition) 
0

問題はアニメーションアクションではなく、その内部のアクションです。

SKAction.run(idle_animation)selfへの強い参照であるので、あなたのスプライトがidle_animation上に保持している、とidle_animationはあなたの保持カウントは、私は機能の使用を避け、代わりに弱い自己クロージャを使用することになり、0に行くことは決してありませんを意味し、スプライトに上に保持されますそれをバック保持保持が何があるので

var idle_animation = 
{ 
    [weak self] in 
    guard let strongSelf = self else return 
    strongSelf.left_arm.run(strongSelf.idle_left_arm)  
    strongSelf.right_arm.run(strongSelf.idle_right_arm) 
    strongSelf.body.run(strongSelf.idle_body) 
} 

アニメーションがスプライトたらドロップします。この方法は、シーンから削除されていません。 (他のアニメーションにもこのアプローチを行う必要があります)

+0

さらに質問がありますが、あなたのTwitterを入手できますか? –

関連する問題