我正在建造俄罗斯方块,并且对于如何制作一块硬件感到困惑。
我尝试向Board类添加hardDrop()
方法,该方法将从底行迭代并检查空格...
董事会成员:
public int hardDrop() {
int hardDropRow = 0;
for(int row = totalRows-1; row > 0; row--) {
for(int col = 0; col < grid[row].length; col++) {
if (grid[row][col] != null) {
hardDropRow = row;
return hardDropRow;
}
}
}
return hardDropRow;
}
片类:
然后在这里,我会将有效的dropRow
添加到getRow()
:
//Hard drop
if (keycode == KeyEvent.VK_UP) {
//get next valid coordinates nearest to bottom
//hard drop needs to which row the piece needs to drop to
int dropRow;
dropRow = board.hardDrop();
for (int i = 0; i < tile.length; i++) {
calcNewPosition(tile[i].getRow()+dropRow, tile[i].getCol(), i);
}
当我按下时,即使整个底部都是空的,这件作品似乎也会跳过几行...所以它应该移动到那个位置。
有什么建议吗?
谢谢!
编辑 -
我已经更新了我的计时器,因此它接受了一个值...如果val == 1
,则意味着瞬间掉落...所以它设置间隔= 10毫秒......
如果val != 1
,则会通过案例陈述。
由于某种原因,设置timer(1)
后,即使我更改了间隔,间隔也不会改变...
董事会成员:
public void timer (int val) {
int interval;
if (val == 1) {
interval = 1;
}
else {
switch (level) {
//each level increases drop speed by .10 seconds
case 1: interval = 700;
break;
case 2: interval = 600;
break;
case 3: interval = 500;
break;
case 4: interval = 400;
break;
case 5: interval = 300;
break;
default: interval = 800;
break;
}
}
Timer t = new Timer(interval, new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (pause && gameWon){
message = "You've won!";
}
else if (pause) {
seconds++;
}
else {
seconds = 0;
newPiece.autoMove();
repaint();
}
}
});
t.start();
}
作品类:您看到我将1
作为参数发送给timer()
以获得硬降...
然后使用1
...
//hard drop
if (keycode == KeyEvent.VK_UP) {
board.timer(1);
for (int i = 0; i < tile.length; i++) {
calcNewPosition(tile[i].getRow()+1, tile[i].getCol(), i);
}
clearCurrPosition();
for (int i = 0; i < tile.length; i++) {
board.checkEndGame(tile[i].getRow(), tile[i].getCol());
}
board.timer(0);
board.checkBottomFull();
if (isCollision()) board.createNewPiece();
move();
答案 0 :(得分:5)
俄罗斯方块是一款不需要碰撞管理的游戏,本身,因为一切都被限制在一个网格中,你总能获得填充方块的坐标。一些俄罗斯方块的变体实现了“瞬间掉落”,其中按下“向下”按钮(在您的情况下为“向上”)将立即将当前作品放置在底部的任何位置。就个人而言,我赞成另一种选择,即加速(显着地,达到一定程度)该作品的下降速度。
无论哪种方式,我建议每次移动(侧面或旋转)时调用setFinalPosition()
方法,如果用户不采取任何操作或丢弃该部分,则会存储当前部分的位置。然后,如果你想做一个“瞬间掉落”,你可以打电话给getFinalPosition()
并把它放在那里。每当一个棋子移动而不用用户动作时,您也可以使用getFinalPosition()
方法,并检查当前位置是否等于最终位置。如果确实如此,请停止该作品。
请注意,无论您是否担心碰撞,在没有用户操作的情况下(或者如果用户放下该部件),预测该部件将会在哪里结束都是可行的。