java俄罗斯方块:如何使俄罗斯方块作为4个不同的瓷砖移动

时间:2013-03-07 05:41:32

标签: java swing

我正在尝试将Java游戏作为一个有趣的副项目。

我的游戏板是一块瓷砖网格:

grid = new Tile[height][width];

在网格中,我创建了一个新的Tile对象:activetile = new Tile(this,0, 0); //add new tile to "this" board

目前:

  • 我可以控制单个磁贴 - 向下,向左和向右移动

     public void keyPressed(KeyEvent e) {
        int keyCode = e.getKeyCode();
        if(keyCode == KeyEvent.VK_DOWN) {
            checkBottomFull(0,4);
            collisionCheck(activetile.getX(),activetile.getY());
            checkEndGame(activetile.getX(), activetile.getY());
    
            activetile.setLocation(activetile.getX(), activetile.getY()+1); 
            System.out.println("coordinates: " + activetile.getX() + ", " + activetile.getY());
    
            repaint();
        } 
            ...right key and left key code omitted 
    
    • 正如您从keyPressed方法中看到的那样,checkBottomFull()将清除底行(如果已满),collisionCheck()将生成一个新作品,如果块击中地板或下面的另一块,checkEndGame()将如果块被卡在顶部,则结束游戏。

enter image description here


我正在努力解决以下问题:

  • 为了创建一个真正的俄罗斯方块,我想我应该只生成3个其他的Tile实例,并根据它是什么部分(L,O,Bar,Z等),设置它们的位置根据activetile(我控制的单个瓷砖)的适当位置,如下:

    if (piece == "Bar") {
        block2 = new Tile(this, activetile.getX(), activetile.getY());
        block3 = new Tile(this, activetile.getX()+2, activetile.getY());
        block4 = new Tile(this, activetile.getX()+3, activetile.getY());
    }
    

问题是,我对activetile的碰撞检测不允许它适当移动,因为它会遇到其他块。我尝试在keyPressed()中通过设置block2, block3, block4的位置来设置活动后的新位置设置,如下所示:(因此,一旦activetile向下移动,所有其他人都被允许向下移动,使它们不重叠)

        activetile.setLocation(activetile.getX(), activetile.getY()+1); 
        block2.setLocation(activetile.getX(), activetile.getY()+1); 
        block3.setLocation(activetile.getX(), activetile.getY()+1); 
        block4.setLocation(activetile.getX(), activetile.getY()+1);

这可能适用于下降,但它不适用于向左或向右移动,因为瓷砖将重叠。


那么,我是否正确地通过生成这样的新块来创建Bar块的新instane?我的想法是否正确?


可执行

https://www.dropbox.com/s/oyh26dfbmsvt5c8/my_tetris_test.jar

链接到源代码zip

https://www.dropbox.com/s/9kt3sl6qqo54amk/Tetris%20Two.rar

谢谢!

1 个答案:

答案 0 :(得分:1)

我会看一下Polygon类:http://docs.oracle.com/javase/6/docs/api/java/awt/Polygon.html
提供的方法可以测试与另一个对象上的点的碰撞(内部)。您还可以使用translate(deltaX, deltaY)大大简化对象的“动作”。