2013-04-08 3 views
0

Я делаю 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 явно завышено. Есть ли общее руководство, которому я могу следовать, чтобы значительно упростить это? Я не могу думать о другом способе получить позиции для каждой фигуры?

+3

BTW, 'направление ==" right "' неправильно, если ваша цель - сравнить строки. Вы должны использовать метод '.equals'. – Maroun

+2

@MarounMaroun отмечен и исправлен в моем коде. Благодаря! – Growler

ответ

4

Есть только так много штук. Попробуйте имея это:

public abstract class Piece { 
    public abstract void rotate(Direction dir); 
} 

public class BarPiece extends Piece { 
    public void rotate(Direction dir) { 
     // implement 
    } 
} 

public class TPiece extends Piece { 
    // ... 
} 

public class LeftSPiece extends Piece { 
    // ... 
} 

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