[英]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);
}
}
}
問題:
2.確實減慢了一切
這是由於地圖尺寸過大造成的:1920 x 1080塊。 如果您的每個圖塊的尺寸為120 x 120像素,則多達230,400 x 129,600像素。 對於OpenGL來說,渲染所有這些都不是問題,因為它將自動裁剪所有不可見的內容,並且OpenGL在確定可見性方面非常有效。 但是, 在將其發送到批處理渲染器之前,您已經在做很多可以避免的工作。
(以下代碼段可能不是正確的Java。)
不要使用if
甚至更好- switch
-在內部繪圖循環中。 創建一個索引查找數組:
Texture textures[] = { dirt, stone, grass };
然后在循環內部使用:
game.batch.draw(textures[map[x][y]], x*120, y*120);
不要繪制整個地圖。 計算當前視口(顯示在屏幕上的地圖部分),然后繪制該視口。
保持坐標對mapx
, mapy
保存你的地圖上屏幕的左上角的坐標。 移動此坐標對將使地圖在屏幕上四處移動。 如果希望您的“玩家”始終停留在屏幕的確切中心,則可以簡單地使用mapx = (player_x - screen_width/2)
。 請注意檢查是否超出范圍。
地圖上可見的部分始於
int tile_xoffset = floor (mapx/120); int tile_yoffset = floor (mapy/120);
四舍五入,因為如果mapx
為119
您仍然會看到map[0][y]
的一個像素帶。 (要注意的一點: floor
實際上是不必要的。將浮點數轉換為整數時,Java會自動舍入。)
120x120地圖塊中可見部分的寬度(和類似高度)可以計算為
screen_width/120
但這只是可見的整個地圖塊的數量。 您還需要繪制僅部分可見的塊的“邊界”。
更准確的計算應該是這樣(警告:未經測試!):
int vis_width = (screen_width + (mapx % 120) + (120-(screen_width % 120)))/120;
一個好的通用原則是在內部循環中進行盡可能少的計算。 每個圖塊乘以120
的乘法可以很容易地用加法代替。 也不必對最內層循環中的x
和y
都執行此操作。
完成上述所有計算后,請檢查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.