2014-01-22 3 views
0

Я делаю простую игру, где пользователь нажимает на цветные блоки и все соседние блоки одного цвета исчезают вместе. Когда блок исчезает, все блоки поверх него должны упасть и заполнить пустое пространство. Как я мог бы реализовать такие действия? Я мог проверить все блоки в сетке, но это огромная трата. Я мог бы также отслеживать, сколько пустых пространств находится в данном столбце, но я думаю, что должен быть лучший способ его реализовать. Вот код, показывающий, как я сделал сетку и каждую клетку:Качели для качания

public class GridPanel extends JPanel{ 

    private GridCell[][] grid; 
    private static final int DEFAULT_SIZE = 25; 
    private static final Color[] COLORS = {Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW}; 
    private Random random; 


    public GridPanel(int x, int y){ 
     random = new Random(); 
     grid = new GridCell[x][y]; 
     GridBagConstraints gbc = new GridBagConstraints(); 
     setLayout(new GridBagLayout()); 
     for(int i = 0; i < grid.length; i++){ 
      for(int j = 0; j < grid[i].length; j++){ 
       GridCell gc = new GridCell(i, j, DEFAULT_SIZE); 
       Border border = new MatteBorder(1, 1, 1, 1, Color.GRAY); 
       gc.setBorder(border); 
       gc.setBackground(COLORS[random.nextInt(COLORS.length)]); 
       gbc.gridx = i; 
       gbc.gridy = j; 
       add(gc, gbc); 
       grid[i][j] = gc; 
      } 
     } 
    } 
} 

public class GridCell extends JPanel{ 

private int x; 
private int y; 
private int size; 

public GridCell(int x, int y, int size){ 
    this.x = x; 
    this.y = y; 
    this.size = size; 
} 

@Override 
public Dimension getPreferredSize() { 
    return new Dimension(size, size); 
} 

public GridCoordinate getCoordinates(){ 
    return new GridCoordinate(x, y); 
} 

public int getCellSize(){ 
    return this.size; 
} 

} 
+0

Я бы не подумал, что ваш лучший выбор будет колебаться. Макеты свинг уже сложны. Сделать так, чтобы они работали, это будет тяжелая битва. Возможно, вам стоит подумать об использовании lwgl http://lwjgl.org/, или вы можете сделать рисунок самостоятельно с помощью библиотек 2D-чертежей в JRE. –

+0

@MarkW спасибо, что я проверил это – nh0815

+0

@MarkW На самом деле, относительно легко, даже с 'GridBagLayout', но' GridLayout' будет намного проще – MadProgrammer

ответ

3

Самый большой камень преткновения вы столкнуться имеет дело с «пустыми» блоков. Большинство макетов не «резервируют» пространство неиспользуемых частей экрана.

GridBagLayout предоставляет средства для получения GridBagConstraints, используемых для выкладки оригинальных компонентов.

GridBagLayout gbl = new GridBagLayout(); 
//... 
GridBagConstarints gbc = gbl.getConstraints(comp); 

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

gbl.setConstraints(comp, gbc); 

Что я хотел бы сделать, это создать концепцию «пустой» GridCell. Это ячейка, которая не может быть нажата и окрашена в нейтральный цвет (или прозрачна в зависимости от ваших потребностей). Когда вы «удаляете» активный GridCell, вы должны заменить его «пустой» ячейкой.

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

Этого лучше всего достичь с помощью «виртуальной» модели. Вы просто сохранили бы состояние игры в этой модели (например, например, массив int), и при обновлении просто обновите фактическое представление в соответствии с моделью.

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

Но это только мне ...

Обновлено

Вы могли бы также рассмотреть возможность использования GridLayout и чейнинга Z-порядка компонентов, например ...

Смежные вопросы