処理フレーム分割
「ローグライクマップ自動生成処理」を 現在作成している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クラス内のすべての処理が終了したことを意味します。
現在は「ローグライクマップ自動生成処理」に上記のような対処を各クラスに追加/変更中...
しかしなかなか動作してくれず。


