# Schussrichtung festlegen - JOGL



## BattleMaster246 (12. Dez 2010)

Hay, ich zerbreche mir desswegen schon seit gestern morgen den Kopf. In meinem kleinen Spiel bin ich gerade dabei, einem Raumschiff, was im Moment wie ein Dreieck aussieht, abfeuerbare Kugeln zu verleihen. Nun wollte ich durch einen Richtungsvektor die Richtung bestimmen, dazu benötige ich erstmal einen 2. Punkt.

In dem Spiel wird das Schiff mit glTranslate an die Richtige Position gestellt und dann wird das Schiff mittels glRotate um die eigene Achse gedreht (die Richtung kann der Spieler steuern). Nun wollte ich die gluDiscs in die "Blickrichtung" des Schiffes abfeuern lassen, dazu benötige ich einen 2. Punkt damit ich den Richtungsvektor berechnen kann, durch den glRotate kann ich leider keinen 2. Punkt bestimmen.

Folgende Daten sind vorhanden:

Rotation des Schiffes (z.B. 180°)
Position des Schiffes (x, y)

Ich hoffe ihr könnt mir helfen.


----------



## Marco13 (12. Dez 2010)

Natürlich reicht die Rotation. Wenn das Schiff bei einer Rotation von 0 genau nach "oben" schaut (also entlang der positiven y-Achse), dann kannst du einen zweiten Punkt einfach ander Position (0,100) oder so setzen. Wenn man den dann genau wie das Schiff (also auch UM den gleichen Punkt) rotiert, sollte die Richtung stimmen.


----------



## BattleMaster246 (12. Dez 2010)

Ich möchte aber nicht die Scheiben mit einem glRotation drehen, da das sonst zu kompliziert mit der Kollisionsabfrage wird. Sonst könnte ich ja einfach die Scheiben auf der Y-Achse nach oben schieben und dann rotieren lassen.

Habs jetzt. Einfach:


```
double pi = (Player.playerpos[2] + 90) * (Math.PI / 180);
                float px = Player.playerpos[0] + (85 * (float)Math.cos((pi)));
                float py = Player.playerpos[1] + (85 * (float)Math.sin((pi)));
```


----------



## Marco13 (12. Dez 2010)

Du solltest (IMHO _dringend_) etwas unternehmen, damit der Code so ähnlich aussieht wie

```
double angleRad = Math.doRadians(player.getAngleDegrees());
float px = player.getPositionX() + (SOME_CONSTANT * (float)Math.cos((angleRad)));
float py = player.getPositionY() + (SOME_CONSTANT * (float)Math.sin((angleRad)));
```
Wenn nicht gar

```
Vector2f p = player.getPosition().add(Y_AXIS.rotate(player.getAngleRad()));
```


----------



## BattleMaster246 (13. Dez 2010)

Habs jetzt aber so gestaltet wie es ist. Keine Lust das alle zu ändern, ist mir nen bisschen zu umständlich für alles ne neue Klasse zu machen, in C++ mit typedef struct ist das schon besser (oder gibt es sowas in Java auch)?

Ok, habs jetzt, Unterklassen sind so wie Structs bzw. man kann sie so ähnlich benutzen.


----------



## Marco13 (13. Dez 2010)

C++:

```
typedef struct Vector2f
{
    float x;
    float y;
} Vector2f;
```
Java

```
class Vector2f
{
    float x;
    float y;
}
```
!?

Aber ist egal, es gibt mehrere Möglichkeiten, den Hang zum Versuch, "guten" Code zu schreiben, zu entwickeln - sei es durch philosophieren und Einsicht, oder dadurch, dass man lange alles einfach so irgendwie hinschreibt, und irgendwann merkt, dass man sich damit gewaltig auf die Fresse gelegt hat (und es zu spät ist, daran noch etwas zu ändern, ... weil ... das ist so aufwändig  (Oder ganz direkt: Meinst du, wenn du dieses Programm noch ein paar Monate "so" weiterentwickelt, wird es irgendwann einfacher oder übersichtlicher? Code verrottet, wenn man nichts dagegen unternimmt. Klingt komisch. Is aber so  ))


----------



## BattleMaster246 (13. Dez 2010)

Ja, hast recht, habe jetzt einfach eine 'public static'-Unterklasse bei 'Player' mit den statischen öffnetlichen Variablen für die Positionen reingesetzt. Ist dann doch gleich viel übersichtlicher. War mir einfach nicht in den Sinn gekommen einfach ne Unterklasse zu benutzen.


----------



## Marco13 (13. Dez 2010)

Eigentlich sind public Fields ja auch ein no-go, aber ... kleine Schritte, immerhin...


----------



## BattleMaster246 (13. Dez 2010)

> aber ... kleine Schritte



Ja, ich lange nur PHP, Pawn und C++ programmiert, Java ist in machen Sachen ein bissel anders.


Zu den Publics: Hatte angenommen, dass ich die Klasse ohne dem nicht aus anderen Dateien aufrufen kann, aber siehe da, es geht doch.


----------

