0

现在我正在从 2D 数组加载我的地​​图,char当我加载超过 100 个块(10x10 区域)时,游戏真的很慢。我已经让它只在角色的一定距离内渲染块。我也相信我知道它为什么运行这么慢,但我不知道如何解决它。继承人的代码:

public void renderBlocks(Graphics g) {
    super.paint(g);
    Graphics2D g2d = (Graphics 2D)g;
    for(int x = 0; x < 50; x++) {
        for(int y = 0; y < 50; y++) {
            //blocks[x][y] tells it which type of block to load
            Block next = new Block(blocks[x][y], x, y); 

            if((next.getX() - player.getX()) >= (-13*32) && 
            (next.getX() - player.getX()) <= (13*32)) {

                if((next.getY() - player.getY()) >= (-6*32) && 
                (next.getY() - player.getY()) <= (6*32)) {

                     g2d.drawImage(next.getImage(), (next.getX() - player.getX()),    
                      (next.getY() - player.getY()), this);
                }
            }
         }
     }
 }

该行:

Block next = new Block(blocks[x][y], x, y);

是什么让它运行得非常慢。即使它没有将它们绘制到屏幕上,它仍然设置为Block next等于. 问题是我不能只删除这行代码,因为它决定了离角色多远来绘制块。我需要让它只设置 next 等于被绘制到屏幕上的 blocks[x][y] 的尽可能多的元素。new Block(blocks[x][y], x, y)blocks[x][y]

我试过把:

if((x - player.getX()) >= (-13*32) && (x - player.getX()) <= (13*32)){
    Block next = new Block(blocks[x][y], x, y);
    ...Rest of Code here
}

围绕它和相同的 for y - playerY,但它不起作用,尽管理论上它应该。

如果您知道如何做到这一点并让游戏像我从 ArrayList 加载块时一样快,请回答这个问题,这使我能够加载超过 5000 个块并以良好的 FPS 速率运行。如果您需要游戏的源代码来帮助我解决此问题,请评论您需要它,我会发布它。

4

1 回答 1

1

您可以仅在播放器周围的瓷砖上进行循环:

super.paint(g);
Graphics2D g2d = (Graphics 2D)g;

// find the block with the player (might need correction)
int playerX = (int) (player.getX() / 32);
int playerY = (int) (player.getY() / 32);

int viewDist = 6;

int lowerX = Math.max(playerX - viewDist, 0);
int upperX = Math.min(playerX + viewDist + 1, 50);
int lowerY = Math.max(playerY - viewDist, 0);
int upperY = Math.min(playerY + viewDist +  1, 50);

for (int x = lowerX; x < upperX; x++)
{
    for (int y = lowerY; y < upperY; y++)
    {
        Block next = new Block(blocks[x][y], x, y);
        g2d.drawImage(next.getImage(), (next.getX() - player.getX()),    
                      (next.getY() - player.getY()), this);
    }
}
于 2012-02-18T02:04:25.093 回答