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