寻的导弹在AS3 [英] Homing missile in AS3

查看:141
本文介绍了寻的导弹在AS3的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图创建一个AS3寻的导弹。很容易,当你想将它遵循一个点完美的 - 但我努力让火箭不得不掉头如果目标(目标)绕过它

下面是我已经得到了 - 这几乎是工作,但你可以看到它是相当出问题(尤其是如果鼠标到离开火箭(似乎工作确定,如果它的移动权)。

http://projectavian.com/rocket.swf

下面是我的火箭类:

 包
{
    进口flash.display.Sprite;
    进口flash.geom.Point;
    进口对象类型:flash.events.Event;

    公共类火箭扩展Sprite
    {
        //瓦尔
        公共变种目标:点;

        私人常量_vel:数= 5;
        私人常量_steer:数= Math.PI / 36;

        私人VAR _destAng:数= 0;
        私人VAR _ang:数= 0;
        私人VAR _xv:数= 0;
        私人VAR _yv:数= 0;

        / **
         *构造函数
         * /
        公共职能火箭()
        {
            //临时图形
            graphics.lineStyle(2,0);
            graphics.lineTo(26,0);

            的addEventListener(Event.ENTER_FRAME,_handle);
        }

        / **
         *拜会Event.ENTER_FRAME的派遣
         * /
        私有函数_handle(五:事件):无效
        {
            _destAng = _getAng();

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

            X + = _xv;
            Y + = _yv;

            如果(_ang> _destAng)_ang  -  = _steer;
            如果(_ang< _destAng)_ang + = _steer;

            旋转= _ang * 180 / Math.PI;
        }

        / **
         *获取的角度为目标
         * /
        私有函数_getAng():数
        {
            如果(目标)
            {
                VAR YP:数= target.y  - ÿ;
                VAR XP:数= target.x  -  X;

                返回Math.atan2(YP,XP);
            }

            返回0;
        }
    }
}
 

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

 如果(_ang> _destAng)_ang  -  = _steer;
如果(_ang< _destAng)_ang + = _steer;
 

这里也是code我都用来创建我的火箭,如果是有帮助的:

  VAR点:点=新的点();

VAR火箭:火箭=新火箭();
rocket.target =点;

的addChild(火箭);

的addEventListener(Event.ENTER_FRAME,_handle);
功能_handle(五:事件):无效
{
    point.x = mouseX;
    point.y = mouseY的;
}
 

解决方案

这应该为你工作。

 公共类火箭扩展Sprite
{
    //瓦尔
    公共变种目标:点;

    私人常量_vel:数= 5;
    私人常量_steer:数= Math.PI / 36;

    私人VAR _destAng:数= 0;
    私人VAR _ang:数= 0;
    私人VAR _xv:数= 0;
    私人VAR _yv:数= 0;

    公共常量速度:UINT = 50;

    // TODO:从固定timespet得到这个
    公共常量TIME_DELTA:数= 0.05;
    公共常量RAD:数= 57.2957795;
    公共常量DEG:数= 0.0174532925;

    公共职能火箭()
    {
        //临时图形
        graphics.lineStyle(2,0);

        //机构应遵循的头
        graphics.moveTo(-26,0);
        graphics.lineTo(0,0);

        的addEventListener(Event.ENTER_FRAME,_handle);
    }

    / **
     *拜会Event.ENTER_FRAME的派遣
     * /
    私有函数_handle(五:事件):无效
    {
        VAR一:数= _turnToFace(新点(x,y)的目标,this.rotation * Math.PI / 180,0.1);

        VAR加载dirX:数= Math.cos(一);
        VAR dirY中:数= Math.sin(一);

        X + =(加载dirX)*速度* TIME_DELTA;
        Y + =(dirY中)*速度* TIME_DELTA;

        旋转= A * RAD;
    }

    私有函数_turnToFace(号码:点,F:点,CA:号码,turnSpeed​​:号码):号码
    {
        VAR XP:数= F.X  -  p.x;
        VAR YP:数= f.y  -  p.y;

        VAR desiredAngle:数= Math.atan2(YP,XP);
        VAR的区别:数= _wrapAngle(desiredAngle  -  CA);

        差= Math.max(-turnSpeed​​,Math.min(turnSpeed​​,差));

        返回_wrapAngle(CA +​​差);
    }

    私有函数_wrapAngle(弧度:编号):号码
    {
        VAR PI2:数= Math.PI * 2;

        而(弧度< -Math.PI)弧度+ = PI2;
        而(弧度> Math.PI)弧度 -  = PI2;

        返回弧度;
    }
}
 

I'm trying to create a homing missile in AS3. Easy enough when you want it to simply follow a point perfectly - but I'm trying to make the rocket have to turn around if the destination (target) bypasses it.

Here's what I've got - it almost works, but as you can see it's quite glitchy (particularly if the mouse is to the left of the rocket (seems to work OK if it's moving right).

http://projectavian.com/rocket.swf

Here's my Rocket class:

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;
        }
    }
}

I'm guessing this logic isn't catering for whatever is causing the missile to act strange moving left:

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

Here is also the code I have used to create my Rocket, if it's helpful:

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;
}

解决方案

This should work for you.

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;
    }
}

这篇关于寻的导弹在AS3的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