2011-05-12 37 views
4

我正在尝试在AS3中创建一个归属导弹。当你想让它完美地遵循一个点时,就足够简单了 - 但我试图让火箭不得不在目标(目标)旁边绕过它。AS3中的归位导弹

下面是我得到了什么 - 它几乎工作,但你可以看到它是相当出问题(尤其是如果鼠标到离开火箭的(看来,如果它的移动工作权OK)

http://projectavian.com/rocket.swf

这里是我的火箭类:

package 
{ 
    import flash.display.Sprite; 
    import flash.geom.Point; 
    import flash.events.Event; 

    public class Rocket extends Sprite 
    { 
     // vars 
     public var target:Point; 

     private const _vel:Number = 5; 
     private const _steer:Number = Math.PI/36; 

     private var _destAng:Number = 0; 
     private var _ang:Number = 0; 
     private var _xv:Number = 0; 
     private var _yv:Number = 0; 

     /** 
     * Constructor 
     */ 
     public function Rocket() 
     { 
      // temp graphics 
      graphics.lineStyle(2, 0); 
      graphics.lineTo(26, 0); 

      addEventListener(Event.ENTER_FRAME, _handle); 
     } 

     /** 
     * Called on dispatch of Event.ENTER_FRAME 
     */ 
     private function _handle(e:Event):void 
     { 
      _destAng = _getAng(); 

      _xv = Math.cos(_ang) * _vel; 
      _yv = Math.sin(_ang) * _vel; 

      x += _xv; 
      y += _yv; 

      if(_ang > _destAng) _ang -= _steer; 
      if(_ang < _destAng) _ang += _steer; 

      rotation = _ang * 180/Math.PI; 
     } 

     /** 
     * Get the angle to target 
     */ 
     private function _getAng():Number 
     { 
      if(target) 
      { 
       var yp:Number = target.y - y; 
       var xp:Number = target.x - x; 

       return Math.atan2(yp, xp); 
      } 

      return 0; 
     } 
    } 
} 

我猜这个逻辑不迎合任何导致导弹行事诡异向左移动:

if(_ang > _destAng) _ang -= _steer; 
if(_ang < _destAng) _ang += _steer; 

这里也是我使用创建我的火箭的代码,如果它是有帮助的:

var point:Point = new Point(); 

var rocket:Rocket = new Rocket(); 
rocket.target = point; 

addChild(rocket); 

addEventListener(Event.ENTER_FRAME, _handle); 
function _handle(e:Event):void 
{ 
    point.x = mouseX; 
    point.y = mouseY; 
} 
+0

这可能是幼稚,但你为什么不能做: 新的速度/方向=速度/方向鼠标协调+老(速度/方向) 其中速度/方向是矢量,导弹跟随,+是矢量加法。 – soandos 2011-05-12 02:33:15

+0

我很困惑 - 火箭所遵循的点是鼠标坐标。那么这两件事情不一样吗? – Marty 2011-05-12 02:38:33

+0

是的,但后来我不明白为什么它很重要,如果它向左或向右,或向前或向后,它应该是方向不可知的。我认为它可能更简单,只有当前速度属性,当前方向,新速度,新方向和向量数学。我不确定你的矢量数学是不是很好btw ...你可以添加像这样的角度... – soandos 2011-05-12 02:41:43

回答

3

这应该适合你。

public class Rocket extends Sprite 
{ 
    // vars 
    public var target:Point; 

    private const _vel:Number = 5; 
    private const _steer:Number = Math.PI/36; 

    private var _destAng:Number = 0; 
    private var _ang:Number = 0; 
    private var _xv:Number = 0; 
    private var _yv:Number = 0; 

    public const SPEED:uint = 50; 

    // TODO: get this from fixed timespet 
    public const TIME_DELTA:Number = 0.05; 
    public const RAD:Number = 57.2957795; 
    public const DEG:Number = 0.0174532925; 

    public function Rocket() 
    { 
     // temp graphics 
     graphics.lineStyle(2, 0); 

     // body should follow head 
     graphics.moveTo(-26, 0); 
     graphics.lineTo(0, 0); 

     addEventListener(Event.ENTER_FRAME, _handle); 
    } 

    /** 
    * Called on dispatch of Event.ENTER_FRAME 
    */ 
    private function _handle(e:Event):void 
    { 
     var a:Number = _turnToFace(new Point(x, y), target, this.rotation * Math.PI/180, 0.1); 

     var dirX:Number = Math.cos(a); 
     var dirY:Number = Math.sin(a); 

     x += (dirX) * SPEED * TIME_DELTA; 
     y += (dirY) * SPEED * TIME_DELTA; 

     rotation = a * RAD; 
    } 

    private function _turnToFace(p:Point, f:Point, ca:Number, turnSpeed:Number):Number 
    {   
     var xp:Number = f.x - p.x; 
     var yp:Number = f.y - p.y; 

     var desiredAngle:Number = Math.atan2(yp, xp); 
     var difference:Number = _wrapAngle(desiredAngle - ca); 

     difference = Math.max(-turnSpeed, Math.min(turnSpeed, difference)); 

     return _wrapAngle(ca + difference); 
    } 

    private function _wrapAngle(radians:Number):Number 
    { 
     var pi2:Number = Math.PI * 2; 

     while(radians < -Math.PI) radians += pi2; 
     while(radians > Math.PI) radians -= pi2; 

     return radians; 
    } 
} 
+0

出于好奇 - 你为什么使用** static **作为你的变量?似乎你打算使用const? – Marty 2011-05-12 07:15:51

+0

@马蒂华莱士,是的!对不起,我是haxe开发者,并且没有const。 – 62316e 2011-05-12 07:42:39

+0

:P所有好的,非常好的数学块。 – Marty 2011-05-12 07:45:33

1

我发现这个代码here

Missile_speed = 20;

Missile_turning = 6;

dx = Target._x-Missile._x; dy = Target._y-Missile._y;距离= Math.sqrt((dx * dx)+(dy * dy));其中,

dx/= distance; dy/= distance;

vx + = dx * Missile_turning; vy + = dy * Missile_turning;速度= Math.sqrt((vx * vx)+(vy * vy));其中,如果(速度> Missile_speed) vx =(vx * Missile_speed)/速度;如果(速度> Missile_speed) vx = vy =(vy * Missile_speed)/ velocity; }

Missile._x + = vx; Missile._y + = vy;

稍微调整一下(调用函数,这样的基本事情)它应该是你需要的。

+0

很好,谢谢! – Marty 2011-05-12 03:12:15