2016-10-28 10 views
-2

私は小さなゲームをプログラミングしています。 プレーヤーとして、2次元空間で宇宙船を飛行します。 スキャナで選択されている場合は、太陽や惑星のような選択されたオブジェクトを指し示すマーカーが必要です。 画面の境界にあるマーカーの描画を除いて、そのすべてが正常に機能します。ここでjavaと線と矩形の交差を見つける

は、これまでのところ、私のプログラムの開発です:

私が最初にそれが画面の外にあるオブジェクトの方向を向いているようにする、マーカーを回転させるためには Marker

マーカーを塗って、私はこのAlgorythmを使用してください。

double Marker_vec = Math.toDegrees(Vector2F.getAngle(SolarSystem.object_vectors[marker],center,player.pos)); 

public static double getAngle(Vector2F v1, Vector2F v2, Vector2F fixed) 
{ 

    double angle1 = Math.atan2(v1.ypos - fixed.ypos, v1.xpos - fixed.xpos); 
    double angle2 = Math.atan2(v2.ypos - fixed.ypos, v2.xpos - fixed.xpos); 
    return angle1 - angle2; 
} 

基本的に私は何をすべきか、これは、画面、プレーヤーの船の固定点とオブジェクトの左側に固定されたポイントを取り、それらの二行その間の角度を取得することです。 結果の値は、私は。 で私のマーカーを有効にする必要がある度そしてそれは

Get angle

私の問題は、画面の端にそれを表示することで正常に動作します。そうする

私の試みは、私が画面に収まる四角形を作成することです:

screen_rec = new Rectangle(0,0,Main.width-1,Main.height-1); 

は、私は一緒になって4行を作成するために、X、Y、幅と高さの長方形値を使用カット画面の周りの長方形。 これで、プレーヤーと選択されたオブジェクトの間に描かれた線が、長方形の線と交差してその点を取得するかどうかを確認したいと思います。 最後に、回転したマーカー画像をその座標に表示します。ここで

はその

marker_vec = Vector2F.getIntersectionPoint(line, Player.screen_rec); 

public static Point intersection(Line2D lineA, Line2D lineB) 
{ 
    double x1 = lineA.getX1(); 
    double y1 = lineA.getY1(); 

    double x2 = lineA.getX2(); 
    double y2 = lineA.getY2(); 

    double x3 = lineB.getX1(); 
    double y3 = lineB.getY1(); 

    double x4 = lineB.getX2(); 
    double y4 = lineB.getY2(); 

    double d = (x1-x2)*(y3-y4) - (y1-y2)*(x3-x4); 
    if (d == 0) return null; 

    double xi = ((x3-x4)*(x1*y2-y1*x2)-(x1-x2)*(x3*y4-y3*x4))/d; 
    double yi = ((y3-y4)*(x1*y2-y1*x2)-(y1-y2)*(x3*y4-y3*x4))/d; 
    return new Point((int)xi,(int)yi); 
} 

public static Point[] getIntersectionPoint(Line2D line, Rectangle2D rectangle) { 

    Point[] p1 = new Point[4]; 



    // Top line 
    p1[0] = intersection(line, 
        new Line2D.Double(
        rectangle.getX(), 
        rectangle.getY(), 
        rectangle.getX() + rectangle.getWidth(), 
        rectangle.getY())); 
    // Bottom line 
    p1[1] = intersection(line, 
        new Line2D.Double(
        rectangle.getX(), 
        rectangle.getY() + rectangle.getHeight(), 
        rectangle.getX() + rectangle.getWidth(), 
        rectangle.getY() + rectangle.getHeight())); 
    // Left side... 
    p1[2] = intersection(line, 
        new Line2D.Double(
        rectangle.getX(), 
        rectangle.getY(), 
        rectangle.getX(), 
        rectangle.getY() + rectangle.getHeight())); 
    // Right side 
    p1[3] = intersection(line, 
        new Line2D.Double(
        rectangle.getX() + rectangle.getWidth(), 
        rectangle.getY(), 
        rectangle.getX() + rectangle.getWidth(), 
        rectangle.getY() + rectangle.getHeight())); 




    return p1; 

} 

のための私のコードですが、何とかマーカーのみを上限と左sceensideに表示されます。 私は、描画関数でxaxisの幅を引いてそれを解決しようとしましたが、それはうまくいきませんでした。 プレーヤーとオブジェクトの間の線がその矩形線と交差しないため、これらの線には交差点がありません。 コメントの様子を画像で投稿します 私はちょうどserveral日にしようとすると、すべての解決策を見つけることができません。事前に おかげで

Spytrycer

答えて

0

私はそれを解決しました。

if (d == 0) return null; 

そして、私がマーカーを描いた場所は十分に長くはなかった。

さらに、描画関数をifで囲み、角度が特定の値である場合にのみマーカーが表示されることを確認しました。

関連する問題