Ukuran layar untuk render Box2d di libGDX

 Ketika ingin menggunakan box2d pada libgdx kita akan menggunakan api yang telah disediakan oleh libgdx, karena box2d itu menggunakan c++ sehingga perlu binding API kemungkinan menggunakan JNI. Selain box2d sebetulnya ada AABB collision dengan jbump, tetapi itu jarang digunakan dan informasinya sedikit. Jadi saya lebih dominan menggunakan box2d walau terasa verbost sekali.

Untuk merender map kita perlu menggunakan

// NOTE map render using our batch doesnt dispose him
mapRenderer = new OrthogonalTiledMapRenderer(map,1/UNIT_SCALE,main.getSpriteBatch());

camera = new OrthographicCamera();
mapRenderer.setView(camera);
mapRenderer.render();

Nah disini terkadang kita akan kebingungan karena box2d menggunakan skala meter dan kilograms, yang tak mungkin 1 pixel screen sama dengan 1 meter. Dengan itu kalkulasi box2d akan sangat berat, makanya kita perlu menggunakan pixel per meter sebagai satuannya. Ini juga digunakan pada banyak game engine (PPM), nah si pixel per meter ini juga mengganggu proses rendering, karena kita perlu menyesuaikan ukuran antara box2d dan render texture map.

Maka dari itu banyak tutorial akan menggunakan satuan yang mungkin kita anggap tidak masuk akal seperti viewport(10,20) apa maksudnya kenapa 10 dan 20 bukankah terlalu kecil atau new OrthographicCamera(10,20). 

Sebetulnya jika kalian menggunakan viewport itu sudah dikalkulasikan secara baik oleh libgdx, jadi nilai 10 dan 20 pada viewport adalah ruang pixel yang ada paa dunia game kalian. Viewport tidak bekerja dengan 1 pixel di layar kalian,  tetapi memetakannya. Jika kalian ada 1000 pixel width dan meminta 10 width di viewport artinya 1000 akan dikalkulasi dengan 10 sehingga dapat 100. Artinya ketika kalian menggambar object di posisi 1,1 lalu dipindah ke 10,1 maka itu langsung di ujung karena layar kalian sekarang sudah dibagi menjadi 10 per 1 bagian ada 100 pixel. 

Nah lalu untuk mapRenderer yang memerlukan scale unit ini konsepnya sama namun berbeda. Jadi ketika kalian memberikan nilai unit scale pada map render, ia akan mengolah data pixel texture pada map kalian mengkalkulasikannya dengan unit scale. Jika kalian memiliki tileset ground 8px dan memberikan unit scale 2f maka ground kalian akan diperbesar menjadi 16px. Kemudian jika gambar kalian diperbesar 2f maka pembuatan body pada box2d juga perlu dikali 2f jika tidak nanti body box2d kalian hanya menempati setengah dari 16px tileset kalian di maprenderer. Maka dari itu kita perlu seragamkan unit scale di box2d maupun map render, jika map render unit scale 2f maka box2d body shape juga dikali 2f.

camera.setToOrtho(false,10,5.5f);

Lalu bagaimana menentukan nilai itu?. Jadi pertama kalian harus tau ukuran tile terkecil milik kalian berapa, pada kasus saya adalah 8px untuk tileset dan 16px untuk karakter. Nah PPM yang saya gunakan adalah 16f, artinya nanti di box2d 8px dan 16px akan dibagi 16f agar box2d tidak mengganggap 8px adalah 8meter. Kenapa saya gunakan 16f sebagai unitscale?, agar mudah saja jika terbesar 16px maka saya gunakan 16f, bisa saja 8f atau 100f tapi jadi sulit menentukan ukuran setToOrthonya.

Jadi ketika saya menggunakan 16f sebagai unit scale artinya ukuran 16px itu akan menjadi 1 meter di box2d dan 0.5f untuk 8px. Nah begitupun di mapRender saya akan bagi dengan 16 jadi map ukuran 8px dan 16px akan dibagi dengan 16f, nah ini kan kecil sekali maka dari itu penggunaan setToOrtho(10,5,5) sanagat tepat untuk merender tile kecil. Namun darimana saya mendapat nilai itu?.

Caranya saya tentukan berapa tile yang ingin tampil di layar, semisal saya ingin tile 8px tadi tampil sebanyak 20 unit width maka passing saja width di setToOrtho 20. Tapi saya otak atik sendiri dengan rumus saya yakni, min width dan height dibagi ukuran ppm. Ukuran min saya sesuai aspek rasio 16:9 yakni 320x180 agar scale evenly ke ukuran besar, nilai tersebut saya bagi dengan PPM = 16, yang nanti didapat 20 width dan 11.25 height lalu karena ukuran pixel terkecil saya adalah 8px atau setengah dari 16px maka ukuran 20 dan 11.25 itu artinya 1 width sudah bisa diisi 2 tile ukuran 8px. Maka dari itu 20 dan 11.25 saya bagi 2 lagi didapatlah 10,5.5 yang cocok untuk tile ukuran 8px.




Tags:
Link copied to clipboard.