Rotations Algorithmus für Tetris



  • Ich wollte einen Tetris klon erstellen, habe aber Probleme, mit der Rotation

    so will ich z.B. folgenden Stein rotieren lassen um 90 grad, hab aber keine lust, alle Steainphasen hardzucoden:

    0000
    0100
    1110
    

    zu folgendem rotieren lassen:

    0010
    0110
    0010
    

    Hätte da jemand eine Idee zu?



  • Sieht wie eine transponierte Matrix auf, außer dass sie nicht quadratisch ist.



  • 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
     | | |    0
    

    Beim 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 3
    

    oder 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

    Autocogito

    Gruß, TGGC (making great games since 1992)


Anmelden zum Antworten