Rotations Algorithmus für Tetris
-
was muss man da schlimmes hardcoden?
uint16_t L[4] = {0x6440, 0x08f0, 0x0226, 0x0f10 };
Ist ein L in allen vier Richtungen. Das Codieren auf Papier hat mich eine Minute meines Lebens gekostet.
Du brauchst ja nix weiter, als eine Bitmaske und da die Blöcke alle 4*4 sind, kannst du es dir Ganz einfach machen:
8|4|2|1 | | | 0 8|4|2|1 |x|x| 4+2 = 6 (auch in hex) 8|4|2|1 |x|x| 4+2 = 6 8|4|2|1 | | | 0Beim Block bleibts in allen vier Richtungen 0x0660.
Der Rest ist Mathematik und ein paar Bit-Operationen.
-
http://de.wikipedia.org/wiki/Drehmatrix
Für die winkel setzt du 90° ein, also sind sinus 1 und cosinus 0 und dann weißt du, wie du einen Block drehen musst. auch ohne bitmaske und so, wobei das mit der bitmaske finde ich einfacher ist

-
und etliches schneller, sinus-lookup-table hin oder her..
axoo.. die Abfrage eines "Pixels" in der Bitmaske geht ca so
int pixel = 0x0001 & (bitmask >> (x + y * 4))
-
wobei es bei tetris nich grad auf den speed ankommt. außerdem musst du hier nicht mal ne sinuslookuptabelle haben, denn es gibt nur einen wert für sinus und einen für cosinus nämlcih 1 und 0 wenn du immer um 90° drehst. Dass es trotzdem langsamer ist, keine Frage.
Aber nicht so fehleranfällig. Was ist, wenn du dich vertippst und du hast dann ganz komische blöcke?
-
Warum so kompliziert mit Sinus und Cosinus?
Wenn man nur um 90° rotiert, ist das doch wirklich trivial. Da muss man doch nur x und y vertauschen bzw. spiegeln.
-
das mit x und y wechseln wird nicht klappen, was wohl, wenn die steine als x und y koordinaten (1,1) oder (2,2) etc haben, das würde das wechseln der x und y koordinaten nichts bringen.
PS: das war auch meine erste idee
-
Darum sagte ich ja auch noch "spiegeln".
Mit Spiegeln und Vertauschen (separat auf beiden Achsen) sollte man eigentlich alles in 90°-Schritten hinkriegen.
-
ich würd einfach die Zeilenweise einlesen, aber In spalten schreiben:
also was ich in der ersten Zeile lese, schreibe ich in der gleichen Reihenfolge in die letzte Spalte
Beispiel, die zahlen geben an, in welcher Reihenfolge eingelesen wird, und im zweiten bild in welcher folge aufgeschrieben wird. als 1 landet auf 1 und 2 auf 2 etc:1 2 3 7 4 1 4 5 6 ---> 8 5 2 7 8 9 9 6 3oder etwas größer
1 2 3 4 13 9 5 1 5 6 7 8 __\ 14 10 6 2 9 10 11 12 / 15 11 7 3 13 14 15 16 16 12 8 4
-
Könnte mir vielleicht einer ein beispiel zu der Rotationsmatrix geben?
-
Du brauchst keine Rorationsmatrix. Es ist einfach steinneu[x][y]= steinalt[y][-x]. Das sollte man in 3. Minuten nachdenken rauskriegen. f'`8k
AutocogitoGruß, TGGC (making great games since 1992)