2016-04-26 5 views
0

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

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

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

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

Чтобы убедиться, что преобразование верно, поверните сам источник. Результат должен состоять в том, чтобы блок не двигался. В вашем случае 'newX' остается' x2', но 'newY' становится' y2 + 1', вместо оставшегося 'y2'. – Dialecticus

+0

Кроме того, разные координаты не должны существовать в одном выражении. Поскольку вы вращаете кусок, все значения, которые влияют на координацию 'x', должны иметь вид' y', и все, что влияет на 'y', должно быть' x' в природе. – Dialecticus

+0

Блок, который вы используете в качестве источника, обновляется после того, как вы вычислили , но прежде чем вы начнете вычислять и , поэтому не все блоки используют одинаковые исходные координаты. Вы должны сохранить копию , которая останется неизменной на протяжении всего расчета преобразования. –

ответ

0

Ok вот как она должна идти (несколько):

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

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

+0

Большое спасибо за ваше время! Понятно, что математически выражения правильны, но они не работают для меня. Как сказал ** ChristopherOicles **, это, вероятно, потому, что значение моего происхождения всегда меняется, потому что я его реализую. Но фиксация его вообще не фиксирует. Думаю, мне нужно сыграть с координатами, чтобы понять это. –

Смежные вопросы