【问题标题】:java tetris: how to make a tetris piece move as 4 distinct tilesjava俄罗斯方块:如何使俄罗斯方块块移动为4个不同的瓷砖
【发布时间】:2013-03-07 14:16:14
【问题描述】:

我正在尝试用 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() 将在格子结束时结束游戏卡在顶部。


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

  • 要创建一个实际的俄罗斯方块,我想我应该只生成 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 向下移动,所有其他人都可以向下移动,所以他们不会' t重叠)

        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 片段的新实例?我的想法对吗?


可执行文件

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

源代码 zip 链接

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

谢谢!

【问题讨论】:

  • 如需尽快获得更好的帮助,请发帖SSCCE
  • @AndrewThompson 我已经将一个可运行的 jar 以及作为 zip 的源代码上传到了 Dropbox。可以试试吗?
  • @AndrewThompson 我已经通读了它,我认为我的 exe 实现了所有这些事情。不想看也没关系。
  • “我认为我的 exe 实现了所有这些事情” SSCCE 不需要“可执行”,如果代码是 SSCCE,它可以作为编辑发布。跨度>
  • @AndrewThompson 好的,我不知道如何改写这个问题。我相信它很短,我已经清楚地确定了我的问题所在 - 我正在努力解决以下问题:基本上说我不确定如何让几块瓷砖一起移动,因为它们会相互碰撞。它是自包含的,因为我已经发布了问题所在的代码,以及下面的可编译/可运行代码......他们可以运行它并自己查看结果,这就是我包含它的原因。这是正确的,我已经发布了我尝试过的示例。我是不是误会了?

标签: java swing


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2013-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    • 1970-01-01
    相关资源
    最近更新 更多