Как вращать блоки в тетрисе

16

У меня есть сетка игровой доски, которая имеет высоту 20 строк и ширину 10 столбцов, а начало координат (0,0) находится в верхнем левом углу. У меня в игре тетримино, состоящее из четырех блоков. У меня есть координаты x, y каждого блока относительно верхнего левого угла. У меня также есть положение оси вращения, точка вокруг которой я хочу вращаться относительно точки отсчета верхнего левого угла.

Каждый блок имеет целочисленную позицию в квадрате игровой доски и, таким образом, стержень имеет дробную позицию между блоками, например (10.5,10.5)

Мой вопрос: какую формулу я могу использовать, чтобы вращать каждый блок вокруг оси?

Я уже посмотрел на существующие подобные вопросы и ответы, но не смог найти ответ, который я мог бы получить на работу.

Помощь будет высоко ценится.


источник
принадлежит к разработке игр.
и если это здесь ... покажите нам некоторую структуру данных
Если вы вращаетесь только на несколько углов, то это должно быть довольно просто. Просто нарисуйте несколько диаграмм, и вы сможете найти целочисленное решение.
Kerrek SB
3
Я бы не стал вычислять вращения, просто поместил все четыре возможные версии в массив.
fredoverflow
1
Я также хотел бы предложить то, что сказал @FredOverflow. Если вы посмотрите на мой вопрос (который похож на ваш), вы увидите, как я хранил один блок для своей реализации.
Bummzack

Ответы:

21

Стандартная логика вращения тетриса называется Super Rotation System. SRS подходит для высокоуровневой игры в тетрис, что позволяет варьировать удары по стенке и т-спины.

Все тетромино существуют внутри ограничивающего квадрата и вращаются вокруг центра этого квадрата, если не заблокированы. Тетромино шириной 3 (J, L, S, T, Z) размещаются в двух верхних рядах ограничивающего квадрата и (для J, L и T) плоской стороной вниз. Я помещен в верхнем среднем ряду.

Все тетромино появляются в 2 обычно скрытых рядах в верхней части игрового поля. Они размещены в центре этих рядов, округляясь влево. Как только тетромино приземляется, оно не блокируется, пока не истечет время задержки блокировки. Поведение задержки блокировки, которое компания Tetris называет Infinity, сбрасывает задержку блокировки всякий раз, когда тетромино перемещается или вращается. Жесткий сброс обычно отображается вверх, который не имеет задержки блокировки.

Тетромино в своих вращающихся ограничительных коробках.

Есть еще один распространенный вариант, называемый ARS, который использовался в играх Arika's Tetris: Grand Master .


источник
7

Общая формула для вращения вокруг происхождения

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

На 90 градусов становится

xNew = -y
yNew = x

Итак, сначала получим координаты центра кирпича относительно точки поворота:

x = xBrickCenter - xPivot
y = yBrickCenter - yPivot

Затем поверните их вокруг точки поворота:

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

А затем добавьте координаты поворота к повернутой точке:

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

Но если вам нужно повернуть на 90 градусов, вы можете сохранить четыре набора позиций кирпича для каждой ориентации и переключаться между ними вместо фактического вращения.

breakp01nt
источник
0

Вы можете вращать все квадратные кольца (a-through-h на 2 позиции, A-through-P на 4 позиции и т. Д.) Вокруг этого поворотного блока:

ABCDE MNOPA
PabcF LghaB
Oh.dG -> Kf.bC
NgfeH JedcD
MLKJI IHGFE
Алексей Фрунзе
источник