找到满足特定范围的抛物线的角度和速度

时间:2012-09-10 20:33:19

标签: actionscript-3 math game-physics

我有点惭愧地问这个问题,但是我尝试了很多不同的事情并且无法使它发挥作用。

我有一个射击子弹的游戏,我已经制作了一个计算抛物线轨迹的代码,给出了一个角度和一个速度,但我正在尝试制作微积分以获得达到X所需的角度和速度点(用户敌人坦克),我无法按需要使它工作。

我目前的代码是:

  var startingPointX:Number = globalCoord.x;
  var startingPointY:Number = globalCoord.y;                
  var targetX:Number = tankPlayer.x;
  var targetY:Number = tankPlayer.y;
  //distance between user and enemy tank
  var distanceTarget = Math.sqrt(( startingPointX - targetX ) * ( startingPointX - targetX ) + ( startingPointY - targetY ) * ( startingPointY - targetY ));
  var fixedVel = (distanceTarget/10)*2;
  var fixedG = bullet.g;
  // launch angle
  var o:Number = -(Math.asin((0.5 * Math.atan(fixedG * distanceTarget / fixedVel *   fixedVel))) * 180 / Math.PI); 
  bullet.init(startingPointX, startingPointY, o, fixedVel);

并且子弹对象中实际将子弹定位在抛物线轨迹中的函数是:

 public function init(x, y:Number, rot:Number, speed:Number) {
        // set the start position
        var initialMove:Number = 35.0;
        this.x = x + initialMove * Math.cos(2 * Math.PI * rot / 360);
        this.y = y + initialMove * Math.sin(2 * Math.PI * rot / 360);
        this.rotation = rot;

        //get speed
        dx = speed * Math.cos(2 * Math.PI * rot / 360);
        dy = speed * Math.sin(2 * Math.PI * rot / 360);

        //animation  
        lastTime = getTimer();
        addEventListener(Event.ENTER_FRAME,moveBullet);


    }
    public function moveBullet(event:Event)
    {
        //get the time passed
        var timePassed:int = getTimer() - lastTime;
        lastTime +=  timePassed;

        //move bullet
        dy += g * timePassed / 1000;
        this.x +=  dx * timePassed / 1000;
        this.y +=  dy * timePassed / 1000;

        //bullet past the top of the screen
        if (this.y < 0)
        {
            deleteBullet();
        }
    }

任何帮助都非常有用,谢谢! :d

此致 阴影。

2 个答案:

答案 0 :(得分:4)

如果这是一个弹道学问题,那么你从A点以v的角度theta投射一个粒子并且你想要它点{{1}其中TA的y坐标匹配(即它们位于垂直于重力矢量矢量的平面上),然后您可以根据此等式计算所需的角度和速度(请参阅维基链接在哪里定义):

T

此处 R = (v * v * sin(2 * theta))/g 是从起点R开始沿x方向行进的距离。你面临的问题是你试图通过仅仅2点插入抛物线。有无限量的抛物线将插入2个点,而抛物线通过3个点是唯一的。从本质上讲,速度和角度有无限的选择,这样你就可以击中你的目标。

您需要修正角度或子弹的速度才能使用上面的等式来找到您需要的值。如果没有,你有无限数量的抛物线可以击中你的目标。

以上假设忽略了空气阻力。

编辑:因此,如果您已知道速度A已经可以从上面的简单重新排列中获得v

theta

答案 1 :(得分:0)

根据@ mathematician1975的建议,我将代码解析为完美且完美无缺:D

            var distanceTarget =  startingPointX - targetX ;
            var fixedVel = 100;
            var fixedG = tmpB.g;
            var o:Number = (0.5 * Math.atan((fixedG * distanceTarget / (fixedVel * fixedVel)))) * 180 / Math.PI;
            //this is only necessary why the enemy tank is facing left
            o -= 180;

我所做的是:

  • 设定固定速度为@ mathematician1975表示,比以前大很多
  • 起点和终点之间的距离是直线的,不使用毕达哥拉斯。
  • -180就是敌人坦克朝左的原因。

我希望有人会在将来发现它有用:D

此致 阴影。