2

我有点不好意思问这个问题,但我尝试了很多不同的东西,但无法让它发挥作用。

我有一个射击子弹的游戏,我已经编写了在给定角度和速度的情况下计算抛物线轨迹的代码,但我正在尝试进行微积分以获得到达 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

问候,影子。

4

2 回答 2

4

如果从某种意义上说这是一个弹道学问题,您从一个点以一定角度A的速度投射一个粒子,并且您希望它击中y 坐标并匹配的点(即它们位于垂直于重力矢量的平面上)矢量),然后您可以从该方程式计算所需的角度和速度(请参阅定义的 wiki 链接):vthetaTAT

 R = (v * v * sin(2 * theta))/g

Rx从您的起点出发的方向所经过的距离A。您面临的问题是您试图仅通过 2 个点插入抛物线。有无限数量的抛物线将插入 2 个点,而通过 3 个点的抛物线是唯一的。本质上,速度和角度有无数种选择,这样您就可以击中目标。

您将需要固定角度或子弹的速度,以便使用上述等式找到您需要的值。如果没有,您将拥有无限数量的抛物线可以击中您的目标。

以上假设忽略空气阻力。

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

( asin(g * R / (v * v)) ) / 2 = theta
于 2012-09-10T22:48:14.550 回答
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

问候,影子。

于 2012-09-11T01:57:52.357 回答