# Raumschiff in die Richtung fliegen in die es schaut ?



## raven (1. Jul 2005)

Hallo,

So weit ist das Spiel schon:

http://home.arcor.de/toni.maegel/SpaceWars.zip

Also man kann schon "rumfliegen" und so.

Nur nach oben und unten und drehen kann man sich schon.
Aber wie erreiche ich das das Raumschiff auch in die Richtung fliegt in die es gerade kuckt?

Danke


----------



## KISS (1. Jul 2005)

benutze einen gerichteten vector und setze die postion location+=vector ueber einen timertask. da kannst du dann auch gleich beschleunigung usw mit einbauen

edit:
code sollte dokumentiert werden und default package zu nutzen wird mit vba nicht unter 100 zeilen geahndet


----------



## raven (1. Jul 2005)

Danke erstmal.

Was meinst du damit:


> default package zu nutzen wird mit vba nicht unter 100 zeilen geahndet.


----------



## Beni (1. Jul 2005)

[OT]Was ist vba?[/OT]

KISS möchte, dass du deine Klassen in ein eigenes Package wirfst.

Also, dass deine Java-Dateien z.B. in einem Ordner "spacewar" sind, und dass in jeder am Anfang steht

```
package spacewar;

import java.awt.*;

public class Blupp{...}
```

Du kannst mehrere Packages verwenden, und das Ganze wird übersichtlicher (spätestens ab der 20ten Klasse wirst du froh sein, Packages zu haben).
Ausserdem ist die Gefahr von Klassen mit gleichem Namen (und entsprechenden Exceptions...) kleiner, wenn du Packages verwendest.


----------



## KISS (1. Jul 2005)

man benutzt das default package nicht (also keine packageangaben), da man ganz schnell uneindeutige klassennamen hat. normalerweise wird die form <tld>.<organisation>.<funtion>.<subfiunction>[.diversifaction][.implementation].<name> genutzt
also z.b

de.kiss.uilayer.renderer.Renderer fuer ein renderer interface
und de.kiss.uilayer.renderer.impl.DefaultRenderer fuer die implementierung

wenn du keine 100 zeilen vba schreiben willst darfst du wahlweise auch quicksort in prolog implementieren


----------



## KISS (1. Jul 2005)

Beni hat gesagt.:
			
		

> [OT]Was ist vba?[/OT]


visual basic for applications?


----------



## raven (1. Jul 2005)

Aha.  :wink: 

Und wozu soll ich einen Verktor nehmen, geht doch genauso mit einem Array oder? oder soll der Vektor erweitert werden?


----------



## KISS (1. Jul 2005)

sorry, ich meinte vector im mathematischen sinne. da du dich nur im 2d raum bewegst bietet sich hier die klasse point (bzw Point2D) an


----------



## raven (1. Jul 2005)

Was ich trotzdem nicht versteh ist. Ich drehe das Raumschiff ja, na eigentlich die zeichenfläche.

Also wenn die Zeichenflächer um ca. 30° nach rechts gedreht wurde. dann müsste das Raumschiff ja auch in die Richtung fliegen.

Vorhin hatte ich das ja mal hinbekommen, bloß musste ich das wegmachen, weil das drehen des Raumschiffes nicht so hingehauen hatte.

Das hatte ich glaub ich so gemacht. g2D.rotate(Math.PI/theta);

Und da ging das ohne Point2D.  :bahnhof:  :bahnhof:  :bahnhof:


----------



## KISS (1. Jul 2005)

nun ja, ich gehe mal von echter physik eines objekts in der schwerelosigkeit aus

1. das objekt hat zu einem festgelegtem zeitpunkt t0 eine position p0, sei p0 ein vektor (x,y,z)
2. das objekt hat zu jedem beliebigen zeitpunkt t einene impuls p, sei p ein vektor (x,y,z)
3. da wir keine schwerkraft haben, ist pn am zeitpunkt tn immer p0+n*p
4. die rotation wirkt sich auf den impuls nicht aus
5. wenn ich den impuls aendere (der vektor sei hier s), gilt pn=p0+(n-1)*p+s
6. s ist abhaengig von der lage und richtung im raum und gibt als betrag die beschleunigung an

