2013-11-30 4 views
1

Итак, я делаю игру в тетрис, и одна из проблем, с которыми я сталкиваюсь, - это частичное вращение. Я знаю, что могу просто записать его, но это не правильный способ сделать это. Как работает система, у меня есть 2d-массив объекта 'Tile', объект 'Tile' имеет x, y coords, boolean isActive и цвет. Логическое значение isActive в основном указывает компьютеру, на котором фактически используются фрагменты (так как формы tetris не являются совершенными квадритералями).Тетрис: Поворот кусков?

Вот как я хотел бы сделать форму в моей системе:

public static Tile[][] shapeJ() { 
    Tile[][] tile = new Tile[3][2]; 

    for (int x = 0; x < 3; x++) { 
     for (int y = 0; y < 2; y++) { 
      tile[x][y] = new Tile(false, Color.blue); 
     } 
    } 

    tile[0][0].setActive(true); 
    tile[0][0].setX(0); 
    tile[0][0].setY(0); 

    tile[1][0].setActive(true); 
    tile[1][0].setX(50); 
    tile[1][0].setY(0); 

    tile[2][0].setActive(true); 
    tile[2][0].setX(100); 
    tile[2][0].setY(0); 

    tile[2][1].setActive(true); 
    tile[2][1].setX(100); 
    tile[2][1].setY(50); 

    return tile; 
} 

Теперь мне нужно повернуть этот объект, я не знаю, как сделать это без жесткого кодирования позиции. Для этого должен быть алгоритм. Может ли кто-нибудь помочь?

+1

Hardcoding, какие позиции? Где каждая плитка тетронимо принадлежит в новой конфигурации? Если это то, что вы имеете в виду, спросите себя, что так плохо о «жесткой кодировке»? Обычно этот термин зарезервирован для входных или конфигурационных данных, которые могут быть изменены и должны быть сохранены в поле, но это было встроено непосредственно в код в качестве значения. Бит для изменения темы - это то, что делает жесткую кодировку плохой практикой в ​​большинстве случаев. То, что вы описываете, в этом смысле не является жестким. – MarsAtomic

+0

Значит, ты говоришь, что мне нужно его жестко записать? Думаю, я попробую. – zfollette

+0

Почему бы не инкапсулировать свои фрагменты в 'class' или' enum' и реализовать интерфейс? Я бы включил в этот интерфейс 'void rotateLeft()' и 'void rotateRight()'. –

ответ

3

Хороший способ, который я использовал при написании клона Тетрис использовать вращательные матрицы:

http://en.wikipedia.org/wiki/Rotation_matrix

Так координаты (X 'Y') точки (х, у) после поворота:

x '= x * cos (theta) - y * sin (theta);

y '= x * sin (theta) + y * cos (theta);

где тета является угол поворота (+ - 90 градусов или + -pi/2 радиан для функций ява, что я знаю) В этом случае блоки вращаются вокруг начала координат (0, 0), так вы либо должны иметь координаты блока в специальном «блочном пространстве», который затем переносится на «полевое пространство», либо вы удаляете смещение блока, чтобы он центрировался в начале каждой итерации.

Надеюсь, что это поможет, я с удовольствием отвечу на конкретные вопросы в комментариях.

+0

Спасибо. Я посмотрю, как это получится. – zfollette

+0

Использование Math.toRadians (Math.PI/2), похоже, правильное направление вращения. Теперь мне просто нужно заставить его полностью вращаться. – zfollette

+0

Nevermind, Im lost. – zfollette

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