2012-02-18 50 views
1

現在,我從一個二維陣列char加載我的地​​圖,當我加載超過100個塊(10x10區域)時,遊戲真的很慢。我只是在角色的一定距離內渲染塊。我也相信我知道爲什麼它運行得如此緩慢,但我不知道如何解決它。繼承人的代碼:二維陣列渲染距離 - 我的世界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); 

是什麼使得它運行很慢。儘管它沒有將它們繪製到屏幕上,但它仍然對blocks[x][y]的所有元素設置Block next等於new Block(blocks[x][y], 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'是塊類型的二維數組? – 2012-02-18 02:08:54

回答

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 2012-02-18 02:23:00

+0

Thanks Works太棒了! – Ki11akd0g 2012-02-18 02:41:13

+0

我很高興它適合你。您可能還想考慮將所有塊存儲在2D塊數組中,而不是每次都創建新實例(另一位用戶提出這個問題但刪除了他們的答案,所以我想我應該提及它)。 – tom 2012-02-18 03:44:29