我的应用程序遇到了一个大问题。当我转换到新的场景时,我的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)
}
}
点击按钮输入新的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场景。
为什么我的MainMenu场景在转换到新场景时没有被解除分配?
答案 0 :(得分:1)
你的问题不是动画动作,而是动作内部的动作。
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)
}
这样,一旦精灵从场景中移除,动画就会掉落,因为没有保留将其保留回来。 (注意,你需要为你的其他动画做这种方法)
答案 1 :(得分:0)
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)