Flashはクソ

ActionScriptシンタックス的なクソもいっぱいあるけど、それはスルーして...

ス レ ッ ド が な い

イベント駆動といういかにもマルチスレッドっぽい機能が標準で有るけど完全に罠だった。

具体的に困った場面...
ボードゲーム作ってたんですが、

interace AI {
	public function think(game:Game):int;
}

当然(?)こういうインターフェースを定義して、本当のAIも、人間も、その他(ネット越しとか)も一緒に扱いたいですよね

が、結論としてそれは出来ないっぽい



以下メモ

人間の選択をGUIから取ってくるクラスを書くぞー

class HumanAI implements AI {
	public function think(game:Game):int{
		gui.addEventListener(MyEvent.THINK, function(e:MyEvent){
				return e.ans;
		}
	}
}

全然間違ってた。コンパイルすら通らん...

class HumanAI implements AI {
	public function think(game:Game):Action{
		var ans:int = -1;
		gui.addEventListener(MyEvent.THINK, function(e:MyEvent):void{
				ans = e.ans;
		}
		while(ans == -1);
		return ans;
	}
}

コンパイルは通った。
でもフリーズしたオワタ。

イベントリスナーはFlashVMが暇になったら実行されるらしく、whileでずっと忙しいせいで固まってしまう。

class HumanAI implements AI {
	public function think(game:Game):int{
		var ans:int = -1;
		gui.addEventListener(MyEvent.THINK_FINISH, function(e:MyEvent):void{
				ans = e.ans;
		}
		while(ans == -1) sleep(1);
		return ans;
	}
}

こうか!?



sleepありません。



もしかして...インターフェース自体イベント駆動にすればいいのか?GUIに合わせるって癪だけど(よくわかってない)(いまここ)