4

我正在制作俄罗斯方块,但我不知道如何才能使一块硬下落。

我尝试向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;
}

件类:

然后在这里,对于每一件我都会将有效添加dropRowgetRow()

        //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,则通过 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();  
}    

Piece 类:您看到我将硬降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();
4

1 回答 1

5

俄罗斯方块是一款本身不需要碰撞管理的游戏,因为一切都被限制在一个网格中,你总是可以得到填充方块的坐标。一些俄罗斯方块变体实现了“即时下降”,其中按下“向下”按钮(在您的情况下为“向上”)将立即将当前块放置在底部的任何位置。就个人而言,我更喜欢另一种选择,即加快(显着地,在一定程度上)作品的下降速度。

无论哪种方式,我都建议在setFinalPosition()每次移动(横向或旋转)棋子时调用一个方法,如果用户不采取任何操作或放下棋子,该方法将存储当前棋子的位置。然后,如果你想做一个“即时下降”,你可以打电话getFinalPosition()并把它放在那里。即使没有用户操作,您也可以在getFinalPosition()棋子移动时使用该方法,并检查当前位置是否等于最终位置。如果是这样,请停止该部分。

请注意,无论您是否为碰撞而烦恼,在没有用户操作的情况下(或者如果用户丢弃该部分),展望该部分最终会出现的位置是要走的路。

于 2013-05-16T16:51:14.807 回答