ps:这是为那些感兴趣的人准备的githubhttps://github.com/yasakidev/animalrescueup/tree/master
我正在swing中开发一个“宠物救援传奇”java游戏。我对荡秋千还是个新手,遇到了问题。
我希望我的碎片被移除时会掉下来。在这里,我已经设法通过改变它们的颜色来“移除它们”,但我希望它们像俄罗斯方块一样掉落。
这是我的密码:
grid(jframe和singleton类)
import javax.swing.*;
import java.awt.*;
public class Grid extends JFrame {
private static Grid main;
private Case[][] cases;
public Grid() {
this.cases = new Case[8][8];
for (int i = 0; i < cases.length; i++) {
for (int j = 0; j < cases[i].length; j++) {
this.cases[i][j] = new Case(i, j);
this.add(cases[i][j]);
}
}
this.setSize(800, 800);
this.setLayout(new GridLayout(8,8));
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public Case getCase(int i, int j) {
return this.cases[i][j];
}
public static Grid getGrid() {
if(main == null) main = new Grid();
return main;
}
public void swap(int x1, int y1, int x2, int y2) {
Case temp = this.cases[x1][y1];
cases[x1][y1] = cases[x2][y2];
cases[x2][y2] = temp;
}
public void rebuild() {
for(int i = cases.length-1-1; i > 0; i--) {
for (int j = cases[i].length-1-1; j > 0; j--) {
int k = i;
while(!cases[k+1][j].isActive()) {
this.swap(i, j, i+1, j);
k++;
}
}
}
//swap(5,5,5,6);
}
}
case(它定义网格中的块,单击时,它们运行clicked(),并递归删除所有相邻的相同颜色的块)
import utils.RandomGen;
import javax.swing.*;
import javax.swing.border.LineBorder;
import java.awt.*;
public class Case extends JPanel {
private JButton btn;
private Color color;
private final int posX;
private final int posY;
private boolean isActive;
public Case(int x, int y) {
//Init Members
this.posX = x;
this.posY = y;
//Init Components
this.initColor();
this.initButton();
this.initPanel();
}
public void clicked() {
this.setVisible(false);
this.isActive = false;
checkAdjacent();
Grid.getGrid().rebuild;
}
private void initColor() {
int i = RandomGen.get(0,4);
switch(i) {
case 0 -> this.color = new Color(255,0,0);
case 1 -> this.color = new Color(0,0, 255);
case 2 -> this.color = new Color(136, 0, 255);
case 3 -> this.color = new Color(27, 255, 0);
default -> this.color = new Color(0, 0, 0);
}
}
private void initButton() {
this.btn = new JButton();
this.btn.setOpaque(false);
this.btn.setContentAreaFilled(false);
this.btn.setBorderPainted(false);
this.btn.addActionListener(new ClickEventHandler(this));
}
private void initPanel() {
this.setBorder(new LineBorder(new Color(0,0,0)));
this.setBackground(this.color);
this.add(btn);
this.setLayout(new CardLayout());
this.isActive = true;
this.setVisible(true);
}
private void checkAdjacent() {
//CLEAR DOWN
if(this.posX != 7 && Grid.getGrid().getCase(this.posX+1, this.posY).isActive && Grid.getGrid().getCase(this.posX+1, this.posY).getColor().getRGB() == this.color.getRGB()) Grid.getGrid().getCase(this.posX+1, this.posY).clicked();
//CLEAR UP
if(this.posX != 0 && Grid.getGrid().getCase(this.posX-1, this.posY).isActive && Grid.getGrid().getCase(this.posX-1, this.posY).getColor().getRGB() == this.color.getRGB()) Grid.getGrid().getCase(this.posX-1, this.posY).clicked();
//CLEAR RIGHT
if(this.posY != 7 && Grid.getGrid().getCase(this.posX, this.posY+1).isActive && Grid.getGrid().getCase(this.posX, this.posY+1).getColor().getRGB() == this.color.getRGB()) Grid.getGrid().getCase(this.posX, this.posY+1).clicked();
//CLEAR LEFT
if(this.posY != 0 && Grid.getGrid().getCase(this.posX, this.posY-1).isActive && Grid.getGrid().getCase(this.posX, this.posY-1).getColor().getRGB() == this.color.getRGB()) Grid.getGrid().getCase(this.posX, this.posY-1).clicked();
}
public Color getColor() {
return color;
}
public int getPosX() {
return posX;
}
public int getPosY() {
return posY;
}
public boolean isActive() {
return isActive;
}
}
下面是随机生成的问题网格的两个截图
例如,当单击红色图案时,我希望其余的块落下
我试着使用grid.rebuild()使这些块掉落,但显示器上没有任何变化。
如果你发现了坏习惯或错误,请把它们指给我看。
谢谢你的帮助!
暂无答案!
目前还没有任何答案,快来回答吧!