我使用默认的新游戏项目制作了一个游戏,然后插入了一个普通的UIView作为app intro场景.我自从'升级'介绍到使用SKScene,其中的按钮将原始的gameViewController推入堆栈.一旦加载了游戏视图,它似乎有点滞后,所以我假设这与2个完整的skscenes和视图控制器的开销有关.我甚至将着陆场景设置为暂停,但它显然仍会使用内存!
我的问题是,我如何使用SKScene作为登陆页面(使用它自己的LandingViewController),然后有效地将GameViewController添加到堆栈中.我试过合并2个视图控制器,但这似乎是一种愚蠢的做事方式.
目前的设置:
LandingViewController
|-LandingScene
GameViewController
|- GameViewScene
|- Other Game Classes
Run Code Online (Sandbox Code Playgroud)
应用程序进入LandingViewController,它位于LandingScene(和登陆UI Sprites)中.LandingViewController处理触摸事件,如按钮等.当点击新游戏时,推动GameViewController(目前使用Segue)和GameViewController进入它的场景,游戏状态,UI,游戏板等.GameViewController处理它的场景触摸事件.当游戏结束时(点击结束游戏或游戏状态),将弹出GameViewController.
LandingViewController和GameViewController都控制着他们的动画和点击等流程,因此GameViewController可以完成游戏逻辑,就像下一轮游戏等等.任何帮助或指针都会受到赞赏,因为我想这样做!
我正在制作精灵工具包游戏,我正在使用plist文件来设置每个级别的属性.我的plist文件中的一个属性是一个名为patterns的字典,它包含n个项目,其中每个项目都是一个块,带有手动键入的x和y位置.这个模型对于我正在制作的游戏来说非常合适,因为以快速的方式设置关卡非常方便.然而,由于缺乏编码经验,我面临一个我无法解决的缺点:一些级别有多达290个块,所以当应用程序尝试读取级别时,应用程序会冻结5秒钟.这对用户来说非常烦人.在开始时我的方法是:读取plist文件,并为每个项目调用使用其imageNamed""方法创建块作为SKSpriteNode的方法.我认为这就是它落后的原因,我试图在运行时加载300个精灵的事实似乎是这个问题的一个有希望的原因.然后我尝试了以下内容:当游戏第一次启动时,我创建了最初加载块池的方法.这是我的方法
func addObsticles1ToPool() {
for i in 0...300 {
let element = SKSpriteNode(imageNamed: "obsticle1")
element.hidden = true
obsticle1Pool.append(element)
}
}
Run Code Online (Sandbox Code Playgroud)
然后,我的代码读取plist文件,并为每个块调用以下内容:
func block(x: CGFloat, y: CGFloat, movingUp: Bool, movingSide: Bool, spin: Bool, type: Int16) {
var block: SKSpriteNode!
for obs in obsticle1Pool {
if obs.hidden {
block = obs
break
}
}
block.hidden = false
// Further down the properties of the block are set, such as actions it should perform depending on the input values, also its physics body …Run Code Online (Sandbox Code Playgroud)