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

放物線の軌道に弾丸を実際に配置する bullet オブジェクトの関数は次のとおりです。

 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

これは、出発点からその方向Rに移動した距離です。あなたが直面している問題は、放物線を 2 点だけで補間しようとしていることです。2 点を補間する放物線は無数にありますが、3 点を通る放物線は独特です。基本的に、目標を達成できる速度と角度には無限の選択肢があります。xA

上記の式を使用して必要な値を見つけるには、弾丸の角度または速度を修正する必要があります。そうでない場合は、ターゲットに当たる放物線が無数にあります。

上記は、空気抵抗を無視することを前提としています。

編集:したがって、速度がすでにわかっている場合は、上記の単純な再配置から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 に答える