Java Tetris - размышление о частичном вращении
Я строю Тетрис и пытаюсь думать о том, как мне повернуть фигуры.
Они вращаются на одном блоке? Или они должны морфировать... ака менять позиции?
![enter image description here]()
То, как я собираюсь это сделать, - это тип жесткого кода... как (псевдокод):
if (rotateRight()) {
if (Piece == "T") {
if (Piece.getCurrRotation() == down (aka.. 180 degrees))
move each Tile in Piece from the down rotation to the left rotation... each coordinate would be pre-specified for a given condition... aka lot of hardcoding
}
if (Piece == "L") { etc...
}
}
if (rotateLeft()) {
perform same checks for the Left...
}
Но это, казалось бы, массовое количество кода, чтобы выяснить
), во вращение которого находится текущая деталь (имеется 4 возможных вращения для каждой части)
во-вторых) Оттуда... установите его в новые жестко закодированные координаты на основе этой части
Я должен был бы сделать это для каждой части... это кажется неправильным способом подумать об этом.
Любые другие мысли?
Ответы
Ответ 1
У меня, вероятно, было бы 1-4 Ориентационных объекта для каждого объекта PieceType. Каждая Ориентация тогда определяла бы положения фактических блоков (относительно некоторого стержня). Например,
PieceType "L":
Orientation 1:
#
#
##
Orientation 2:
###
#
Orientation 3:
##
#
#
Orientation 4:
#
###
PieceType "I":
Orientation 1:
#
#
#
#
Orientation 2:
####
Каждый PieceType может также содержать информацию о пространстве, необходимом для каждой возможной "смены ориентации" (то есть вращения). Это все статическая информация, поэтому на самом деле нет необходимости перемещать блоки во время игры. Просто измените Orientation of Piece и дайте объекту Orientation указать позиции блока.
Ответ 2
Если у вас есть кусочки, хранящиеся в виде матрицы, вы можете вращать матрицу с помощью общей функции. Скажем, вы хотите повернуть [[1, 1, 1], [0, 0, 0], [0, 0, 0]] на 90 градусов влево → [[1,0,0], [1,0, 0], [1,0,0]]. Помогает ли это?
Ответ 3
У вас есть 2 варианта (в зависимости от того, как вы храните свои фигуры):
- Выполняйте время выполнения вращения (сохраняйте свои фигурные точки в матрице и вращайте вокруг центра) с изменением положения блока формы.
- Хранить 4 (или для чередующихся по повороту форм, 2 или даже 1) фаз для формы и только увеличивать/уменьшать фазу, в которой находится ваша фигура.
В первой версии вам нужно вычислить время выполнения, найти центр вашей фигуры и т.д.
Во второй версии вы должны сделать предварительные вычисления и жестко закодировать фигуры.
Я думаю, что второй подход лучше, так как у вас есть фиксированное количество штук и фиксированное количество фаз. Но это зависит от вас.
Ответ 4
Этот примерный код выглядит как кошмар в процессе создания.
Другой способ сделать это, это было бы очень просто, заключалось бы в том, чтобы рассматривать плату как фиксированное количество ячеек, а затем просто рассматривать каждое "вращение" как способ вычисления того, сколько должно быть смещено положение каждой фигуры, то просто переделайте куски, а затем попросите их нарисовать себя, поэтому с точки зрения частей они просто говорят: "Хорошо, вы сейчас на A5".
Если вы посмотрите на свой первый пример, новые местоположения просто являются функцией их текущего смещения от центра и желаемого направления вращения.
Самое лучшее в этом подходе - это то, что вы не бегаете, делая тонну отвратительных аргументов, и создавая объектный код Бога, который будет полностью неустойчивым.
Ответ 5
IMHO, самый простой способ - не вращать или преобразовывать блок, а запоминать форму блока в каждом из его состояний (нормальный, rotated_90_degrees, rotated_180_degrees, rotated_270_degrees)
Ответ 6
Я бы предположил, что вы определяете кусок как точки относительно одной точки вращения. Затем вы можете (с небольшой матричной алгеброй) применить 3-кратное вращение, чтобы получить другие макеты относительно центральной точки.
Вращение затем снимает текущие точки с отображаемой игры, переключается на следующее вращение, а затем повторно накладывает новые точки на отображаемую игру.