3D-Grafik Marker zu aus Screen anvisiertem Object

Spytrycer

Mitglied
Folgendes:
Ich programmiere ein kleines Spiel.
Darin fliegt der Spieler ein Raumschiff im All, wo sich objekte wie sonne, planeten etc befinden.
Was ich brauche, ist ein Marker welcher in die Richtung eines Anvisierten Objects am Bildschirmrand Zeigt.
Ich schaffe es aber nicht dies hinzukriegen, hier mein Ansatz.

Ich habe einen vorlaeufigen Marker als Sprite gemalt:
marker.png
um die Rotation des Markers zu kriegen, damit seine Spitze immer auf das Object zeigt benutze ich folgenden Algorythmus:
Java:
double Marker_vec = Math.toDegrees(Vector2F.getAngle( SolarSystem.object_vectors[marker],center,player.pos));

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

Was ich damit mache ist im Grunde den Winkel zwischen dem Spieler(zentrum des Bildschirms), einem Fixpunkt am linken Bildschirmrand auf hoehe des Spielers und dem anvisierten Objekt zu berechnen und das zu malende Image mit einer Funktion zu drehen, das funktioniert einwandfrei.
png.png
Das Funktioniert auch Wunderbar.
Das problem liegt allerdings darin jetzt den Marker am Bildschirmrand auf der Linie zwischen dem Spieler und dem Objekt darzustellen.

Mein Ansatz dazu ist der das ich eine Linie zwischen dem Spieler und dem Objekt erstelle(line) und dann teste ob diese das Rechteck was den Bildschirm eingrenzt kreutzt.
Das tue ich indem ich das Rechteck in 4 Linien aufteile
Folgendermassen:

Code:
=Javamarker_vec = Vector2F.getIntersectionPoint(line, Player.screen_rec);
Java:
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 der Marker wird immer nur am oberen und linken rand angezeigt, je nach ausrichtung gedreht. Ich vermute es ist weil der marker ausserhalb des Bildschirms ist, hab aber diesbezueglich schon versucht die breite abzuziehen beim malen, es funktionierte aber nicht.
Und ausserdem muesste doch fuer die linke seite kein wert als punkt kommen wenn mein object doch auf der rechten bildschirmseite ist und die linie zwischen mir und dem object diese Rechtecklinie garnicht kreutzt.

Hilfe bitte.
lg Spytrycer
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Screen nur 1x öffnen können AWT, Swing, JavaFX & SWT 17
M Loading Screen anzeigen bei Black Screen AWT, Swing, JavaFX & SWT 1
Danloc Swing Splash Screen Prozentanzeige AWT, Swing, JavaFX & SWT 4
Hijo2006 Splash-Screen AWT, Swing, JavaFX & SWT 2
stylegangsta Splash Screen erscheint nicht AWT, Swing, JavaFX & SWT 30
J 2D-Grafik Windows Blue-Screen nach anzeigen eines Bildes in Java AWT, Swing, JavaFX & SWT 10
F GWT Screen size AWT, Swing, JavaFX & SWT 2
E Swing Grundlegendes Vorhehen. Login-Screen, danach Arbeits-Screen AWT, Swing, JavaFX & SWT 4
R MouseEvent.getX() liefert in Applet Screen-Koordinate AWT, Swing, JavaFX & SWT 2
G AWT Full-Screen Exclusive Mode AWT, Swing, JavaFX & SWT 3
P Swing || AWT unschlüssig + Layoutfrage [m. Screen] AWT, Swing, JavaFX & SWT 16
J Screen Capture AWT, Swing, JavaFX & SWT 5
S Splash Screen / "Loading" Anzeige im Programm AWT, Swing, JavaFX & SWT 27
L Animierter Splash-Screen (mit NetBeans 6.1 z.B.) AWT, Swing, JavaFX & SWT 2
F splash screen mit progress bar - probleme mit invoke later AWT, Swing, JavaFX & SWT 7
H Transparente Splash-Screen AWT, Swing, JavaFX & SWT 5
I Splash Screen AWT, Swing, JavaFX & SWT 7
G Screen nach Auswahl schließen und neuen öffnen?wie mach ichs AWT, Swing, JavaFX & SWT 8
O der neue eclipse 3.1 splash screen AWT, Swing, JavaFX & SWT 3
G Splash Screen AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen


Oben