【问题标题】:Java Rectangle Collision Intersection (Not always working)Java Rectangle Collision Intersection(并不总是有效)
【发布时间】:2015-11-16 04:49:22
【问题描述】:

我目前正在为一款 RPG 风格的游戏开发一个瓷砖碰撞系统,除了与矩形交叉点存在一些不一致之外,它大部分时间都在工作。

protected void tileCollision() 
{  
    AnimatedSprite player = findPlayer();
    for(int i = 0; i < _sprites.size(); i++) 
    {
        AnimatedSprite spr = _sprites.get(i);
        for(int j = 0; j < tileWithinRange.length; j++) 
        {
            Tile tile = tileWithinRange[j];
            if(tile != null) 
            {       
                if(tile.getBounds().intersects(player.getBounds())) 
                {
                    player.setCollided(true);
                    tileCollision(player, tile, -1, -1);
                } else 
                {
                    player.setCollided(false);
                }
            }
        }
    }   
}

当我在启动游戏时第一次与瓷砖碰撞时,它总是返回 true,但如果我沿着一列瓷砖移动,我开始得到错误的返回,然后过了一段时间我只得到错误的返回。

Here is an image of the player intersecting with a tile

这里有一个明显的交集,但在这种情况下,变量碰撞返回false。

路口不总是登记的问题是什么?`

【问题讨论】:

    标签: java graphics 2d rectangles collision


    【解决方案1】:

    这里的信息太少,无法真正了解发生了什么,但这里有些可疑:

         if(tile.getBounds().intersects(player.getBounds())) 
         {
            player.setCollided(true);
            tileCollision(player, tile, -1, -1);
         } else 
         {
            player.setCollided(false);
         }
    

    由于您在循环中针对玩家检查多个图块,如果玩家与第一个图块发生碰撞,但没有与第二个图块发生碰撞怎么办?你最终会调用player.setCollided(false);,即使他与以前的瓷砖碰撞,用false 覆盖true 碰撞状态。这可能解释了您在一段时间后仅获得错误返回的行为(可能是因为您检查图块的顺序导致您不断用错误状态覆盖真实状态)。

    我不确定这是否是可取的或不具有这些副作用,但至少有点令人困惑,首先打开这种碰撞状态,然后在同一个内用 off 覆盖环形。如果这是不受欢迎的行为,那么如果发生碰撞,您所追求的可能需要您跳出循环。或者也许你想要的是更像这样的东西:

        player.setCollided(false);
        for(int j = 0; j < tileWithinRange.length; j++) 
        {
            Tile tile = tileWithinRange[j];
            if(tile != null && tile.getBounds().intersects(player.getBounds())) 
            {
                player.setCollided(true);
                tileCollision(player, tile, -1, -1);
            }
        }
    }
    

    或者您的边界/交叉点函数可能真的出现故障 - 用这么少的代码/信息很难判断(我们不知道这些是如何实现的)。

    能够隔离您的代码并学习如何构建测试用例以独立测试小块中的各个功能是很好的。你想通过一个排除过程来排除嫌疑人,这个测试程序可以让你弄清楚,“好的,这部分在任何情况下都能完美运行,让我们继续下一步。”否则,它就会变成一个猜谜游戏,试图找出问题所在。在开发中浪费时间/生产力的最简单方法之一是先编写一堆代码,然后在事后尝试缩小问题的范围,而不是测试每一个小步骤。越晚发现错误,调查的嫌疑人越多,错误的代价就会越大。

    【讨论】:

      【解决方案2】:

      我最终将方法重写为布尔值,使其在碰撞时返回 true,在不碰撞时返回 false。这是新代码。

          public boolean tileCollision() {
          AnimatedSprite player = findPlayer();
          for(int j = 0; j < tileWithinRange.length; j++) {
              Tile tile = tileWithinRange[j];  
              if(tile != null) {
                  if(tile.getTileBounds().intersects(player.getBounds()) ) {
                      return true;
                  }
              }
          }
          return false;
      }
      

      【讨论】:

        猜你喜欢
        • 2013-03-28
        • 2015-07-11
        • 2023-03-09
        • 1970-01-01
        • 1970-01-01
        • 2012-12-26
        • 1970-01-01
        • 1970-01-01
        • 2012-04-23
        相关资源
        最近更新 更多