Ich habe vor kurzem auch Tetris programmiert und bin zu folgendem Rotations-Algorythmus gekommen:
Du hast eine Klasse cStone, welche Blöcke beinhaltet und vererbt werden kann. Vereinfacht schaut die Klasse dann so aus(c++):
PHP-Code:
class cStone{
public:
virtual void Create() = 0; //Interface
virtual void Rotate();
private:
std::vector<cBlock*> m_Blocks; //Liste der Blöcke im Stein
};
Man siehst, dass man diese Klasse vererben muss, da es ja insgesamt 7 verschiedene Steine gibt. Das heißt, dass man aber auch für jede der sieben Klassen eine andere Create-Funktin hat, weil ja jeder Stein anders aufgebaut ist.
Die Klasse cBlock beinhaltet eine X, sowie Y-Position und einen X- und Y-Offset zum "MainBlock", welchen man zum drehen braucht.
Den Drehalgorythmus funktioniert also wie folgt:
Ein Stein besteht ja aus Blöcken, von denen einer der "Hauptblock oder wie oben auch der "MainBlock" ist um den sich dann alle anderen Blöcke drehen werden. Wenn man jetzt überlegt, findet man heraus, dass wenn man den Stein nach links dreht und ein bestimmter Block zum Beispiel 2 y-Positionen nach oben und 1 x-Position nach rechts vom Hauptblock entfernt ist wird das beim drehen genau getauscht:
Der neue x-Offset ist der alte y-Offset,
der neue y-Offset ist der alte x-Offset MIT VORZEICHENWECHSEL! (kommt auf deine Achsen an)
Das heißt im Fall wenn die y-Achse nach unten verläuft und die x-Achse nach rechts verläuft:
x_offset_neu = y_offset_alt;
y_offset_neu = x_offset_alt * (-1);
PS: Falls man einen Sonderfall hat, wie den Quadrat-Stein, welcher um seine eigene Achse rotiert kann man die Rotate() Funktion einfach überschreiben(in diesem Fall leer lassen), da sie ja als "virtual" instanziert wurde.
Ich hoffe ich konnte dir helfen