Я реализую простую игру тетрис, в которой у вас есть несколько фигур:
- Форма S
- линия
- квадрат
- etc
В типичной игре, когда вы нажимаете UP на клавиатуре, падающая фигура будет вращаться по часовой стрелке.
Я определил фигуру в своем JavaScriptреализация в виде массива координат точек.Например, форма S имеет вид:
[
{x:0, y:2},
{x:0, y:1},
{x:1, y:1},
{x:1, y:0}
]
. Это приведет к следующей форме:
Нажатие вверх, должнопреобразовать приведенный выше массив в следующий массив:
[
{x:0, y:0},
{x:1, y:0},
{x:1, y:1},
{x:2, y:1}
]
AKA, эта форма:
Для этого я ... бессовестно жестко закодировал координаты вshapeRotationMap
объект:
let shapeRotationMap = {
"line0": [
{x:0, y:0},
{x:0, y:1},
{x:0, y:2},
{x:0, y:3},
],
"line1": [
{x:0, y:0},
{x:1, y:0},
{x:2, y:0},
{x:3, y:0},
],
"leftS0": [
{x:0, y:0},
{x:1, y:0},
{x:1, y:1},
{x:2, y:1},
],
"leftS1": [
{x:0, y:1},
{x:0, y:2},
{x:1, y:0},
{x:1, y:1},
],
"rightS0": [
{x:0, y:1},
{x:1, y:1},
{x:1, y:0},
{x:2, y:0},
],
"rightS1": [
{x:0, y:0},
{x:0, y:1},
{x:1, y:1},
{x:1, y:2},
],
"podium0": [
{x:0, y:1},
{x:1, y:0},
{x:1, y:1},
{x:1, y:2},
],
"podium1": [
{x:0, y:0},
{x:1, y:0},
{x:1, y:1},
{x:2, y:0},
],
"podium2": [
{x:0, y:0},
{x:0, y:1},
{x:0, y:2},
{x:1, y:1},
],
"podium3": [
{x:0, y:1},
{x:1, y:0},
{x:1, y:1},
{x:2, y:1},
]
}
shapeRotationMap["line2"] = shapeRotationMap["line0"];
shapeRotationMap["line3"] = shapeRotationMap["line1"];
shapeRotationMap["leftS2"] = shapeRotationMap["leftS0"];
shapeRotationMap["leftS3"] = shapeRotationMap["leftS1"];
shapeRotationMap["rightS2"] = shapeRotationMap["rightS0"];
shapeRotationMap["rightS3"] = shapeRotationMap["rightS1"];
["square0", "square1", "square2","square3"].forEach(function(key){
shapeRotationMap[key] = [
{x:0, y:0},
{x:0, y:1},
{x:1, y:0},
{x:1, y:1},
];
});
У меня есть строка формы ("line"
) и вращение (0
, 1
, 2
или 3
), и вот как я знаюкакой объект взять.
Однако это усложняет код, затрудняет добавление новой фигуры, и, просто публикуя ее здесь, я чувствую, что оскорбляю нескольких программистов.
НоЯ не могу найти алгоритм для поворота такого объекта.
Я нашел этот алгоритм: Как повернуть матрицу в массиве в JavaScript .Но здесь у OP есть двумерный массив (матрица), и в моем случае у меня есть объект координат.
Кто-нибудь знает, как я могу повернуть мой объект на 90 °?
Если нет, думаю, я переключу свою логику и вместо этого буду использовать матрицу.