【问题标题】:Java Render Only Intersecting?Java 仅渲染相交?
【发布时间】:2014-05-02 07:47:00
【问题描述】:

所以我想知道如何运行一个多维数组,而不必使用 for 循环来测试对象是否在矩形中相交然后渲染有趣?

目前我正在使用两个 for 循环来遍历它,并且在嵌套循环中我必须使用 intersecting() 方法,因为这需要在每一帧都发生,所以我的游戏的 FPS 越来越低。我认为这是因为我的数组中有 650x350 个实体。我将在下面显示代码并重申问题。所以我的官方问题是如何测试一个实体是否与我的矩形相机相交,这样它就不会落后于游戏?

for (int x = 0; x < entities.length; x++) // entities.length is 650
{
   for (int y = 0; y < entities[0].length; y++) // entities[0].length is 350
   {
      if (camera.intersecting(entities[x][y]))
      {
         entities[x][y].render(g); // X and Y indices are multiplied by 32 to get the position
      }
   }
}

【问题讨论】:

  • 实体的位置和大小是否与其在数组中的位置相关?
  • 是的,每个索引乘以宽/高得到位置。
  • 另外,世界被放大到 0.8f

标签: java render slick2d


【解决方案1】:

这在很大程度上取决于您的游戏机制。但在一般意义上,我会建议研究四叉树(http://en.m.wikipedia.org/wiki/Quadtree)。然后检查您的相机重叠的节点并绘制它们的内容。

【讨论】:

    【解决方案2】:

    当我前段时间遇到这个问题时,我让我的渲染函数使用相机的 x、y、宽度和高度值,通过更改 for 循环的起始位置来确定渲染的位置。

    public void render(Camera camera, Graphics g) {
        // --------------------------------------------------------- //
        // Optimized rendering function to only draw what the camera //
        // can see                                                   //
        // --------------------------------------------------------- //
        int minX = toTileX(camera.getX());
        int minY = toTileY(camera.getY());
        int maxX = toTileX(camera.getX()) + toTileX(camera.getViewWidth());
        int maxY = toTileY(camera.getY()) + toTileY(camera.getViewHeight());
    
        for (TiledLayer l : layers) {
            for (int y = minY; y < maxY + 1; y++) {
                if (y < height && y >= 0) {
                    for (int x = minX; x < maxX + 1; x++) {
                        if (x < width && x >= 0) {
                            Tile tile       = l.getTile(x, y);
                            TileSheet sheet = null;
    
                            try {
                                sheet = tileSheets.get(tile.getTileSetId());
                            } catch (InvalidKeyException e) {
                                e.printStackTrace();
                            }
    
                            Image image = sheet.getImage(tile.getTileId());
    
                            g.drawImage(image,
                                        x * tileWidth,
                                        y * tileHeight,
                                        (x * tileWidth) + tileWidth,
                                        (y * tileHeight) + tileHeight,
                                        0,
                                        0,
                                        tileWidth,
                                        tileHeight);
                        }
                    }
                }
            }
        }
    }
    

    【讨论】:

    • 这很好用,但我在我的游戏中进行了扩展,我使用的是 Slick2D 库,如果我尝试进行缩放,则不会渲染任何内容。我不知道 Slick2D 如何根据比例转换位置,所以有人可以帮忙吗?我的比例是 0.8
    猜你喜欢
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    • 2012-06-20
    相关资源
    最近更新 更多