2

だから私はアンドロイドで私の最初のゲームを作ろうとしています。問題は、小さな動くボールがあり、描いた線から跳ね返らせたいということです。そのためには、ボールの x、y が線からの 1 つの点の座標でもあるかどうかを調べる必要があります。

線に関するこれらの方程式を実装しようとしました

x=a1 + t*u1

y=a2 + t*u2 => (x-a1)/u1=(y-a2)/u2 (点が線上にある場合は t=t でなければなりません)

ここで、x と y はテストしている座標、dot[a1,a2] は線上のドット、u(u1,u2) は線のベクトルです。

コードは次のとおりです。

       public boolean Collided()
   {
       float u1 =Math.abs(Math.round(begin_X)-Math.round(end_X));
       float u2 =Math.abs(Math.round(begin_Y)-Math.round(end_Y));          
       float t_x =Math.round((elect_X - begin_X)/u1);
       float t_y =Math.round((elect_Y - begin_Y)/u2);
       if(t_x==t_y)
       {
           return true;
       }
       else
       {
           return false;
       }       
   }

ポイント [begin_X,end_X] と [begin_Y,end_Y] は線からの 2 つのポイントで、[elect_X,elect_Y] はボールの座標です。

理論的にはうまくいくはずですが、実際にはほとんどの場合、ボールはラインを真っ直ぐ通過するか、本来あるべきでない場所で跳ね返ります。

4

3 に答える 3

0

あなたの数学は大丈夫ですが、あなたのコードはそうではありません。

一般的な線の方程式を使用する方が簡単です。y = y1 + a(x - x1)ここでa = (y2 - y1) / ( x2 - x1)、は(x1,y1)(x2,y2)線からの点になります。

ボールがポイントにあるときにボールをラインからの距離にするには、次のコマンドを(bx,by)使用します。

double a = (y2 - y1) / (x2 - x1);
double distance = (by - y1 - a * (bx - x1)) * Math.cos(Math.atan(a));

Math.abs(distance)これで、が特定の値(つまりボールの直径)を下回っているかどうかを比較して、衝突を確認できます。

注:これは、垂直でない線に対してのみ機能します。縦線がある場合は、次を使用してください。

double distance = bx - x1;

幸運を。

于 2012-10-08T15:35:07.387 に答える
0

問題は、ドットが跳ね返りたいラインに「ヒット」するかどうかをテストしているという事実にあります。フレームごとにドットの位置を少しずつ増やしていると思います。

ドットが [1,1] に配置され、線が [0,0] から [5,0] まで伸び、ドットの速度が毎秒 1 単位で、方向が [-1,0] であるとします。よりスムーズなアニメーションを可能にするために、フレームあたりの時間に基づいて増分を計算していると思います。

何が起こっているかは次のとおりです。

  1. [1,1] にドット
  2. フレームあたりの時間 = 0,7
  3. ドットを [0.3,0] に移動
  4. 交差点のテスト = false
  5. --- 次のフレーム ---
  6. [0.3,0] にドット
  7. フレームあたりの時間 = 0.5 (これは通常、フレームごとに異なります)
  8. ドットを [0.2,0] に移動
  9. 交差点のテスト = false

したがって、テストでは、ドットの個別の位置をテストしているため、交差はありませんでした。

Aki Suihkonen が示唆しているように、最後の位置 + 現在の位置によって形成された線と、ドットを衝突させたい線との間の線の交差をテストする必要があります。

java.awt.geom.Line2D.linesIntersect(double X1, double Y1, double X2, double Y2, double X3, double Y3, double X4, double Y4) を使用すると、これらの交差を簡単に確認できます。

于 2012-10-08T15:12:14.000 に答える
0

あなたのコードが何をしているのかわかりませんが、データの x 座標でいくつかの操作を行い、次に y で操作を行い、最後にそれらを等しくしたいのは奇妙に見えます。

ここに行って試してください点と線分の間の最短距離で、距離== 0(またはボールの半径に等しい場合)の場合、衝突が発生します

于 2012-10-08T14:42:38.577 に答える