# Rotation von Objekten um ein Raumschiff



## BraunBerry (4. Sep 2016)

Hallo Community,

In meinem Spiel gibt es ein Raumschiff, dass durch den Weltraum fliegen kann. Das Schiff ist im Fenster zentriert. Überall auf dem Bildschirm sind Images, also Sterne verteilt, die sich mit verschiedenen Geschwindigkeiten bewegen, wenn das Schiff gesteuert wird. So entsteht eine Scheinbare Bewegung des Schiffs. Jetzt würde ich gern einfügen, dass man das Schiff nach links oder rechts "drehen" kann. Dazu wollte ich versuchen die verschiedenen Sterne auf einer Kriesbahn um das Schiff zu bewegen. Zu Anfang werden die Sterne mit Hilfe von festgelegten Koordinaten auf dem Bildschirm positioniert. Danach habe ich versucht die Entfernung jedes einzelnen Sternes bis zum Schiff zu berechnen und diese dann als Rotationsradius zu benutzen:


```
public static void initRotation(){
StarsRadius[0] = (int) Math.sqrt(Math.pow((coordsY[0] - StarsOriginY), 2) + Math.pow((coordsX[0] - StarsOriginX), 2));
}
```

was allerdings nicht so richtig funktionieren will.

In einem Timer versuche ich dann die Sterne zu rotieren:


```
@Override
   public void actionPerformed(ActionEvent e) {
     if (e.getSource() == StarsRotationTimer){
       coordsX[0] = (int) (StarsOriginX + StarsRadius[0] * Math.sin(StarsAlpha));
       coordsY[0] = (int) (StarsOriginY + StarsRadius[0] * Math.cos(StarsAlpha));
       StarsAlpha += Spaceship.RotationSpeed;
       if (StarsAlpha >= 2*Math.PI){StarsAlpha = 0.01;}
     }
   }
```

Das Problem:
1. Die Radien werden falsch berechnet
2. Ich denke ich muss irgendwie den Alpha-Winkel von jedem Stern in seiner Anfangsposition herausbekommen

Ich wäre euch dankbar, wenn ihr mir sagen könntet wie ich das Problem beheben kann oder welche Möglichkeiten es noch gibt, Objekte auf einer Kreisbahn zu rotieren.

lg BraunBerry


----------



## BRoll (4. Sep 2016)

Hi, wenn ich es richtig verstanden habe ist es doch ganz einfach:


 Abstand eines Sterns zum Raumschiff  ausrechnen zb. Mit Point2D.distance
 Den aktuellen Rotationswinkel ausrechnen zb. mit Math.atan2(sterny-schiffy,sternx-schiffx)
Winkel um beliebigen Wert erhöhen (je nach geschwindigkeit eben)
Neue Position ausrechnen mit sternx=schiffx+Math.cos(winkel)*abstand   und sterny=schiffy+Math.sin(winkel)*abstand


----------



## BraunBerry (4. Sep 2016)

Ok das Prinzip verstehe ich. Allerdings weiß ich leider nicht wie die ersten 2 Sachen angewandt werden.
Um ein Codebeispiel wäre ich dankbar


----------



## BRoll (5. Sep 2016)

Hab doch den notwendigen code dazugeschrieben? Naja dann pack ich dir nochmal alles hintereinander dann sollte es verständlicher sein:

```
double schiffx=10,schiffy=50;
        double sternx=300,sterny=400;      
        double abstand=Point2D.distance(sternx, sterny, schiffx, schiffy);   
        double winkel=Math.atan2(sterny-schiffy, sternx-schiffx);
        winkel=winkel+5;
        sternx=schiffx+Math.cos(winkel)*abstand;
        sterny=schiffy+Math.sin(winkel)*abstand;
```


----------



## BraunBerry (5. Sep 2016)

Ok danke ich denke dass ich das in dem Prinzip einbauen kann.


----------



## BraunBerry (21. Sep 2016)

Tut mir Leid, dass ich mich erst so spät wieder melde aber nach längerem Probieren hab ich einen Fehler entdeckt. Sobald ich umherfliege und das Raumschiff gleichzeitig rotiere verlagern sich die Sterne immer weiter Richtung Mitte. Ich vermute, dass das mit der Bewegungsanimation zusammenhängt, bei der ein Stern, der sich z.B. aus dem unteren Bildschirmrand hinausbewegt wieder zum oberen Bildschirmrand zurückgesetzt wird.


```
if (coordsY[0] > Application.HEIGHT){coordsY[0] = 0;}
if (coordsX[0] > Application.WIDTH){coordsX[0] = 0;}
```

So werden die Sterne nochmal generell bewegt:


```
coordsX[0] += SPEEDX;
coordsY[0] += SPEEDY;
```

als Alternative hatte ich mir überlegt, dass ich quasi den ganzen Weltraum (der möglicherweise mehrere Hunderttausend Pixel groß ist) mit Sternen zupflastern könnte und diese dann alle um mein Raumschiff rotieren könnte. Allerdings habe ich keine Lust, für jeden einzelnen Stern extra Koordinaten und eine draw Klausel zu schreiben. Ich würde die grundlegenden Koordinaten der Sterne beibehalten und diese dann erneut nur um eine Fenstergröße verschoben zeichnen. Ob das der Performance allerdings so gut tut wäre die andere Frage. 

Ich vermute, dass ich hier um eine Schleife nicht herumkommen werde aber das ist nur eine Hypothese. Damit das Spiel nicht zu sehr belastet wird, würde ich einen Stern nur zeichnen, wenn er auch auf dem Bildschirm zu sehen wäre. Allerdings schrecken mich die vielen if Bedingungen ab. xD Vielleicht gibt es hier auch eine Möglichkeit das einfacher zu regeln.

Wisst ihr, wie ich entweder verhindern kann, dass sich die Sterne zur Mitte hin verlagern, oder wie ich eine performanceschonende und möglichst schreibfreundliche Methode zur kompletten Bedeckung mit Sternen einbauen kann?

Schonmal Danke im Voraus 

lg BraunBerry


----------



## BRoll (22. Sep 2016)

Also ohne den Code kann ich das Problem schlecht analysieren. Gibt einfach zu viel das man falsch machen kann und ich weiß auch nicht wie du die Sterne jetzt genau umgesetzt hast. Aber egal wie du es gerade löst, wieso brauchst du für jeden Stern eine eigene "draw Klausel"? Und natürlich kommst du nicht um eine Schleife herum, da du mehr als einen Stern hast. Und natürlich zeichnet man nur, wenn man es auch (zumindest ansatzweise) sieht. Und verstehe ich das richtig, dein Raumschiff dreht sich nicht, sondern stattdessen die komplette Welt um es herum? Wenn man dir wirklich helfen soll, wirst du wohl nicht drumrum kommen dein Projekt mal hochzuladen


----------

