我有一个SKScene菜单,SKSpriteNode作为背景,有3个UIButtons和1个UILabel。
当用户点击该按钮时,将触发此场景转换:
view?.presentScene(GameScene(size: view!.bounds.size), transition: SKTransition.fadeWithDuration(2))
场景确实发生变化(背景发生变化),但我的所有UIElements仍然存在。 是否有正确的方法在场景转换中删除它们?通过适当的方式,我的意思是垃圾收集器应该在某些时候从内存中释放菜单场景(如果还有UIElements则无法完成)。
答案 0 :(得分:1)
如果要释放按钮,则必须从视图中删除它们。
值得考虑的是,这是否真的有必要?回收的内存量是否值得在以后重新添加这些按钮的额外费用?假设您可以返回菜单。
使用SpriteKit和UIKit元素进行视觉上吸引人的过渡有几个选项。虽然我不一定会推荐它们。
如果您无法使用这些令人满意的选项创建效果,则可能需要重新实现场景/视图以仅使用SpriteKit元素。
答案 1 :(得分:1)
这里有两种选择。首先是继续使用UIKit元素并在转换到游戏场景时主动删除它们。例如,您可以设置一种在按下游戏按钮时执行相同操作的方法:
func hideButtons () {
//Hide your buttons and label here.
btn.hidden = true //Either hide it
btn.removeFromSuperview() //or remove it altogether.
...
}
然后在呈现场景之前调用此方法。
self.hideButtons()
view?.presentScene(GameScene(size: view!.bounds.size), transition: SKTransition.fadeWithDuration(2))
或者,您可以使用触摸代理在SKScene中实现一个按钮。
使用与按钮相同的框架声明SKSpriteNode。当您检测到按钮上的触摸时,触发场景更改。
另一种选择是使用像AGSpriteButton这样的类。它有一个非常类似于UIButton的设置系统。