チェンジセット 1206
- コミット日時:
- 2008/08/31 16:40:20 (4 年前)
- ファイル:
-
- as3/GameAI/trunk (更新) (1 prop)
- as3/GameAI/trunk/src/GATest.as (更新) (2 diffs)
- as3/GameAI/trunk/src/TrackerTest.as (更新) (1 diff)
- as3/GameAI/trunk/src/jp/dip/hael/gameai/tracker/LOS.as (更新) (3 diffs)
- as3/GameAI/trunk/src/jp/dip/hael/gameai/tracker/Tracker.as (更新) (4 diffs)
- as3/GameAI/trunk/src/jp/dip/hael/gameai/util/PriorityQueueDsc2.as (更新) (1 diff)
- as3/GameAI/trunk/src/jp/dip/hael/gameai/util/PriorityQueueElement.as (更新) (1 diff)
凡例:
- 変更無し
- 追加
- 削除
- 更新
- コピー
- 移動
as3/GameAI/trunk
- 属性の設定値: svn:ignore (変更前)
gameai
makeasdoc.bat
(変更後)
gameai
makeasdoc.bat
html-template
makeasdoc.sh
- 属性の設定値: svn:ignore (変更前)
as3/GameAI/trunk/src/GATest.as
r1204 r1206 2 2 { 3 3 import flash.display.Sprite; 4 import flash.geom.Point; 5 import flash.utils.getTimer; 4 6 5 7 import jp.dip.hael.gameai.ga.GA; … … 27 29 trace(entity.evaluate()); 28 30 } 31 29 32 } 30 33 as3/GameAI/trunk/src/TrackerTest.as
r1205 r1206 4 4 import flash.events.Event; 5 5 6 import jp.dip.hael.gameai.tracker.LOS; 6 7 import jp.dip.hael.gameai.tracker.Tracker; 7 8 9 10 /** 11 * @private 12 */ 8 13 public class TrackerTest extends Sprite 9 14 { 10 private var tr:Tracker; 15 // private var tr:Tracker; 16 private var los:LOS; 11 17 private var sp:Sprite; 12 18 13 19 public function TrackerTest() 14 20 { 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 18 27 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); 19 33 addChild(sp); 34 20 35 addEventListener(Event.ENTER_FRAME, onEnterFrame); 21 }22 23 public function onCaptureTarget(e:Event):void24 {25 tr.stop();26 36 } 27 37 28 38 public function onEnterFrame(e:Event):void 29 39 { 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)); 31 51 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 } 36 58 } 37 59 as3/GameAI/trunk/src/jp/dip/hael/gameai/tracker/LOS.as
r1205 r1206 1 1 package jp.dip.hael.gameai.tracker 2 2 { 3 import flash.events.Event; 4 3 5 /** 4 6 * LOS追跡<br /> … … 10 12 * @inheritDoc 11 13 */ 12 public function LOS(x:Number, y:Number, v x:Number, vy:Number)14 public function LOS(x:Number, y:Number, v:Number, zoc:Number) 13 15 { 14 super(x, y, v x, vy);16 super(x, y, v, zoc); 15 17 } 16 18 … … 19 21 * @inheritDoc 20 22 */ 21 public override function update(targetX:Number, targetY:Number , zoc:Number=0.0):void23 public override function update(targetX:Number, targetY:Number):void 22 24 { 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; 23 57 } 24 58 as3/GameAI/trunk/src/jp/dip/hael/gameai/tracker/Tracker.as
r1205 r1206 1 1 package jp.dip.hael.gameai.tracker 2 2 { 3 import flash.events.Event; 4 import flash.events.EventDispatcher; 5 3 import flash.geom.Point; 6 4 7 5 /** 8 6 * ターゲットを追いかける 9 7 */ 10 public class Tracker extends EventDispatcher8 public class Tracker 11 9 { 12 public static const CAPTURE_TARGET:String = "captureTarget"; 13 10 /** 11 * 現在地x座標 12 */ 14 13 public var x:Number; 14 15 /** 16 * 現在地y座標 17 */ 15 18 public var y:Number; 16 19 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; 19 39 20 40 … … 24 44 * @param x x座標初期値 25 45 * @param y y座標初期値 26 * @param v x x軸方向速度27 * @param vy y軸方向速度28 *46 * @param v 速度 47 * @param zoc ターゲットを捕捉可能な距離, "Zone Of Control" 48 * 29 49 */ 30 public function Tracker(x:Number, y:Number, v x:Number, vy:Number)50 public function Tracker(x:Number, y:Number, v:Number, zoc:Number = 0.0) 31 51 { 32 52 this.x = x; 33 53 this.y = y; 34 54 35 this.vx = vx; 36 this.vy = vy; 55 this.v = v; 56 57 this.zoc = zoc; 58 59 isCapturingTarget = false; 37 60 38 61 isStopping_ = true; … … 63 86 * @param targetX 追跡ターゲットのx座標 64 87 * @param targetY 追跡ターゲットのy座標 65 * @param zoc ターゲットを捕捉可能な(マンハッタン)距離, "Zone Of Control"66 88 * @eventType Tracker.CAPTURE_TARGET ターゲットを捕捉した 67 89 * 68 90 */ 69 public function update(targetX:Number, targetY:Number , zoc:Number = 0.0):void91 public function update(targetX:Number, targetY:Number):void 70 92 { 71 93 if(isStopping_){ … … 73 95 } 74 96 75 var x1:Number = 0, y1:Number = 0;97 var vx:Number = 0, vy:Number = 0; 76 98 77 99 if(x < targetX){ 78 x1 = vx;100 vx = v; 79 101 }else if(x > targetX){ 80 x1 = -vx;102 vx = -v; 81 103 } 82 104 if(y < targetY){ 83 y1 = vy;105 vy = v; 84 106 }else if(y > targetY){ 85 y1 = -vy;107 vy = -v; 86 108 } 87 109 88 // 符号が同じ -> 斜め移動補正110 // 斜め移動の速度補正 89 111 if( 90 x1 > 0 && y1> 0 ||91 x1 < 0 && y1< 0112 vx > 0 && vy > 0 || 113 vx < 0 && vy < 0 92 114 ){ 93 x1 *= 0.707106781;94 y1 *= 0.707106781;115 vx *= Math.SQRT1_2; 116 vy *= Math.SQRT1_2; 95 117 } 96 118 97 // 近づいたときに奇麗に吸着させる119 // zocに入ったら捕捉 98 120 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; 106 126 } 107 127 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 } 109 148 110 x += x1; 111 y += y1; 149 150 x += vx; 151 y += vy; 112 152 } 113 153 114 154 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; 116 184 117 185 } as3/GameAI/trunk/src/jp/dip/hael/gameai/util/PriorityQueueDsc2.as
r1201 r1206 1 1 package jp.dip.hael.gameai.util 2 2 { 3 /** 4 * @private 5 */ 3 6 public class PriorityQueueDsc2 4 7 { as3/GameAI/trunk/src/jp/dip/hael/gameai/util/PriorityQueueElement.as
r1201 r1206 1 1 package jp.dip.hael.gameai.util 2 2 { 3 /** 4 * @private 5 */ 3 6 public class PriorityQueueElement 4 7 {

