2012-02-18 3 views
1

Теперь, когда я загружаю свою карту из 2D-массива char, игра действительно медленная, когда я загружаю более 100 блоков (область 10x10). У меня есть это отображение блоков только на некотором расстоянии от символа. Я также считаю, что знаю, почему он работает так медленно, но я не знаю, как это исправить. Heres код:Дальность рендеринга для 2D-массивов - Minecraft 2D

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. Если вам нужен исходный код для игры, чтобы помочь мне исправить эту проблему, прокомментируйте, что вам это нужно, и я опубликую его.

+0

'blocks' является 2d массив типов блоков? –

ответ

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); 
    } 
} 
+0

Я попробую это прямо сейчас. – Ki11akd0g

+0

Спасибо, что работает отлично! – Ki11akd0g

+0

Я рад, что он работает для вас. Вы также можете рассмотреть возможность хранения всех блоков в массиве 2D блоков вместо создания новых экземпляров каждый раз (другой пользователь предложил это, но удалил их ответ, поэтому я подумал, что должен упомянуть об этом). – tom

Смежные вопросы