da du das ganze nur 2 dimensional betrachtest reicht ein vektor x,y, und den bildet point schon ab

edit:
zu 2: der betrag des vektors ist damit aequivalent zu geschwindigkeit, nicht zur beschleunigung

edit2:
zu 6: ist natuerlich quatsch, die aenderung des impulses ist nur von der richtung, nicht von der lage abheangig


----------



## Beni (1. Jul 2005)

Du drehst das _Bild_ des Raumschiffes, nicht das Raumschiff selbst. Die Position des Raumschiffes wird immer im Koordinatensystem des Frames berechnet (also x = horizontal zum Bildschirm, y = vertikal).

Du kannst die Rechnungen schlecht in das gedrehte Koordinatensystem verlagern (du kannst, aber es wird garantiert komplizierter als jede andere Lösung).

Wenn du aber den Winkel hast, um den die Nase "nach oben" zeigt, kannst du ein Zahlenpaar x/y (=ein Vektor) berechnen, für welches gilt: legst du eine Gerade durch den Punkt 0/0 und durch x/y, so ist diese Gerade parallel zur Blickrichtung deines Raumschiffes.
Diesen Vektor x/y kannst du der *Position deines Raumschiffes hinzuzählen, und dann bewegt es sich in die Blickrichtung.

x und y sind: x = cos alpha, y = sin alpha; wobei alpha der Neigungswinkel des Raumschiffes ist (vielleicht fehlt da noch irgendwo ein "-").

Weil es unpraktisch ist, immer zwei Zahlen hin und her zu schieben, empfahl dir KISS einen Point2D zu benutzen. Damit hast du ein Objekt, und bringst garantiert nix durcheinander.

[Edit]
Ich bin zu langsam...

* oder nach KISS: du zählst diesen Vektor dem Geschwindigkeitsvektor hinzu, und der Geschwindigkeitsvektor der Position. Damit erhälst du ein realistischeres Verhalten.


----------



## raven (1. Jul 2005)

Ja jetzt leuchtet es auf. Nur hab ich keinen blassen Schimmer wie ich den Winkel(um wieviel ° sich das Raumschiff gedreht hat) berechne.
Gibt es da irgend eine Formel zu?



> Wenn du aber den Winkel hast, um den die Nase "nach oben" zeigt, kannst du ein Zahlenpaar x/y (=ein Vektor) berechnen, für welches gilt: legst du eine Gerade durch den Punkt 0/0 und durch x/y, so ist diese Gerade parallel zur Flugrichtung deines Raumschiffes.
> Diesen Vektor x/y kannst du der Position deines Raumschiffes hinzuzählen, und dann bewegt es sich in die Blickrichtung.



EDIT: Das mit dem realistischen Verhalten. Ist auch klar. Bloß muss erst einmal das andere funktioniren.


----------



## Beni (1. Jul 2005)

Naja, hätte ich dein Code noch im Kopf gehabt, hätte ich dir sagen können, dass das "alpha" dort oben = dem "theta" aus der Klasse Raumschiff ist. (hm, vielleicht ist das ganze ein bisschen verdreht, weil Grahics2D die Rotation anders implementiert hat, als gerade mit  x=cos, y=sin. Aber das wirst du ziemlich schnell sehen :-D)


----------



## KISS (1. Jul 2005)

ja natuerlich. im notfall hilft ein tafelwerk. meist hilft aber schon die klasse affinetransform die schon alles bietet was du brauchst, und zwar 3d wenn es sein muss


----------



## raven (1. Jul 2005)

KISS hat gesagt.:
			
		

> ja natuerlich. im notfall hilft ein tafelwerk. meist hilft aber schon die klasse affinetransform die schon alles bietet was du brauchst, und zwar 3d wenn es sein muss



Tafelwerk hatte ich gerade rausgeholt  :wink:  :wink:  :wink: 

Mit affinetransform bin ich nicht klar gekommen, daswegen hab ich die jetzige Möglichkeit genommen. :autsch:


----------

