Vector Berechnung

Hey Leute,
ich programmiere gerade ein Android Game in Java :wink:

Das ganze ist ein Spiel names AchtungDieKurve hierbei geht es darum das ein Spieler gegen den Computer eine Schlange(Snake) spielt und es schaffen muss das er die Schlange des Computers nicht berührt, das ganze funktioniert auch wunderbar, nur jetzt möchte ich das wenn der Spieler einen Knopf drückt das eine schöne Kurve zusammen kommt ich habe eine x und y koordinate.

Ich dachte man kann das ganze ev. mit Vectoren lösen aber ich habe keine Ahnung wie.

Konkretes Problem: Ich würde gerne eine schöne runde kurve hinbekommen :wink:

PS: Danke für jede hilfe :wink:

Ein bißchen mehr “Vorleistung” wäre wohl gut. Wie sollte eine Antwort bisher aussehen? (Außer irgendwas Copy+Pasten, was mit mit einer Websuche nach “java achtung kurve” findet?)

Ich würde gerne wissen wie ich mit vector z.b die koordinaten einer kurve berechnen kann …

Du müsstest das schon näher beschreiben, denn “Kurven” gibt’s viele verschiedene… Wenn es einfach ein 90° Kreisbogen werden soll, ohne daß das zu bewegende Objekt eine Trägheit oder andere Ablenkungen besitzt, dann kann man das freillich leicht mit Vektoren machen. Um das Abbiegen in x Schritten durchzuführen bräuchtest du ja lediglich den jeweils aktuellen Bewegungsvektor x-mal um jeweils y Grad zu drehen (x*y=90°).

Die Drehmatrix ist:
(cos y, -sin y;
sin y, cos y)

Es soll eher ein Runder Kreisbogen sein wie wenn man sich eine Rolle vorstellt wo eine Seilkarft wirk die Kurve soll der der Seilkraft ähneln :wink: statische mechanik

Das lässt sich mit der oben angegebenen Drehmatrix doch ganz gut erreichen. Wo genau hast du da jetzt noch ein Problem?

Aber geht das mit der DrehtMatrix auch wenn es Rund sein soll ?

Naja gut:

Man kann die Bewegungsrichtung als Vektor speichern. Entweder mit einer eigenen, kleinen Vector2D-Klasse, oder mit einem Java Point2D (was etwas “unhandlicher” ist, aber allgemein/tendenziell den Vorteil haben KÖNNTE, dass das eben eine Klasse ist, die schon in java.awt.geom bekannt ist und dort an einigen Stellen verwendet wird - und z.B. auch mit einer AffineTransform verändert werden kann (und AffineTransform entspricht ziemlich genau der Matrix-Klasse, die vorgeschlagen wurde).

Das Spiel läuft dann in Schritten ab. Diese Schritte sind immer gleich groß. Wenn man also z.B. eine Bewegungsrichtung wie “---->” hat (als Vektor: (1,0)), dann bewegt sich der “Cursor” des Spielers in einem Schrit ein Stück nach rechts. Für “Achtung Kurve” würde man diese Bewegungsrichtung irgendwie initialisieren, und wenn man nichts macht, würde der Cursor dann in jedem Spiel-Schritt ein Stück in Bewegungsrichtung wandern:


----.----.----.----> 

Um da nun eine “Kurve” hinzukriegen, muss man in jedem Schritt abfragen, ob gerade eine Taste (Rechts oder Links) gedrückt ist. Falls ja, wird die Bewegungsrichtung angepasst, und eben ein Stück in die jeweilige Richtung gedreht. Wenn man z.B. nach dem ersten Schritt die Taste “Rechts” gedrückt hat (und danach losläßt), kommt sowas raus wie


----.
     \
      \
       .
        \
         \
          .
           \
            \
             >

Wenn man die Taste gedrückt hält (also nach JEDEM Schritt die Richtung angepasst wird), kommt sowas raus wie


----.
     \
      \
       .
        |
        |
        .
       / 
      /
     <    
            

Das sieht dort jetzt nicht wie eine Runde Kurve aus, aber wenn die Schritte klein genug sind, WIRD es rund aussehen. (Ansonsten könnte/müßte man ein bißchen mit Path2D#cubicTo tricksen, aber das sollte nicht nötig sein)