在我的俄罗斯方块游戏(Java swing)中无法停止碎片

在我的俄罗斯方块游戏(Java swing)中无法停止碎片,java,swing,awt,tetris,Java,Swing,Awt,Tetris,我正在用Java制作一个俄罗斯方块游戏,当他们击中另一个已经落地的棋子时,我在让当前棋子停止时遇到了一点麻烦。我对每一个特特罗米诺形状都有单独的分类。当电流片下落时,Y坐标最低且X值与电流相同的形状被设置为电流片的停止点。问题是,工件通过与当前工件中心相邻的块,对所有可能的形状和旋转进行编码是很繁琐的 有更好的方法吗? 基本上,我的问题是,如何处理俄罗斯方块的边界 链接到我的java文件: (请原谅混乱) 每个块由一个值表表示,对于L形,它是: {0,0},{1,0},{0,1},{0,2}

我正在用Java制作一个俄罗斯方块游戏,当他们击中另一个已经落地的棋子时,我在让当前棋子停止时遇到了一点麻烦。我对每一个特特罗米诺形状都有单独的分类。当电流片下落时,Y坐标最低且X值与电流相同的形状被设置为电流片的停止点。问题是,工件通过与当前工件中心相邻的块,对所有可能的形状和旋转进行编码是很繁琐的

有更好的方法吗? 基本上,我的问题是,如何处理俄罗斯方块的边界

链接到我的java文件: (请原谅混乱)

每个块由一个值表表示,对于L形,它是:

{0,0},{1,0},{0,1},{0,2}

“中间”块被视为原点。我正在考虑制作一个二维布尔数组来判断某个位置是否被占用。

将行为逻辑与视图逻辑分开


如果在行为逻辑中将每个俄罗斯方块视为四个块,那么进行碰撞检测就变得相当简单了。没有要检测的部分,因为块永远不会占用X和X+1之间的空间。它总是一个或另一个。但是,一旦您检测到X+1没有被占用,并且工件将继续下落,只需添加一个动画,使工件看起来从一个空间移动到下一个空间,动画完成的同时,逻辑指示工件已下落1。

将您的行为逻辑与视图逻辑分离


如果在行为逻辑中将每个俄罗斯方块视为四个块,那么进行碰撞检测就变得相当简单了。没有要检测的部分,因为块永远不会占用X和X+1之间的空间。它总是一个或另一个。但是,一旦检测到X+1没有被占用,并且工件将继续下落,只需添加一个动画,使工件看起来从一个空间移动到下一个空间,动画完成的同时,逻辑指示工件已下落1。

也许可以构建一个表示已下落工件的二维视图地方。 例如(o代表空点,x代表放置的碎片)

看看你的作品和它的当前位置。模拟将其移动到需要移动的位置,然后检查是否有任何x/y坐标重叠。如果是这样,那么它就不能移动到那里

如果你有一个片段(用y表示)在下面的步骤中向下移动

4|ooooo|
3|yyyox|
2|ooxxx|
1|xxxxx|
  12345

模拟yyy向下移动一个点。然后它占据(1,2)、(2,2)和(3,2)。检查您的表示-3,2已被占用,因此块无法移动到那里。这个逻辑应该(我认为)适用于任何放置板上的任何形状块。

也许可以构建一个表示已放置块的二维视图。 例如(o代表空点,x代表放置的碎片)

看看你的作品和它的当前位置。模拟将其移动到需要移动的位置,然后检查是否有任何x/y坐标重叠。如果是这样,那么它就不能移动到那里

如果你有一个片段(用y表示)在下面的步骤中向下移动

4|ooooo|
3|yyyox|
2|ooxxx|
1|xxxxx|
  12345

模拟yyy向下移动一个点。然后它占据(1,2)、(2,2)和(3,2)。检查您的表示-3,2已被占用,因此块无法移动到那里。这个逻辑应该(我认为)适用于任何放置板上的任何形状块。

是的,知道一个图形应该停在哪里的最好方法是制作一个空框和满框的x射线(二维布尔数组)。
但与此同时,你必须知道要检查你身体的哪个部位。如果要向下移动图形,则必须只检查图形的下部块。通过将具有唯一水平值的块放入单独的类别中,然后从中确定哪些块具有最低的垂直值。
对于视觉表示检查。

是的,知道图形应该停在哪里的最好方法是制作一个由空框和满框组成的x射线(二维布尔数组)。
但与此同时,你必须知道要检查你身体的哪个部位。如果要向下移动图形,则必须只检查图形的下部块。通过将具有唯一水平值的块放入单独的类别中,然后从中确定哪些块具有最低的垂直值。
用于视觉表示检查。

取决于您是如何实现的…
Shape
提供了一个
getBounds
方法,该方法提供了一个
相交
方法,该方法可用于确定两个形状是否感兴趣…假设您使用的是
java.awt.Shape
@mad程序员,我没有使用Shape接口这就是对您的代码有一些了解会很有帮助;)@MadProgrammer取决于您是如何实现的…
Shape
提供了一个
getBounds
方法,该方法提供了一个
相交
方法,该方法可用于确定两个形状是否感兴趣…假设您使用的是
java.awt.Shape
@MadProgrammer我没有使用Shape接口这是您编写代码的地方会有帮助的;)@如果我玩弄了这个想法,我想我可能不得不重新审视它,我已经制作了一个与我的GUI相对应的布尔网格。这解决了我面临的许多问题。谢谢你的回答!我玩弄了这个想法,我想我可能不得不重新审视它,我已经制作了一个与我的GUI相对应的布尔网格。这解决了我面临的许多问题。谢谢你的回答!我该如何准确地将一块视为4块呢?俄罗斯方块的形状都是由四个大小相同的块以不同的方式排列而成的。线条是一行四个区块,Ls是三个区块,其中一个在左边或右边,正方形是两个区块在两个区块上,曲线从左边或右边偏移。我如何准确地将一个区块视为四个区块?俄罗斯方块形状都由四个大小相同的区块组成,以不同的方式排列。直线是一行四个区块,Ls是三个区块,其中一个在左侧或右侧,sq