Cómo rotar bloques en tetris

17

Tengo una cuadrícula de tablero de juego que tiene 20 filas de alto y 10 columnas de ancho con el origen (0,0) en la esquina superior izquierda. Tengo un tetrimino en juego, que se compone de cuatro bloques. Tengo la ubicación x, y de cada bloque en relación con el origen de la esquina superior izquierda. También tengo la posición del pivote, el punto alrededor del cual deseo rotar que es relativo al origen de la esquina superior izquierda.

Cada bloque tiene una posición entera en un cuadrado de tablero de juego y, por lo tanto, el pivote tiene una posición fraccional entre bloques, por ejemplo (10.5,10.5)

Mi pregunta es: ¿Qué fórmula puedo usar para rotar cada bloque alrededor del pivote?

Ya he visto preguntas y respuestas similares existentes, pero no pude encontrar una respuesta que pudiera poner a trabajar.

La ayuda sería muy apreciada.


fuente
pertenece al juego dev.
y si está aquí ...
Si solo está rotando por múltiplos de ángulos rectos, entonces esto debería ser bastante básico. Simplemente dibuje algunos diagramas, y debería ser capaz de encontrar una solución entera.
Kerrek SB
3
No me molestaría en calcular realmente las rotaciones, simplemente coloque las cuatro versiones rotadas posibles en una matriz.
fredoverflow
1
También sugeriría lo que dijo @FredOverflow. Si observa mi pregunta (que es similar a la suya), verá cómo almacené un solo bloque para mi implementación.
bummzack

Respuestas:

22

La lógica de rotación estándar de Tetris se llama Super Rotation System. SRS es adecuado para juegos de Tetris de alto nivel, lo que permite muchas variaciones en patadas en la pared y t-spins.

Todos los tetrominoes existen dentro de un cuadrado delimitador y giran alrededor del centro de este cuadrado a menos que estén obstruidos. Los tetrominós de ancho 3 (J, L, S, T, Z) se colocan en las dos filas superiores del cuadrado delimitador y (para J, L y T) con el lado plano hacia abajo. Me colocan en la fila central superior.

Todos los tetrominoes aparecen en 2 filas generalmente ocultas en la parte superior del campo de juego. Se colocan en el centro de estas filas, redondeando a la izquierda. Una vez que un tetromino aterriza, no se bloquea hasta que expira el retraso de bloqueo. El comportamiento de retraso de bloqueo, llamado Infinity por la Compañía Tetris, restablece el retraso de bloqueo cada vez que se mueve o gira el tetromino. La caída dura generalmente se asigna a arriba, que no tiene retraso de bloqueo.

Tetrominos en su rotación delimitadores de cajas.

Existe otra variante común llamada ARS, que se utilizó en los juegos de Tetris de Arika : The Grand Master .


fuente
7

La fórmula general para girar alrededor del origen es

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

Por 90 grados se convierte

xNew = -y
yNew = x

Entonces, en primer lugar, obtenga las coordenadas del centro de ladrillo relativamente al punto de pivote:

x = xBrickCenter - xPivot
y = yBrickCenter - yPivot

Luego gírelos alrededor del punto de pivote:

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

Y luego agregue coordenadas de pivote al punto girado:

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

Pero si necesita rotar por múltiplos de 90 grados, puede almacenar cuatro conjuntos de posiciones de ladrillo para cada orientación y cambiar entre ellos en lugar de rotar realmente.

breakp01nt
fuente
0

Puede rotar todos los anillos cuadrados (a-a-h en 2 posiciones, A-a-P en 4 posiciones, etc.) alrededor de ese bloque de pivote:

ABCDE MNOPA
PabcF LghaB
Oh.dG -> Kf.bC
NgfeH JedcD
MLKJI IHGFE
Alexey Frunze
fuente