Расстояние рендеринга для 2D Arrays - Minecraft 2D - PullRequest
1 голос
/ 18 февраля 2012

Теперь, когда я загружаю свою карту из 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 равным new Block(blocks[x][y], x, y) для всех элементов blocks[x][y].Проблема в том, что я не могу просто удалить эту строку кода, потому что она решает, как далеко от символа отрисовывать блоки.Мне нужно сделать так, чтобы он устанавливал следующий элемент равным столько элементов блоков [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
}

вокруг него и то же самое для y - playerY, но это не работает, хотя в теории должно быть.

Пожалуйста, ответьте на этот вопрос, если вы знаете способ сделать это и заставить игру работать так же быстро, как когда я загружал блоки из ArrayList, что позволило мне загрузить более 5000 блоков и запуститьхорошая скорость FPS.Если вам нужен исходный код игры, чтобы помочь мне решить эту проблему, прокомментируйте, что он вам нужен, и я опубликую его.

1 Ответ

1 голос
/ 18 февраля 2012

Вы можете сделать петлю только над плитками вокруг игрока:

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);
    }
}
...