我正试图在AS3制造一枚寻的导弹。当你想让它完美地跟随一个点的时候,它就足够简单了--但是如果目标(目标)绕过了它,我正试图让火箭掉头。
这是我得到的-它几乎工作,但正如你可以看到,它是相当小(特别是如果鼠标是在左的火箭(似乎工作,如果它是向右移动)。
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;
}发布于 2011-05-12 06:21:01
这应该对你有用。
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;
    }
}发布于 2011-05-12 03:09:26
我找到了这段代码这里
Missile_speed=20;
Missile_turning=6;
dx=目标.x-导弹._x;dy=目标._y-导弹。
distance=Math.sqrt((dx*dx)+(dy*dy));
dx/=距离;dy/=距离;
vx+=dx*Missile_turning;vy+=dy*Missile_turning;
velocity=Math.sqrt((vx*vx)+(vy*vy));
if (velocity>Missile_speed) { vx=(vx*Missile_speed)/velocity;vy=(vy*Missile_speed)/velocity;}
Missile._x+=vx;Missile._y+=vy;
只要稍加调整(调用函数,类似的基本功能),它就应该是您所需要的。
https://stackoverflow.com/questions/5972715
复制相似问题