簡體   English   中英

渲染圖塊Java Libgdx

[英]Rendering tiles Java Libgdx

我正在嘗試渲染每次運行游戲時都會生成隨機圖塊的圖塊地圖。

我有一個數組,應該保存圖塊的所有值,然后隨機更改它們:

int[][] map = {
                    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
                    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
                    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
                    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
                    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
                    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
                    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
                    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
                    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
            };
         for (int x = 0; x < map.length; x++) {
            for (int y = 0; y < map[x].length; y++) {
                if(map[x][y] == 0){
                    switch(MathUtils.random(2)){                    
                    case 0:
                        map[x][y] = 0;
                        break;
                    case 1:
                        map[x][y] = 1;
                        break;
                    case 2:
                        map[x][y] = 2;
                        break;
                        }
                }
            }
        }

然后根據圖塊是什么渲染它們:

public void render(float delta) {
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        Gdx.gl.glClearColor(0f, 0f, 0f, 1f);
        game.batch.begin();
         for (int x = 0; x < map.length; x++) {
            for (int y = 0; y < map[y].length; y++) {
                if(map[x][y] == 1){
                    game.batch.draw(stone, x*120, y*120);
                }
                if(map[x][y] == 2){
                    game.batch.draw(grass, x*120, y*120);
                }
                if(map[x][y] == 0){
                    game.batch.draw(dirt, x*120, y*120);
                }
            }
        }

問題:

  1. 所有渲染的瓷磚都是污垢。
  2. 確實減慢了一切。

2.確實減慢了一切

這是由於地圖尺寸過大造成的:1920 x 1080塊。 如果您的每個圖塊的尺寸為120 x 120像素,則多達230,400 x 129,600像素。 對於OpenGL來說,渲染所有這些都不是問題,因為它將自動裁剪所有不可見的內容,並且OpenGL在確定可見性方面非常有效。 但是, 將其發送到批處理渲染器之前,您已經在做很多可以避免的工作。

(以下代碼段可能不是正確的Java。)

  1. 不要使用if甚至更好- switch -在內部繪圖循環中。 創建一個索引查找數組:

     Texture textures[] = { dirt, stone, grass }; 

    然后在循環內部使用:

     game.batch.draw(textures[map[x][y]], x*120, y*120); 
  2. 不要繪制整個地圖。 計算當前視口(顯示在屏幕上的地圖部分),然后繪制該視口。
    保持坐標對mapxmapy保存你的地圖上屏幕的左上角的坐標。 移動此坐標對將使地圖在屏幕上四處移動。 如果希望您的“玩家”始終停留在屏幕的確切中心,則可以簡單地使用mapx = (player_x - screen_width/2) 請注意檢查是否超出范圍。

    地圖上可見的部分始於

     int tile_xoffset = floor (mapx/120); int tile_yoffset = floor (mapy/120); 

    四舍五入,因為如果mapx119您仍然會看到map[0][y]的一個像素帶。 (要注意的一點: floor實際上是不必要的。將浮點數轉換為整數時,Java會自動舍入。)

    120x120地圖塊中可見部分的寬度(和類似高度)可以計算為

     screen_width/120 

    但這只是可見的整個地圖塊的數量。 您還需要繪制僅部分可見的塊的“邊界”。

    更准確的計算應該是這樣(警告:未經測試!):

     int vis_width = (screen_width + (mapx % 120) + (120-(screen_width % 120)))/120; 
  3. 一個好的通用原則是在內部循環中進行盡可能少的計算。 每個圖塊乘以120的乘法可以很容易地用加法代替。 也不必對最內層循環中的xy 執行此操作。

  4. 完成上述所有計算后,請檢查tile_xoffset是否不小於0,並且tile_xoffset + visible_width是否小於您的圖塊地圖的寬度; 當然,對於y部分也是如此。


綜合所有這些,您的地圖繪制代碼應如下所示:

xp = (tile_xoffset*120) - mapx;
for (int x = 0; x < visible_width; x++)
{
    yp = (tile_yoffset*120) - mapy;
    for (int y = 0; y < visible_height; y++)
    {
        game.batch.draw(textures[map[x][y]], xp, yp);
        yp += 120;
    }
    xp += 120;
}

要在此地圖上繪制字符,可以通過-mapx,-mapy偏移其坐標。 如果您還有很多其他字符,則可以通過首先測試它們是否在可見邊界內來獲得另一個提速。

“映射”數組實際上不是從中渲染數據的數組,以前的數組已損壞並導致數據重復。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM