俄罗斯方块中重叠的 JLabels

问题描述 投票:0回答:1

所以我尝试用 Java 编写俄罗斯方块代码,并且每个部分都使用 JLabels。我使用 Runnable 计时器让碎片向下移动,然后使用带有执行器的 if 语句来控制碎片何时停止移动。 我遇到的问题是我应该如何对这些部分进行编程,以便当它们彼此交互时它们停止向下移动并触发执行器关闭。我知道我想对块进行编程,使其在其前面的块的颜色不是黑色时停止,这表明那里有一个块,但我需要帮助从技术上解决这个问题。

例如:

Runnable timer = new Runnable() {


public void run() {

        if((825 - (piece.getSize().getHeight() + 40 + piece.getY()) < 1)) { 
            executor.shutdown();
            block();
            time();
        }
        else if(piece2 != null && (825 - (piece2.getSize().getHeight() + 40 + piece2.getY()) < 1)) {
            executor.shutdown();
            block();
            time();
        }
    }   
executor.scheduleAtFixedRate(timer, 2, 1, TimeUnit.SECONDS);
}

piece2 指的是另一块,仅用于我以前使用pieces 来配置它的形状。

我尝试制作一个块来测试另一个块前面的颜色,但我无法做到这一点,因为我要么只测试背景颜色,要么测试实际块的颜色。在这种情况下,我需要一种方法来使实际块前面的块适应当前的颜色,无论是背景还是块,但我不知道该怎么做。

java swing jlabel runnable tetris
1个回答
0
投票

一些建议:

  • 避免使用 Swing 组件作为动画精灵,而应使用形状。没有理由使用 JLabel,这只会使您的代码更慢且更困难。
  • 最重要的是,代码的逻辑应该与 GUI 分开。您将需要创建一个代表一个俄罗斯方块的 TetrisBlock 类,然后创建一个保存俄罗斯方块集合的 TetrisShape 类。它们应该具有可变的 x 和 y 位置字段。它还应该通过迭代游戏对象所持有的 TetrisShapes 集合来进行碰撞检测。当检测到碰撞时,动画应该停止。
  • AWT Shapes 界面可以帮助您进行碰撞检测。
  • 您应该使用 Swing Timer 来驱动动画,而不是使用可运行的固定速率执行器服务。这不会解决最初的问题,但有助于防止当前违反 Swing 线程规则的代码出现未来问题。
© www.soinside.com 2019 - 2024. All rights reserved.