forked from: 関数を中断したい
ゲームのAIを作りたいのですが、制限時間があるとします。
選択時間内に_thinkが終わらなかった場合
とりあえずその時点でのselectionが参照されるようになっていますが、
もう考え続けないでいいのに考え続けてしまいます。
40行目の位置から_think関数を止めたいのですが、可能でしょうか?
たぶん、不可能です.
asでは一つの関数を実行してるときは、他の関数は実行されなかったと思います。
/**
* Copyright shohei909 ( http://wonderfl.net/user/shohei909 )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/nRuw
*/
// forked from enecre's 関数を中断したい
/*
ゲームのAIを作りたいのですが、制限時間があるとします。
選択時間内に_thinkが終わらなかった場合
とりあえずその時点でのselectionが参照されるようになっていますが、
もう考え続けないでいいのに考え続けてしまいます。
40行目の位置から_think関数を止めたいのですが、可能でしょうか?
たぶん、不可能です.
asでは一つの関数を実行してるときは、他の関数は実行されなかったと思います。
*/
package {
import flash.events.MouseEvent;
import flash.text.TextField;
import flash.display.Sprite;
public class FlashTest extends Sprite {
public function FlashTest() {
// write as3 code here..
var tf:TextField = new TextField();
tf.width = 400;
addChild(tf);
var moja:Ai = new Ai();
moja.addEventListener("complete",function():void{
tf.text = moja.str;
});
moja.think();
}
}
}
import flash.events.EventDispatcher;
import flash.events.Event;
import flash.events.TimerEvent;
import flash.utils.Timer;
import flash.utils.getTimer;
class Ai extends EventDispatcher{
public var str:String = "";
private var _timer1:Timer;
private var _timer2:Timer;
private var _selection:int;
public function get selection():int{return _selection;}
function Ai(){}
public function think():void{
_timer1 = new Timer(1000,1);
_timer2 = new Timer(3,1);
_timer1.addEventListener(TimerEvent.TIMER,function():void{
str +=" →中断用関数の呼び出し";
_timer1.stop();
dispatchEvent(new Event("complete"));
// _thinkの実行中はそもそもこの関数が呼び出されない。
});
_timer2.addEventListener(TimerEvent.TIMER,_think);
_timer1.start();
_timer2.start();
}
private function _think(e:Event = null):void{
//ここで考える、時間がかかるかもしれない
var startTime:int = getTimer();
var time:int = 0;
while(time < 2000){
time = getTimer() - startTime;
}
str += time + "ms";
_selection = 3;
_timer2.stop();
dispatchEvent(new Event("complete"));
}
}