首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >摆动落地块

摆动落地块
EN

Stack Overflow用户
提问于 2014-01-23 06:20:55
回答 1查看 157关注 0票数 0

我正在做一个简单的游戏,用户点击彩色方块,所有相邻的相同颜色的方块一起消失。当一个块消失时,它上面的所有块都应该落下并填满空白空间。我该如何实现这种操作呢?我可以检查网格中的所有块,但这是一个巨大的浪费。我还可以跟踪给定列中有多少空格,但我认为应该有更好的方法来实现它。下面是一些代码,展示了我如何创建网格和每个单元格:

代码语言:javascript
运行
复制
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;
}

}
EN

回答 1

Stack Overflow用户

发布于 2014-01-23 06:46:10

你将面临的最大的绊脚石是处理“空”块。大多数布局不会“保留”屏幕未使用部分的空间。

GridBagLayout提供了获取用于布局原始组件的GridBagConstraints的方法。

代码语言:javascript
运行
复制
GridBagLayout gbl = new GridBagLayout();
//...
GridBagConstarints gbc = gbl.getConstraints(comp);

这为您提供了调整组件约束的方法,但不要忘记重新应用它们……

代码语言:javascript
运行
复制
gbl.setConstraints(comp, gbc);

我要做的是创建一个“空白”GridCell的概念。这是一个无法单击的单元格,它被绘制为中性颜色(或者是透明的,取决于您的需要)。当您“移除”active GridCell时,您会将其替换为一个“空白”单元格。

然后,您需要计算空白单元格的位置,并调整它们周围所有单元格的位置。

这最好是通过使用“虚拟”模型来实现。您只需在此模型中维护游戏的状态(例如int数组),并且在更新时,只需更新实际视图以匹配模型。

这将使确定单个单元格需要排列的位置变得更加简单。

但那只是我..。

已更新

您还可以考虑使用GridLayout并更改组件的Z顺序,例如...

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21295247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档