Як обертати блоки в тетрісі


16

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

Кожен блок має ціле положення в квадраті ігрового поля, і, таким чином, стрижень має дробове положення між блоками, наприклад (10.5,10.5)

Моє запитання: Яку формулу можна використовувати для обертання кожного блоку навколо стрижня?

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

Допомога була б дуже вдячна.


належить до гри dev.

і якщо його тут ... покажіть нам деяку структуру даних

Якщо ви обертаєтеся лише на кілька кратних прямих кутів, то це має бути досить базовим. Просто намалюйте кілька діаграм, і ви зможете розібратися з цілим рішенням.
Керрек СБ

3
Я б не переймався фактично обчислювати обертання, просто поклав усі чотири можливі повернені версії в масив.
fredoverflow

1
Я б також запропонував те, що сказав @FredOverflow. Якщо ви подивитесь на моє запитання (яке схоже на ваше), ви побачите, як я зберігав єдиний блок для моєї реалізації.
bummzack

Відповіді:


21

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

Усі тетроміно існують всередині обмежувального квадрата і обертаються навколо центру цього квадрата, якщо вони не перешкоджають. Тетроміно шириною 3 (J, L, S, T, Z) розміщують у двох верхніх рядах обмежувального квадрата і (для J, L і T) плоскою стороною вниз. Я розміщується у верхньому середньому ряду.

Усі тетроміно породжуються в 2 зазвичай приховані ряди у верхній частині ігрового поля. Вони розміщуються в центрі цих рядів, закруглюючи зліва. Як тільки тетроміно приземлиться, воно не блокується, поки не закінчиться затримка блокування. Поведінка затримки блокування, яку компанія Tetris називає Infinity, скидає затримку блокування кожного разу, коли тетроміно переміщується або повертається. Тверде падіння, як правило, відображається вгору, що не має затримки блокування.

Тетроміно в обмежувальних коробках обертання.

Існує ще один поширений варіант під назвою ARS, який використовувався в іграх Arika Tetris: The 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 градусів, ви можете зберігати чотири набори цегляних позицій для кожної орієнтації та перемикатися між ними, а не насправді обертатись.


0

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

ABCDE MNOPA
PabcF LghaB
Oh.dG -> Kf.bC
NgfeH JedcD
MLKJI IHGFE

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.