チェンジセット 1206

差分発生行の前後
無視リスト:
コミット日時:
2008/08/31 16:40:20 (4 年前)
コミッタ:
hael
ログメッセージ:

--

ファイル:

凡例:

変更無し
追加
削除
更新
コピー
移動
  • as3/GameAI/trunk

    • 属性の設定値: svn:ignore (変更前)
      gameai
      makeasdoc.bat
      (変更後)
      gameai
      makeasdoc.bat
      html-template
      makeasdoc.sh
  • as3/GameAI/trunk/src/GATest.as

    r1204 r1206  
    22{ 
    33        import flash.display.Sprite; 
     4        import flash.geom.Point; 
     5        import flash.utils.getTimer; 
    46         
    57        import jp.dip.hael.gameai.ga.GA; 
     
    2729                                trace(entity.evaluate()); 
    2830                        } 
     31 
    2932                } 
    3033 
  • as3/GameAI/trunk/src/TrackerTest.as

    r1205 r1206  
    44        import flash.events.Event; 
    55         
     6        import jp.dip.hael.gameai.tracker.LOS; 
    67        import jp.dip.hael.gameai.tracker.Tracker; 
    78         
     9         
     10        /** 
     11         * @private 
     12         */ 
    813        public class TrackerTest extends Sprite 
    914        { 
    10                 private var tr:Tracker; 
     15//              private var tr:Tracker; 
     16                private var los:LOS; 
    1117                private var sp:Sprite; 
    1218                 
    1319                public function TrackerTest() 
    1420                { 
    15                         tr = new Tracker(stage.stageWidth/2, stage.stageHeight/2, 5, 5); 
    16                         tr.addEventListener(Tracker.CAPTURE_TARGET, onCaptureTarget); 
    17                         tr.start(); 
     21//                      tr = new Tracker(stage.stageWidth/2, stage.stageHeight/2, 3, 30); 
     22//                      tr.start(); 
     23                         
     24                        los = new LOS(stage.stageWidth/2, stage.stageHeight/2, 3, 30); 
     25                        los.start(); 
     26                         
    1827                        sp = new Sprite(); 
     28                        sp.graphics.lineStyle(1, 0xFFFF0000); 
     29                        sp.graphics.moveTo(  0, -10); 
     30                        sp.graphics.lineTo( 10,  10); 
     31                        sp.graphics.lineTo(-10,  10); 
     32                        sp.graphics.lineTo(  0, -10); 
    1933                        addChild(sp); 
     34                         
    2035                        addEventListener(Event.ENTER_FRAME, onEnterFrame); 
    21                 } 
    22                  
    23                 public function onCaptureTarget(e:Event):void 
    24                 { 
    25                         tr.stop(); 
    2636                } 
    2737                 
    2838                public function onEnterFrame(e:Event):void 
    2939                { 
    30                         tr.update(mouseX, mouseY, 10); 
     40//                      tr.update(mouseX, mouseY); 
     41//                      sp.x = tr.x; 
     42//                      sp.y = tr.y; 
     43//                      sp.rotation = tr.rotation; 
     44 
     45                        los.update(mouseX, mouseY); 
     46                        sp.x = los.x; 
     47                        sp.y = los.y; 
     48                        los.rotation = 0; 
     49                        sp.rotation = los.rotation; 
     50                        //trace(los.lateralityToTarget(mouseX, mouseY)); 
    3151                         
    32                         sp.graphics.clear(); 
    33                         sp.graphics.beginFill(0xFFFF0000); 
    34                         sp.graphics.drawCircle(tr.x, tr.y, 10); 
    35                         sp.graphics.endFill(); 
     52//                      if(tr.isCapturingTarget){ 
     53                        if(los.isCapturingTarget){ 
     54                                sp.alpha = 1.0; 
     55                        }else{ 
     56                                sp.alpha = 0.3; 
     57                        } 
    3658                } 
    3759 
  • as3/GameAI/trunk/src/jp/dip/hael/gameai/tracker/LOS.as

    r1205 r1206  
    11package jp.dip.hael.gameai.tracker 
    22{ 
     3        import flash.events.Event; 
     4         
    35        /** 
    46         * LOS追跡<br /> 
     
    1012                 * @inheritDoc 
    1113                 */ 
    12                 public function LOS(x:Number, y:Number, vx:Number, vy:Number) 
     14                public function LOS(x:Number, y:Number, v:Number, zoc:Number) 
    1315                { 
    14                         super(x, y, vx, vy); 
     16                        super(x, y, v, zoc); 
    1517                } 
    1618                 
     
    1921                 * @inheritDoc 
    2022                 */ 
    21                 public override function update(targetX:Number, targetY:Number, zoc:Number=0.0):void 
     23                public override function update(targetX:Number, targetY:Number):void 
    2224                { 
     25                        if(isStopping_){ 
     26                                return; 
     27                        } 
     28                         
     29                        // ターゲットへの角度求めて 
     30                        var dx:Number = targetX - x, dy:Number = targetY - y; 
     31                        var angle:Number = Math.atan2(dy, dx); 
     32                         
     33                        // 速度求めて 
     34                        var vx:Number = Math.cos(angle) * v; 
     35                        var vy:Number = Math.sin(angle) * v; 
     36                         
     37                        // zocに入ったら捕捉 
     38                        var d:Number = Math.sqrt(dx*dx + dy*dy); 
     39                        if(d < zoc){ 
     40                                isCapturingTarget = true; 
     41                        }else{ 
     42                                isCapturingTarget = false; 
     43                        } 
     44                         
     45                        // 近づいたら吸着 
     46                        if(d < v){ 
     47                                vx = dx; 
     48                                vy = dy; 
     49                                rotation = 0; 
     50                        }else{ 
     51                                // 遠いときだけ回転する 
     52                                rotation = angle * Tracker.PI_180 + 90; 
     53                        } 
     54                         
     55                        //x += vx; 
     56                        //y += vy; 
    2357                } 
    2458                 
  • as3/GameAI/trunk/src/jp/dip/hael/gameai/tracker/Tracker.as

    r1205 r1206  
    11package jp.dip.hael.gameai.tracker 
    22{ 
    3         import flash.events.Event; 
    4         import flash.events.EventDispatcher; 
    5          
     3        import flash.geom.Point; 
    64         
    75        /** 
    86         * ターゲットを追いかける 
    97         */ 
    10         public class Tracker extends EventDispatcher 
     8        public class Tracker 
    119        { 
    12                 public static const CAPTURE_TARGET:String = "captureTarget"; 
    13                  
     10                /** 
     11                 * 現在地x座標 
     12                 */ 
    1413                public var x:Number; 
     14 
     15                /** 
     16                 * 現在地y座標 
     17                 */ 
    1518                public var y:Number; 
    1619                 
    17                 public var vx:Number; 
    18                 public var vy:Number; 
     20                /** 
     21                 * 回転角 
     22                 */ 
     23                public var rotation:Number; 
     24                 
     25                /** 
     26                 * 速度 
     27                 */ 
     28                public var v:Number; 
     29 
     30                /** 
     31                 * ターゲットを捕捉可能な距離 
     32                 */ 
     33                public var zoc:Number; 
     34                 
     35                /** 
     36                 * ターゲットを捕捉しているか 
     37                 */ 
     38                public var isCapturingTarget:Boolean; 
    1939                 
    2040                 
     
    2444                 * @param x x座標初期値 
    2545                 * @param y y座標初期値 
    26                  * @param vx x軸方向速度 
    27                  * @param vy y軸方向速度 
    28                *  
     46                 * @param v 速度 
     47                 * @param zoc ターゲットを捕捉可能な距離, "Zone Of Control" 
     48               *  
    2949                 */ 
    30                 public function Tracker(x:Number, y:Number, vx:Number, vy:Number
     50                public function Tracker(x:Number, y:Number, v:Number, zoc:Number = 0.0
    3151                { 
    3252                        this.x = x; 
    3353                        this.y = y; 
    3454                         
    35                         this.vx = vx; 
    36                         this.vy = vy; 
     55                        this.v = v; 
     56                         
     57                        this.zoc = zoc; 
     58                         
     59                        isCapturingTarget = false; 
    3760                         
    3861                        isStopping_ = true; 
     
    6386                 * @param targetX 追跡ターゲットのx座標 
    6487                 * @param targetY 追跡ターゲットのy座標 
    65                  * @param zoc ターゲットを捕捉可能な(マンハッタン)距離, "Zone Of Control" 
    6688                 * @eventType Tracker.CAPTURE_TARGET ターゲットを捕捉した 
    6789                 *  
    6890                 */ 
    69                 public function update(targetX:Number, targetY:Number, zoc:Number = 0.0):void 
     91                public function update(targetX:Number, targetY:Number):void 
    7092                { 
    7193                        if(isStopping_){ 
     
    7395                        } 
    7496                         
    75                         var x1:Number = 0, y1:Number = 0; 
     97                        var vx:Number = 0, vy:Number = 0; 
    7698                         
    7799                        if(x < targetX){ 
    78                                 x1 = vx
     100                                vx = v
    79101                        }else if(x > targetX){ 
    80                                 x1 = -vx
     102                                vx = -v
    81103                        } 
    82104                        if(y < targetY){ 
    83                                 y1 = vy
     105                                vy = v
    84106                        }else if(y > targetY){ 
    85                                 y1 = -vy
     107                                vy = -v
    86108                        } 
    87109                         
    88                         // 符号が同じ -> 斜め移動補正 
     110                        // 斜め移動の速度補正 
    89111                        if( 
    90                                 x1 > 0 && y1 > 0 || 
    91                                 x1 < 0 && y1 < 0 
     112                                vx > 0 && vy > 0 || 
     113                                vx < 0 && vy < 0 
    92114                        ){ 
    93                                 x1 *= 0.707106781
    94                                 y1 *= 0.707106781
     115                                vx *= Math.SQRT1_2
     116                                vy *= Math.SQRT1_2
    95117                        } 
    96118                         
    97                         // 近づいたときに奇麗に吸着させる 
     119                        // zocに入ったら捕捉 
    98120                        var dx:Number = targetX - x, dy:Number = targetY - y; 
    99                         dx = (dx > 0)? dx : -dx; 
    100                         dy = (dy > 0)? dy : -dy; 
    101                         if(dx < x1) x1 = dx; 
    102                         if(dy < y1) y1 = dy; 
    103                          
    104                         if(dx+dy < zoc){ 
    105                                 dispatchEvent(new Event(Tracker.CAPTURE_TARGET)); 
     121                        var d:Number = Math.sqrt(dx*dx + dy*dy); 
     122                        if(d < zoc){ 
     123                                isCapturingTarget = true; 
     124                        }else{ 
     125                                isCapturingTarget = false; 
    106126                        } 
    107127                         
    108                         //trace(x, y, x1, y1, dx, dy); 
     128                        // 近づいたら吸着 
     129                        if(d < v){ 
     130                                vx = dx; 
     131                                vy = dy; 
     132                                rotation = 0; 
     133                        }else{ 
     134                                // 遠いときだけ角度変える 
     135                                if(vx > 0){ 
     136                                        if(vy > 0)      rotation = 135; 
     137                                        else if(vy < 0) rotation =  45; 
     138                                        else            rotation =  90; 
     139                                }else if(vx < 0){ 
     140                                        if(vy > 0)      rotation = -135; 
     141                                        else if(vy < 0) rotation =  -45; 
     142                                        else            rotation =  -90; 
     143                                }else{ 
     144                                        if(vy > 0)      rotation = 180; 
     145                                        else if(vx < 0) rotation =   0; 
     146                                } 
     147                        } 
    109148                         
    110                         x += x1; 
    111                         y += y1; 
     149                         
     150                        x += vx; 
     151                        y += vy; 
    112152                } 
    113153                 
    114154                 
    115                 private var isStopping_:Boolean; 
     155                /** 
     156                 * 局所座標系で、ターゲットが右舷/左舷どちらにいるか調べる 
     157                 *  
     158                 * @param targetX ターゲットのx座標 
     159                 * @param targetY ターゲットのy座標 
     160                 * @return +1に近いほど右、-1に近いほど左 
     161                 */ 
     162                public function lateralityToTarget(targetX:Number, targetY:Number):Number 
     163                { 
     164                        // 距離求めて 
     165                        var dx:Number = targetX - x, dy:Number = targetY - y; 
     166                         
     167                        // 角度求めて 
     168                        var radRot:Number = -rotation * Tracker.PI_180; 
     169                        var cos:Number = Math.cos(radRot); 
     170                        var sin:Number = Math.sin(radRot); 
     171                         
     172                        // ベクトルに分解 
     173                        var x1:Number = dx * cos - dy * sin; 
     174                        var y1:Number = dx * sin + dy * cos; 
     175                         
     176                        // 正規化して返す 
     177                        return x1 / Math.sqrt(x1*x1 + y1*y1); 
     178                } 
     179                 
     180                protected static const PI_180:Number = Math.PI / 180.0; 
     181                 
     182                 
     183                protected var isStopping_:Boolean; 
    116184 
    117185        } 
  • as3/GameAI/trunk/src/jp/dip/hael/gameai/util/PriorityQueueDsc2.as

    r1201 r1206  
    11package jp.dip.hael.gameai.util 
    22{ 
     3        /** 
     4         * @private 
     5         */ 
    36        public class PriorityQueueDsc2 
    47        { 
  • as3/GameAI/trunk/src/jp/dip/hael/gameai/util/PriorityQueueElement.as

    r1201 r1206  
    11package jp.dip.hael.gameai.util 
    22{ 
     3        /** 
     4         * @private 
     5         */ 
    36        public class PriorityQueueElement 
    47        {