【问题标题】:Having trouble stopping the pieces in my Tetris game(Java swing)在我的俄罗斯方块游戏(Java swing)中无法停止棋子
【发布时间】:2013-05-23 01:19:08
【问题描述】:

我正在用 Java 制作俄罗斯方块游戏,当他们击中另一个已经着陆的棋子时,我无法让当前棋子停止。我为每个 tetromino 形状都有单独的类。当 currentPiece 下降时,将 Y 坐标最低且 X 值与 currentPiece 相同的形状设置为 currentPiece 的停止点。问题是这块通过与 currentPiece 中心相邻的块,并且为所有可能的形状和旋转编码是很乏味的

有没有更好的方法来做到这一点? 基本上,我的问题是,如何处理俄罗斯方块的边界?

链接到我的 java 文件:http://goo.gl/Ms8Mj (见谅)

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

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

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

【问题讨论】:

  • 取决于您的实现方式...Shape 提供了一个getBounds 方法,该方法提供了一个intersects 方法,可用于确定两个形状是否感兴趣...假设您正在使用java.awt.Shape
  • @MadProgrammer 我没有使用 Shape 界面
  • 这是对您的代码有所帮助的地方 ;)
  • @MadProgrammer goo.gl/Ms8Mj

标签: java swing awt tetris


【解决方案1】:

也许构建一个 2d 视图来表示已经放置的部分。 例如。 (o代表空位,x代表放置的棋子)

|ooooo|
|oooox|
|ooxxx|
|xxxxx|

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

例如。如果你有一块(用y表示)在下面向下移动

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

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

【讨论】:

  • 我玩弄了这个想法,我想我可能不得不重新审视它,
  • 我制作了一个与我的 GUI 对应的布尔网格。这解决了我遇到的很多问题。感谢您的回答!
【解决方案2】:

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

如果您在行为逻辑中将每个俄罗斯方块块视为四个块,则进行碰撞检测变得相当简单。没有要检测的部分,因为一个块永远不能占用 X 和 X+1 之间的一些空间。它总是一个或另一个。但是,一旦您检测到 X+1 未被占用并且该棋子将继续下落,只需添加一个动画,使该棋子 出现 从一个空间移动到另一个空间,并使用动画在逻辑指示棋子下降 1 的同时完成。

【讨论】:

  • 我将如何将一块块视为 ​​4 个块?
  • 俄罗斯方块的形状都由四个大小相同的块以不同的方式排列组成。线条是连续四个块,Ls 是 3 个块,一个在左侧或右侧,正方形是两个块在两个块上,波浪线从左侧或右侧偏移。
【解决方案3】:

是的,知道人物应该停在哪里的最好方法是制作一个由空盒子和满盒子组成的 X 射线(二维布尔数组)。
但同时 - 你必须知道要检查你的身材的哪些块。如果您要向下移动图形 - 您必须只检查图形的 LOWER 块。通过放入单独的类别来做到这一点 - 具有唯一水平值的块,并从那里 - 确定哪些具有最低的垂直值。 对于视觉表示检查this

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-29
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    • 2014-03-14
    相关资源
    最近更新 更多