Jak obracać bloki w tetris

16

Mam planszę do gry, która ma 20 rzędów wysokości i 10 kolumn szerokości, a początek (0,0) znajduje się w lewym górnym rogu. Mam w grze tetrimino, które składa się z czterech bloków. Mam lokalizację x, y każdego bloku względem początku lewego górnego rogu. Mam także pozycję punktu obrotu, punkt, wokół którego chcę obrócić, względem punktu początkowego lewego górnego rogu.

Każdy blok ma pozycję całkowitą w kwadracie planszy, a zatem czop ma pozycję ułamkową między blokami, np. (10,5,10,5)

Moje pytanie brzmi: jakiej formuły mogę użyć, aby obrócić każdy blok wokół osi obrotu?

Przeglądałem już istniejące podobne pytania i odpowiedzi, ale nie mogłem znaleźć odpowiedzi, którą mógłbym dostać do pracy.

Pomoc będzie bardzo mile widziane.


źródło
należy do twórcy gry.
a jeśli jest tutaj ... pokaż nam jakąś strukturę danych
Jeśli obracasz tylko o wielokrotności kątów prostych, powinno to być dość proste. Wystarczy narysować kilka diagramów i powinieneś być w stanie znaleźć rozwiązanie na liczbę całkowitą.
Kerrek SB
3
Nie zawracałbym sobie głowy faktycznym obliczeniem obrotów, po prostu umieszczam wszystkie cztery możliwe obrócone wersje w tablicy.
fredoverflow
1
Sugerowałbym również, co powiedział @FredOverflow. Jeśli spojrzysz na moje pytanie (podobne do twojego), zobaczysz, jak zapisałem pojedynczy blok dla mojej implementacji.
bummzack

Odpowiedzi:

21

Standardowa logika obrotu Tetris nazywa się Super Rotation System. SRS jest przystosowany do gry Tetris na wysokim poziomie, pozwalając na wiele odmian kopnięć w ścianę i spinów typu T.

Wszystkie tetromino istnieją w obrębie ograniczającego kwadratu i obracają się wokół środka tego kwadratu, chyba że są zablokowane. Tetromino o szerokości 3 (J, L, S, T, Z) umieszcza się w dwóch górnych rzędach ograniczającego kwadratu i (dla J, L i T) płaską stroną do dołu. Jestem umieszczony w górnym środkowym rzędzie.

Wszystkie tetromino odradzają się w 2 zwykle ukrytych rzędach u góry pola gry. Są one umieszczane na środku tych rzędów, zaokrąglając w lewo. Po wylądowaniu tetromino nie blokuje się, dopóki nie upłynie opóźnienie blokady. Zachowanie opóźnienia blokady, zwane przez firmę Tetris Infinity, resetuje opóźnienie blokady, ilekroć tetromino jest przesuwane lub obracane. Twarde upuszczanie jest zwykle mapowane na górę, która nie ma opóźnienia blokady.

Tetromina w swoich obwiedniach ograniczających obrót.

Istnieje inny popularny wariant o nazwie ARS, który był używany w grach Arika's Tetris: The Grand Master .


źródło
7

Ogólny wzór na obracanie wokół początku to

xNew = x * cos(a) - y * sin(a)
yNew = x * sin(a) + y * cos(a)

Dla 90 stopni staje się

xNew = -y
yNew = x

Najpierw uzyskaj współrzędne środka cegły względem punktu obrotu:

x = xBrickCenter - xPivot
y = yBrickCenter - yPivot

Następnie obróć je wokół punktu obrotu:

x1 = -y = yPivot - yBrickCenter
y1 = x = xBrickCenter - xPivot

A następnie dodaj współrzędne obrotu do obróconego punktu:

newXBrickCenter = xPivot + x1 = xPivot + yPivot - yBrickCenter
newYBrickCenter = yPivot + y1 = yPivot - xPivot + xBrickCenter

Ale jeśli chcesz obracać o wielokrotność 90 stopni, możesz zapisać cztery zestawy cegieł dla każdej orientacji i przełączać się między nimi zamiast faktycznie obracać.

breakp01nt
źródło
0

Możesz obrócić wszystkie kwadratowe pierścienie (od A do H o 2 pozycje, od A do P o 4 pozycje itd.) Wokół tego bloku przestawnego:

ABCDE MNOPA
PabcF LghaB
Oh.dG -> Kf.bC
NgfeH JedcD
MLKJI IHGFE
Alexey Frunze
źródło