Hallo liebes Delphi Forum,
ich möchte hier meine Variante zum rotieren von Tetris Klötzen veröffentlichen, hab bisher nichts brauchbares im Netz gefunden und nach Stunden des Denkens und Programmierens habe ich es nun endlich geschafft. Ausgenommen ist hier der seint "I" und "O"; "I" bedarf eine Sonderbehandlung und "O" brauch man nicht zu rotieren.
Übrig bleiben die Klötze "T", "L", "J", "S", "Z" (
de.wikipedia.org/wiki/Tetris ).
Die Klötze sind eine Zusammensetzung aus Steinen. Also Stein1+Stein2+Stein3+Stein4 = Klotz
Ein Stein ist eine Zelle eines Zweidemensionalen Arrays.
Jetzt hört sich das mit dem Rotieren vllt relativ einfach an. Ist es auch
Im Groben klappt das so:
- Jeder der Klötze ("T", "L", "J", "S", "Z") hat einen "Angelpunk"-Stein der sich zum Zeitpunkt der Drehung nicht weg bewegt.
- Alle anderen Steine des Klotzes bewegen sich bei der Rotation um den "Angelpunkt"-Stein, bis die gewünschte Position erreich ist.
Probleme:
- Ein Klotz befindet sich IRGENDWO im Array, diese Position ändert sich ständig
- Der Klotz muss nach der Rotation diesselbe Position haben wie davor
- Jeder Klotz hat eine Individuelle Form
Lösung:
Wir betrachten einen Klotz in einem 3*3 Array, EGAL wo er sich gerade im x*y Array befindet.
Fassen wir zusammen:
-Jeder der Klötze besteht aus genau 4 Steinen
-Jeder der Klötz besitzt einen (von uns) definierten Angelpunk
Das Beispiel setzt voraus, das die Koordinaten der Steine des fallenden Klotzes bekannt sind.
Also können wir uns jeden Klotz folgend vorstellen (X: Normaler Stein, O: Angelpunk-Stein):
T
___________
|_X_|_X_|_X_|
|___|_O_|___|
|___|___|___|
L
___________
|___|_X_|___|
|___|_O_|___|
|___|_X_|_X_|
J
___________
|___|_X_|___|
|___|_O_|___|
|_X_|_X_|___|
S
___________
|___|_X_|_X_|
|_X_|_O_|___|
|___|___|___|
Z
___________
|_X_|_X_|___|
|___|_O_|_X_|
|___|___|___|
...wobei
___________
|_1_|_2_|_3_|
|_8_|_A_|_4_|
|_7_|_6_|_5_|
...mit Koordinaten
A: (x,y)
1: (x-1,y-1)
2: (x,y-1)
3: (x+1,y-1)
4: (x+1,y)
5: (x+1,y+1)
6: (x,y+1)
7: (x-1,y+1)
8: (x-1,y)
...ist.
Alles was man jetzt machen muss ist, einen Stein nehmen und ihn ihm Urzeigersinn im zwei Stellen entlang des Angelpunktes drehen.
Jetzt geht man so vor:
1.: Ermittle die Koordinaten der Angelpunktes: angelX, angelY.
2.: Ermittle die Koordinaten des zu verschiebenden Steins: altX, altY.
3.: Den Stein in der 3x3 Matrix betrachten:
Quelltext
1: 2:
| altX = altX - angelX altY = altY - angelY |
Das Ergebnis ist der Abstand des Steines in Bezug zum Angelpunkt. Also zB: (-1,-1) für den Stein an stelle 1.
4.: Errechne die neuen Koordinaten für den zu verschiebenden Stein: neuX, neuY.
Quelltext
1: 2:
| neuX = altY * (-1) neuY = altX |
5.: Mache 2.-4. für jeden Stein des Klotzes AUßER für den Angelpunkt.
...fertig.
Ich hoffe es war einigermaßen verständlich. Vllt habe ich einigen mit meiner Arbeit geholfen
Bei bedarf kann ich noch den "I"-Klotz erläutern.
Hier mein persönlicher Beispielcode:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45:
| procedure TKlotz.RotateKlotz; var zentrumX, zentrumY, xAlt, yAlt, xNeu, yNeu: Integer; begin
if AktKlotz.klotz in ['T', 'S', 'L', 'J', 'Z'] then begin zentrumX := AktKlotz.steinAngel.x; zentrumY := AktKlotz.steinAngel.y; xAlt := AktKlotz.stein2.x - zentrumX; yAlt := AktKlotz.stein2.y - zentrumY; Tetris.Spielbrett[xAlt + zentrumX, yAlt + zentrumY].aktiv := False; xNeu := (yAlt *(-1)) + zentrumX; yNeu := xAlt + zentrumY; AktKlotz.stein2.x := xNeu; AktKlotz.stein2.y := yNeu; xAlt := AktKlotz.stein3.x - zentrumX; yAlt := AktKlotz.stein3.y - zentrumY; Tetris.Spielbrett[xAlt + zentrumX, yAlt + zentrumY].aktiv := False; xNeu := (yAlt *(-1)) + zentrumX; yNeu := xAlt + zentrumY; AktKlotz.stein3.x := xNeu; AktKlotz.stein3.y := yNeu;
xAlt := AktKlotz.stein4.x - zentrumX; yAlt := AktKlotz.stein4.y - zentrumY; Tetris.Spielbrett[xAlt + zentrumX, yAlt + zentrumY].aktiv := False; xNeu := (yAlt *(-1)) + zentrumX; yNeu := xAlt + zentrumY; AktKlotz.stein4.x := xNeu; AktKlotz.stein4.y := yNeu; end; end; |
...is schon spät, ich entschuldige mich für jeglichen dummen Rechtschreobfehler
Edit:
Ok, klappt auch mit den anderen Figuren
