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:
um die Rotation des Markers zu kriegen, damit seine Spitze immer auf das Object zeigt benutze ich folgenden Algorythmus:
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.
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:
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
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:
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.
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