【问题标题】:collision with rectangle.intersects [Java]与 rectangle.intersects [Java] 的碰撞
【发布时间】:2015-04-16 00:52:45
【问题描述】:

所以,我正在尝试使用 Rectangles 对游戏中的墙壁进行碰撞,我决定尝试使用 ArrayList 来存储每面墙壁的矩形,并将整个字段设置为墙壁,以及所有我想做的是移除三堵墙,所以我正在做 shapeList.remove(0) 以尝试移除 0,0 处的第一堵墙,但它不起作用,我不知道我是否做错了,或者如果有更好的方法,但我可以使用一些帮助来解决这个问题,这里是代码。

    public void walls(Graphics g) {
    for (int i = 0; i < 63; i++) {
        for (int wallsX = 0; wallsX < 750; wallsX += 95) {
            for (int wallsY = 0; wallsY < 750; wallsY += 95) {
                shapeList.add(new Rectangle(wallsX, wallsY, 95, 95));
                g.setColor(Color.blue);
                g.drawRect(wallsX, wallsY, 95, 95);
            }
        }
    }
    shapeList.remove(0); //I want to remove wall at 0,0... but not working
    g.setColor(Color.black);
    g.fillRect(0, 0, 95, 95);
    g.fillRect(95, 0, 95, 95);
    g.fillRect(0, 95, 95, 95);

    for (int i = 0; i < shapeList.size(); i++) {
        if (intersectsBox(getRectangle(), shapeList.get(i))) {
            isInsideWalls = true;

        }else{
            isInsideWalls = false;
        }
    }
}

编辑:当我运行此代码时,出现此错误:

`Exception in thread "AWT-EventQueue-0" Exception in thread "Timer-0" java.lang.NullPointerException
    at java.awt.Rectangle.intersects(Unknown Source)
    at bombermangame.Game.intersectsBox(Game.java:122)
    at bombermangame.Game.walls(Game.java:147)
    at bombermangame.Game.paintComponent(Game.java:161)
    at javax.swing.JComponent.paint(Unknown Source)
    at javax.swing.JComponent.paintChildren(Unknown Source)
    at javax.swing.JComponent.paint(Unknown Source)

【问题讨论】:

  • 当你说它不起作用时,你能提供更多信息吗?是有错误还是删除了错误的墙?
  • 我感觉有 63 面坐标为 (0,0) 的墙,因为这 (int i = 0; i &lt; 63; i++) 在进入内部 2 个 for 循环之前强制执行 63 个循环。我相信在 63 次循环结束时,您所做的只是删除坐标为 (0,0) 的矩形之一。
  • 问题是,我有它,如果玩家 Rect 与 Walls Rect 相交,那么它是 + 或 - 玩家 x 或 y 值,这取决于玩家如何相交它。并且由于某种原因,它一直说玩家总是在墙上,即使玩家在 0,0 时生成。即使我更改了'if (intersectsBox(getRectangle(), shapeList.get(i))) {',并将 i 设置为让我们说 4,无论玩家在哪里,它都说他在墙上。如果您需要查看完整代码,请点击此处:CODE
  • 您没有覆盖整个 750 x 750 屏幕的墙壁吗?其次,我得到的印象是有 63 面墙相互堆叠。所以是的,玩家总是在墙上是有道理的,因为即使你在 (0,0) 处移除第一面墙,你仍然在坐标 (0,0) 处还有另外 62 个矩形。
  • 我将如何做到这一点,它只制作 1 面墙,在 0,0 上不堆叠?将 63 更改为 1?

标签: java collision-detection rectangles


【解决方案1】:

下面的循环需要删除,因为它会创建 63 个墙网格副本。这意味着您指定的每个坐标都将包含 63 个矩形。

 for (int i = 0; i < 63; i++) {

删除 for 循环将解决至少一个问题的原因是,当您删除第一个矩形时,在同一坐标处剩下 62 个矩形。

创建墙列表所需的内容如下:

for (int wallsX = 0; wallsX < 750; wallsX += 95) {
      for (int wallsY = 0; wallsY < 750; wallsY += 95) {
           shapeList.add(new Rectangle(wallsX, wallsY, 95, 95));
           g.setColor(Color.blue);
           g.drawRect(wallsX, wallsY, 95, 95);
      }
}

现在申请shapeList.remove(0);

坐标 (0,0) 处不应再有墙了。

您的代码中可能还有其他我不知道的错误。我只查看了您在问题中提供的代码。

【讨论】:

  • 谢谢,这是问题所在,但我遇到了第二个问题,我不小心把这些都放在了 Update() 方法中,所以它不停地跑来跑去,创造了成千上万的墙...... . 那不是那么好。但这也帮助了我,所以谢谢!
  • 没问题,很高兴我能帮上忙 :),我也通过帮助别人来提升自己。
  • 我还有 1 个问题,Pic 我正在为我的编码课重新制作炸弹人,(我之前发送的相同代码)我不知道哪个盒子是哪个,除了我知道这 3 个通过测试,我如何找出其余的?
  • Pic 中标记的 3 个,是我在游戏中拍摄的,这些是我知道的 ArrayList 中的 3 个墙位置。我不知道如何弄清楚其余的。
  • 一个例子不是让我们说一个 64 面墙的列表,你可能有一个 8 x 8 面墙的列表。像这样:Shape [][] shape = new Shape[8][8]; 代表你的二维网格。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多