我正在尝试用java制作游戏俄罗斯方块。
我已经达到了以下目的:
当一个新的块碰到地板或者它的y + 1不为空(意味着它下面还有另一个块)时会产生一个新的块。
public void collisionCheck(int x, int y) {
if (activetile.getY() == this.height-2 || getTileAt(x, y+1) != null) {
activetile = new Tile(this, 0, 0);
}
}
当底行充满非空值或俄罗斯方块片段(y = 4(地板),循环x到x = 4并检查是否所有非空)时,行清除
public void checkBottomFull(int x, int y) {
while (getTileAt(x,y) != null) {
say("(" + x + ", " + y +")");
if (x == 3) {
say("row is full");
//replace full row with tiles from above
for (int i = 0; i < 4; i++) {
for (int j = 5; j > 0; j--) {
grid[j][i] = getTileAt(i,j-1);
grid[j-1][i] = null;
}
}
break;
}
x++;
}
}
现在,我正在使用键来移动块:
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if(keyCode == KeyEvent.VK_DOWN) {
activetile.setLocation(activetile.getX(), activetile.getY()+1);
System.out.println("coordinates: " + activetile.getX() + ", " + activetile.getY());
collisionCheck(activetile.getX(),activetile.getY());
checkBottomFull(0,4);
repaint();
}
}
我遇到了两个问题:
1)在图片中你会注意到我已经把挡块一直掉到了地板上......并且行被清除了。清除后,它将生成一个左上角的块(x = 0,y = 1),我无法控制。
2)在地板上似乎有一条红线......我假设是JFrame隐藏的一排块...我不知道为什么会这样。
仅供参考:如果你想知道为什么grid [j] [i]有行和列翻转(也就是说,为什么它不是grid [i] [j])是因为我将它实例化为grid = new Tile[height][width];
< / p>
有什么想法吗?
谢谢!
答案 0 :(得分:0)
如果没有实际调试您的应用,很难说出了什么问题。 但也许试试这个:
public void checkBottomFull(int x, int y) {
while (getTileAt(x,y) != null) {
say("(" + x + ", " + y +")");
if (x == 3) {
say("row is full");
//replace full row with tiles from above
for (int i = 0; i < 4; i++) {
for (int j = 4; j >= 0; j--) {
grid[j][i] = getTileAt(i,j-1);
grid[j-1][i] = null;
}
}
break;
}
x++;
}
}
您有5行(索引从0到4)和4列(从0到3索引)。 您传递给身高和宽度的值: grid = new Tile [height] [width];
因为从我看到你应该做的事情: grid = new Tile [5] [4];
答案 1 :(得分:0)
呸,
在关键事件中,我需要在检查是否有碰撞之前检查底部是否已满。
我猜发生的事情是,当我在collisionCheck(activetile.getX(),activetile.getY());
之前检查checkBottomFull(0,4);
时,当底部已满时,它将清除该行并将当前行设置为等于其上方的行:{ {1}},问题是grid[j][i] = getTileAt(i,j-1);
正在生成一个新作品,而新生成的作品正在被清除并由collisionCheck
替换。
在checkBottomFull
之后进行碰撞检查可确保如果底部已满,则不会更换新生成的部件。