Einzelnen Beitrag anzeigen
Ungelesen 17.09.13, 18:40   #9
Tomsen1410
Erfahrenes Mitglied
 
Benutzerbild von Tomsen1410
 
Registriert seit: Jul 2009
Beiträge: 470
Bedankt: 509
Tomsen1410 ist noch neu hier! | 0 Respekt Punkte
Standard

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
__________________
Ein DANKE tut nicht weh.
DRÜCKEN


__________________________________________________ ____
[ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]
Tomsen1410 ist offline   Mit Zitat antworten