処理フレーム分割
「ローグライクマップ自動生成処理」を 現在作成しているFlashLiteゲーム「トレジャーボインゴ」に組み込んでみた所 携帯端末上ではエラーが発生し動作しなくなった、と以前blogに記述しました。1フレーム内で処理する行数が多すぎたためエラーが発生しているものと思われます。
「ローグライクマップ自動生成処理」のみを携帯端末で動作させてみたところ、同じくエラーが発生。「ローグライクマップ自動生成処理」を行う各クラス内のメソッドを複数のフレームをまたぎつつ呼び出す必要がありそうです。
対処として以下のような方法をとることにしました。
【 メインクラスの変更 】
メインとなる Sampleクラス があるとします。
class Sample{ private var testA:TestA; private var testB:TestB; private var testC:TestC; public function Sample(root:MovieClip){ testA = new TestA(); testB = new TestB(); testC = new TestC(); testA.run(); testB.run(); testC.run(); } }
TestA~Cクラスの runメソッドを実行すると それぞれの処理行数が多すぎてエラーが発生してしまう、という場合、各runメソッドを1フレームにつき一つずつ実行するためには以下の様に変更します。
class Sample{ private var testA:TestA; private var testB:TestB; private var testC:TestC; private var main:Function = null; public function Sample(root:MovieClip){ testA = new TestA(); testB = new TestB(); testC = new TestC(); main = funcA; var sc:Sample = this; root.onEnterFrame = function(){ sc.run(); } } private function run():Void{ main(); } private function funcA():Void{ testA.run(); main = funcB; } private function funcB():Void{ testB.run(); main = funcC; } private function funcC():Void{ testC.run(); main = end; } private function end():Void{ ~ } }
上記変更により、一つのフレームで実行される処理は mainメソッドのみとなります。実際は、mainメソッドの参照先メソッド(funcA~C)が実行されます。参照先メソッド内の処理終了後 次に行いたい処理を再び mainメソッドに代入し、次々とTestA~Cクラスの runメソッドを実行していきます。
【 各クラスの変更 】
ここで TestA クラス の内容が以下のようになっているとします。
class TestA{ public function TestA(){} public function run():Void{ func1(); func2(); func3(); } private function func1():Void{ ~ } private function func2():Void{ ~ } private function func3():Void{ ~ } }
TestAクラスの func1~3 メソッドの処理行数が多く、TestA.runメソッドを実行するとエラーが発生してしまう場合、以下の用に変更します。
class TestA{ private var main:Function = null; public function TestA(){} public function run():Boolean{ if(main == null) main = func1; main(); return main == null; } private function func1():Void{ ~ main = func2; } private function func2():Void{ ~ main = func3; } private function func3():Void{ ~ main = null; } }
また、Sampleクラス の funcAメソッド を以下の用に変更します。
~ private function funcA():Void{ if(testA.run()) main = funcB; } ~ }
これにより、TestAクラス内の各メソッドが1つのフレームで一つだけ実行されるようになります。TestA.runメソッドから true が返ると、TestAクラス内のすべての処理が終了したことを意味します。
現在は「ローグライクマップ自動生成処理」に上記のような対処を各クラスに追加/変更中...
しかしなかなか動作してくれず。