Java Render Only相交?

时间:2014-03-24 18:51:36

标签: java render slick2d

所以我想知道如何运行多维数组而不必使用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
      }
   }
}

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

当我前一段时间遇到这个问题时,我使用渲染功能使用相机的x,y,width和height值来确定通过改变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);
                    }
                }
            }
        }
    }
}