SKScene没有退出

时间:2017-09-23 15:19:45

标签: ios swift sprite-kit skspritenode skscene

我的应用程序遇到了一个大问题。当我转换到新的场景时,我的MainMenu场景没有解除分配。

//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)

它打开了我的幸运场景,但它没有从主菜单调用deinit功能。

之后,如果我在Lucky场景中做同样的事情,例如我想离开场景并返回主菜单,那么它被解除分配的场景给我留下了一个巨大的问题。

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场景。

enter image description here

为什么我的MainMenu场景在转换到新场景时没有被解除分配?

2 个答案:

答案 0 :(得分:1)

你的问题不是动画动作,而是动作内部的动作。

SKAction.run(idle_animation)是对self的强烈引用,因此您的精灵持有idle_animationidle_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)
}

这样,一旦精灵从场景中移除,动画就会掉落,因为没有保留将其保留回来。 (注意,你需要为你的其他动画做这种方法)

答案 1 :(得分: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)