SKScene与UIKit元素的场景转换(UIButtons,UILabel,...)

时间:2014-11-30 21:12:40

标签: ios swift uikit sprite-kit

我有一个SKScene菜单,SKSpriteNode作为背景,有3个UIButtons和1个UILabel。

当用户点击该按钮时,将触发此场景转换:

view?.presentScene(GameScene(size: view!.bounds.size), transition: SKTransition.fadeWithDuration(2))

场景确实发生变化(背景发生变化),但我的所有UIElements仍然存在。 是否有正确的方法在场景转换中删除它们?通过适当的方式,我的意思是垃圾收集器应该在某些时候从内存中释放菜单场景(如果还有UIElements则无法完成)。

2 个答案:

答案 0 :(得分:1)

如果要释放按钮,则必须从视图中删除它们。

值得考虑的是,这是否真的有必要?回收的内存量是否值得在以后重新添加这些按钮的额外费用?假设您可以返回菜单。

使用SpriteKit和UIKit元素进行视觉上吸引人的过渡有几个选项。虽然我不一定会推荐它们。

  1. 通过调整framealpha手动设置关闭屏幕的按钮。
  2. 从SKScene中移除转场,并使用transitionWithView:duration:options:animations:completion: transitionFromView:toView:duration:options:completion:
  3. 为UIView设置转场动画

    如果您无法使用这些令人满意的选项创建效果,则可能需要重新实现场景/视图以仅使用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的设置系统。