2016-10-28 5 views
-2

Also programmiere ich ein kleines Spiel. Als der Spieler, fliegen Sie ein Raumschiff im 2. Raum. Ich möchte einen Marker haben, der auf ein ausgewähltes Objekt wie eine Sonne oder einen Planeten zeigt, falls im Scanner ausgewählt. Alles davon funktioniert gut außer der Zeichnung des Markers am Bildschirmrand.java finden Schnittpunkt von Linie und Rechteck

Hier ist mein Programm so weit:

ich es Richtung des Objekts zeigt in zunächst einen Marker gemalt Marker

Um die Markierung zu drehen, zu lassen, die aus dem Bildschirm ist, i benutze diesen Algorythmus.

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

Im Grunde, was ich tue, ist dies auf der linken Seite des Bildschirms einen festen Punkt nehmen, der Fixpunkt der Spieler Schiff und dem Objekt und den Winkel dazwischen diesen beiden Linien erhalten. Der resultierende Wert ist der Grad Ich muss meinen Marker drehen in. Und das funktioniert gut

Get angle

Mein Problem es am Rand des Bildschirms angezeigt wird.

Mein Versuch, dies zu tun, ist, dass ich ein Rechteck erstellen, die den Bildschirm passt:

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

dann geschnitten i die Rechtecke Werte von X verwendet, Y, Breite und Höhe 4 Linien zu erzeugen, die zusammen das bilden, Rechteck um den Bildschirm. Jetzt möchte ich sehen, ob eine Linie, die zwischen dem Spieler und dem ausgewählten Objekt gezogen wird, sich mit irgendeiner der Linien des Rechtecks ​​schneidet und diesen Punkt bekommt. Und schließlich das rotierte Markerbild an diesen Koordinaten anzeigen.

Hier ist mein Code für die

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; 

} 

Aber irgendwie wird die Markierung nur am oberen und linken sceenside angezeigt. Ich habe versucht, es zu lösen, indem Sie die Breite in der X-Achse in der Zeichenfunktion subtrahieren, aber das hat nicht funktioniert. Und diese Linien sollten sowieso keine Schnittpunkte haben, da die Linie zwischen dem Spieler und dem Objekt diese Rechtecklinie nicht schneidet. Ich werde Bilder von, wie es in den Kommentaren Ich habe gerade versucht für mehrere Tage und kann keine Lösung finden. Vielen Dank im Voraus

Spytrycer

Antwort

0

ich es gelöst. Ich habe die Linie los:

if (d == 0) return null; 

Und die Weile, wo ich die Marker zeichnete, ging nicht lange genug.

Plus, ich umgeben die Zeichenfunktionen mit, wenn und stellte sicher, dass die Markierungen nur angezeigt werden, wenn der Winkel ein bestimmter Wert ist.

Verwandte Themen