# MarioKart Map rotieren?



## .basti (27. Sep 2022)

Servus,
ich will grad mal MarioKart nachmachen und hab mir jetzt eine Map zusammen gebastelt und möchte jetzt meinen Spieler drauf fahren lassen s. Anhang. Der Punkt auf der Strecke ist mein Spieler. Das Rechteck oben links soll später meine eigentliche Bildschirm Größe sein damit man nicht direkt die ganze Map sieht. Jetzt muss ich aber logischerweise die Map bei jeder Kurve um 90° drehen damit später auf meinem Bildschirm alles gerade ist und ich prinzipiell nur nach oben fahren muss und in die Kurven. Wie kann ich das am besten machen?


----------



## Robert Zenz (27. Sep 2022)

Du musst uns schon sagen mit was fuer Bibliotheken du arbeitest und wie du alles auf den Bildschirm bekommst. Grundsaetzlich waere aber ein "einfaches" rotieren des Bilds welches du als Strecke verwendest vermutlich ausreichend. Oder du drehst die "Kamera".


----------



## KonradN (27. Sep 2022)

Die Drehung kann man als Transformation sehen: https://de.wikipedia.org/wiki/Koordinatentransformation

Du musst also nur die Transformation durchführen. Die Position des Spielers kannst Du als (0,0) ansehen, d.h. die Map so verschieben, dass der Spieler bei (0,0) ist. Dann ist die Transformation durch die einfache Rechnung möglich.


----------



## .basti (27. Sep 2022)

@Robert Zenz ich arbeite mit swing und hab ein jframe erstellt und darauf ein jpanel hinzugefügt. Einfach das Bild rotieren ist leider nicht möglich, weil meine strecke kein bild ist sondern sich zusammen setzt aus verschiedenen komponenten. Die geraden Strecken sind zwei Line2D und die kurven jeweils zwei Quadcurve2D. Ich verbinde die verschiedenen Komponente nur durch die anfangs- und endpunkte, deswegen ist es schwierig das als ganzes zu verschieben. 

wie kann ich das also umsetzen?


----------



## KonradN (27. Sep 2022)

Deine Strukturen sind doch einfach Dinge, die auf Koordinaten basieren, z.B. die Linie hat zwei Punkte: Einen Startpunkt und einen Endpunkt. Und da setzt Du halt mit Transformationen drauf auf.

Bei Swing kann das ggf. sogar schon komplett vorhanden sein. Schau Dir z.B. einmal https://zetcode.com/gfx/java2d/transformations/ an.

Wichtig ist halt aus meiner Sicht das generelle Verständnis, daher der Wikipedia Link.


----------



## KonradN (27. Sep 2022)

.basti hat gesagt.:


> Einfach das Bild rotieren


Statt die einzelnen Koordinaten zu transformieren könntest du tatsächlich auch einfach erst alles ohne jede Drehung malen (Also einfach ein BufferedImage erstellen und da dann über ein Graphics2D Element alles malen) um dann lediglich das fertige Bild (bei dem "Norden" immer oben ist) dann zu transformieren (drehen und verschieben) um es dann anzuzeigen. 

Aber wenn Du alles bereits so anzeigen kannst (also in einer paintComponent Methode oder so), dann dürfte es am einfachsten sein, da einfach ein passendes AffineTransform vorab zu setzen.


----------



## KonradN (27. Sep 2022)

Evtl. ist es hilfreich, da die Elemente vom AffineTransform nahe zu legen, die notwendig sein dürften:
a) an der Spielerposition eine Rotation durchführen: AffineTransform.setToRotation. Da wird dann zum einen der Winkel angegeben und zum anderen der Punkt, um den gedreht werden soll.
b) im Anschluss will man den Spieler noch in die Mitte des Bildschirms kriegen. Das ist dann eine einfache Verschiebung, die dann mit AffineTransform.translate gemacht werden kann.

Wichtig ist noch der Unterschied zwischen den setToXXXX und den reinen XXXX Methoden:
Ersteres verändert das Transform zu rein dem Transform, das man angegeben hat. Letzteres fügt ein Transform hinzu. 

Hier halt das Verständnis dieser Transformationen: die Reihenfolge der Transformationen ist wichtig. Das kann man direkt testen. Einfach mal einen Leeren Zettel nehmen. Wir halten ihn in der Mitte fest. Jetzt malen wir einen Punkt 2 cm oberhalb unseres "Haltepunktes" und machen dann:

wir schieben den Zettel 3 cm hoch (Unser Haltepunkt bleibt aber ortsfest, dadurch ist dann jetzt der Punkt 5cm oberhalb des neuen Haltepunktes.
Nun drehen wir den Zettel 90° im Uhrzeigersinn: Nun ist der Punkt 5cm links neben dem Haltepunkt.

Nun legen wir den Zettel wieder in die Ursprungsposition, Haltepunkt ist 2cm unterhalb des Punktes.

Nun drehen wir den Zettel erst um 90° -> der Punkt ist nun 2cm links neben dem Haltepunkt
wir schieben den Zettel 3 cm hoch -> der Punkt ist nun 2m links und 3 cm oberhalb des Haltepunktes.

==> Reihenfolge ist also wichtig!

Aber das sind halt alles nur kleine Erläuterungen - das sollte man sich im Detail ansehen, alleine schon um zu verstehen, was das mit diesen Matrizen auf sich hat und so. Die Mathematik dahinter ist nicht wirklich komplex.


----------

