Я делаю Tetris на Java и работаю над поворотом части.Java Tetris - Вращения
Для начала я просто вращал фигуру в форме бара.
Я чувствую, как я это делаю сейчас, это не только багги, но и полный перебор. Но я не уверен, как это сделать.
Во-первых, у меня есть keylistener, который устанавливает int[] rotatedCoords
, равный calcRotation("right")
... Если поворот влево, то вместо rotationsCounter+=1;
будет декремент.
if (keycode == KeyEvent.VK_D) {
int[] rotatedCoords = calcRotation("right");
rotationsCounter+=1;
clearCurrPosition();
rotate(rotatedCoords);
System.out.println(rotationsCounter);
if (rotationsCounter == 4) {
rotationsCounter = 0;
}
System.out.println(rotationsCounter);
}
calcRotation (String справа или слева) получает текущие координаты всех 4 плитки в части и направляет их в int[] getRotation(String shape, String direction, int[] current X coords, int[] current Y Coords)
public int[] calcRotation(String direction) {
for (int i = 0; i < tile.length; i++) {
currPositionX[i] = tile[i].getX();
currPositionY[i] = tile[i].getY();
System.out.println(currPositionX[i] + ", " + currPositionY[i]);
}
return getRotation("Bar", direction, currPositionX, currPositionY);
}
затем getRotation [] устанавливает новые координаты, на основании которых направления вращения был выбран (вправо или влево), которые формируют она есть, и вращение против которого он находится на (0 градусов, 90 градусов, 180 или 270 ...)
if (direction == "right") {
if (shape == "Bar") {
if (rotationsCounter == 0) {
currXs[0] += 1;
currYs[0] += -1;
currXs[1] += 0;
currYs[1] += 0;
currXs[2] += -1;
currYs[2] += 1;
currXs[3] += -2;
currYs[3] += 2;
rightRotate1 = new int[] {currXs[0], currYs[0], currXs[1], currYs[1], currXs[2], currYs[2], currXs[3], currYs[3]};
}
if (rotationsCounter == 1) {
... etc
Тогда координаты () должен быть установлен соответствующим образом:
//handle on left rotations
if (direction == "right") {
if (shape == "Bar") {
if (rotationsCounter == 0) {
pieceRotations = rightRotate1;
}
if (rotationsCounter == 1) {
pieceRotations = rightRotate2;
}
if (rotationsCounter == 2) {
pieceRotations = rightRotate3;
}
if (rotationsCounter == 3) {
pieceRotations = rightRotate0;
}
}
}
if (direction == "left") {
if (shape == "Bar") {
if (rotationsCounter == 0) {
pieceRotations = rightRotate3;
}
if (rotationsCounter == 1) {
pieceRotations = rightRotate0;
}
if (rotationsCounter == 2) {
pieceRotations = rightRotate1;
}
if (rotationsCounter == 3) {
pieceRotations = rightRotate2;
}
}
}
return pieceRotations;
}
Тогда, наконец, rotate(rotatedCoords)
будет называться с правильными координатами, чтобы повернуть все плитки тоже ...
public void rotate(int[] rotatedCoordinates) {
int counterX = 0, counterY = 1;
if (movePieceValid()) {
for (int i = 0; i < tile.length; i++) {
tile[i].setLocation(rotatedCoordinates[counterX], rotatedCoordinates[counterY]);
counterX+=2;
counterY+=2;
}
} else {
for (int i = 0; i < tile.length; i++) {
tile[i].setLocation(currPositionX[i], currPositionY[i]);
}
}
}
Итак, мой текущий путь вычисление новых координат на основе текущего положения каждой формы для left
или right
явно завышено. Есть ли общее руководство, которому я могу следовать, чтобы значительно упростить это? Я не могу думать о другом способе получить позиции для каждой фигуры?
BTW, 'направление ==" right "' неправильно, если ваша цель - сравнить строки. Вы должны использовать метод '.equals'. – Maroun
@MarounMaroun отмечен и исправлен в моем коде. Благодаря! – Growler