In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

forked from: 関数を中断したい

ゲームのAIを作りたいのですが、制限時間があるとします。
選択時間内に_thinkが終わらなかった場合
とりあえずその時点でのselectionが参照されるようになっていますが、
もう考え続けないでいいのに考え続けてしまいます。
40行目の位置から_think関数を止めたいのですが、可能でしょうか?


たぶん、不可能です.
asでは一つの関数を実行してるときは、他の関数は実行されなかったと思います。
Get Adobe Flash player
by shohei909 27 Jun 2010

    Talk

    enecre at 27 Jun 2010 19:42
    なるほど!ありがとうございます!!
    Embed
/**
 * 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"));
    }
}