Вращение тетриса без массивов

Я пишу тетрис клон, это почти сделано, за исключением столкновений. Например, для перемещения фигуры Z я использую метод:

void PieceZ::movePieceDown()
{
drawBlock (x1,y1++);
drawBlock (x2,y2++);
drawBlock (x3,y3++);
drawBlock (x4,y4++);
}

и для поворота фигуры я использую сеттер (потому что координаты являются частными). Для вращения я использую матрицу вращения на 90 градусов по часовой стрелке. Например, если я хочу переехать (X1, y1) а также (х2, у2) мой источник, чтобы получить x и y нового блока:

newX = (y1-y2) + x2;
newY = (x2-x1) + y2 + 1;

Это работает в некоторой степени, это начинается как:

0 0 0 0
0 1 1 0
0 0 1 1
0 0 0 0

Затем, как и планировалось, он поворачивается к:

0 0 0 1
0 0 1 1
0 0 1 0
0 0 0 0

И затем он поворачивается на кусок S:

0 0 0 0
0 0 1 1
0 1 1 0
0 0 0 0

И тогда он просто чередуется между вторым и третьим этапами.

Мои расчеты неверны, но я не могу понять, где, мне просто нужна небольшая подсказка.

0

Решение

Хорошо, вот как это должно идти (несколько):

  • Определите, где вы хотите повернуть фигуру (это может быть верхний или нижний угол или центр) и назовите ее origin
  • Рассчитать новый х newX = y - origin.y;
  • Рассчитайте новый у newY = -x + origin.x;

Это должно работать (я получил эту идею из википедии и матрицы вращения: https://en.wikipedia.org/wiki/Transformation_matrix)

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]