Swift で SpriteKit を使用してゲームを書いていますが、メモリの問題が発生しました。
私のゲームのレイアウトは、GameViewController (UIViewController) が最初の SKScene (levelChooserScene) を viewDidLoad 画面に表示するようなものです。このシーンは、たくさんのボタンを表示するだけです。ユーザーがボタンを選択すると、シーンは skView.presentScene を使用して正しいシーンに移行し、レベルが完了すると、そのシーンは levelChooserScene に戻り、ゲームはユーザーが次のレベルを選択できるようになります。
問題は、levelChooserScene に戻る遷移が発生したときに、ゲーム プレイ シーンに割り当てられたメモリの割り当てが解除されないことです。そのため、いくつかのレベルを選択しただけで、メモリ エラーが発生し始めます。
私の設計は SKScene から SKScene への遷移で正しいですか、それとも代わりに毎回 GameViewController に戻り、そこから次の SKScene に遷移する必要がありますか?
ここで、シーン間で skView.presentScene(nil) を呼び出す必要があるといういくつかの投稿を見つけましたが、それを実装する方法または場所について混乱しています。
ある SKScene から別の SKScene に移行し、送信シーンから使用されたメモリをシステムに戻したいだけです。
これは、SKScene の実装方法の例です。
class Level3: SKScene
{
var explodingRockTimer = NSTimer()
var blowingUpTheRocks = SKAction()
override func didMoveToView(view: SKView)
{
NSTimer.scheduledTimerWithTimeInterval(5.0, target: self, selector: "dismissTheScene:", userInfo: nil, repeats: false)
var wait = SKAction.waitForDuration(0.5)
var run = SKAction.runBlock{
// your code here ...
self.explodeSomeRocks()
}
let runIt = SKAction.sequence([wait,run])
self.runAction(SKAction.repeatActionForever(runIt), withKey: "blowingUpRocks")
var dismissalWait = SKAction.waitForDuration(5.0)
var dismissalRun = SKAction.runBlock{
self.removeActionForKey("blowingUpRocks")
self.dismissTheScene()
}
self.runAction(SKAction.sequence([dismissalWait,dismissalRun]))
}
func explodeSomeRocks()
{
println("Timer fired")
}
//MARK: - Dismiss back to the level selector
func dismissTheScene()
{
let skView = self.view as SKView?
var nextScene = SKScene()
nextScene = LevelChooserScene()
nextScene.size = skView!.bounds.size
nextScene.scaleMode = .AspectFill
var sceneTransition = SKTransition.fadeWithColor(UIColor.blackColor(), duration: 1.5) //WithDuration(2.0)
//var sceneTransition = SKTransition.pushWithDirection(SKTransitionDirection.Down, duration: 0.75) //WithDuration(2.0)
//var sceneTransition = SKTransition.crossFadeWithDuration(1.0)
//var sceneTransition = SKTransition.doorwayWithDuration(1.0)
sceneTransition.pausesOutgoingScene = true
skView!.presentScene(nextScene, transition: sceneTransition)
}
}