私はテトリスを構築していますが、ピースをハードドロップする方法について混乱しています。
hardDrop()
一番下の行から反復して空きスペースをチェックするメソッドを Board クラスに追加しようとしました...
ボードクラス:
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);
}
上に押すと、下全体がヌルであっても、ピースは数行スキップしているように見えるので、その場所に移動する必要があります。
助言がありますか?
ありがとう!
編集 -
値を受け入れるようにタイマーを更新しました... if val == 1
、それはインスタントドロップがヒットしたことを意味します...したがって、間隔= 10ミリ秒に設定されます...
の場合val != 1
は、case ステートメントを通過します。
何故か一度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();