Ací es mostren les diferències entre la revisió seleccionada i la versió actual de la pàgina.
| Següent revisió | Revisió prèvia | ||
|
libgdx_viewport [2026/03/05 18:57] enric_mieza_sanchez creat |
libgdx_viewport [2026/03/05 23:04] (actual) enric_mieza_sanchez [Movem l'objecte] |
||
|---|---|---|---|
| Línia 9: | Línia 9: | ||
| Per a aquest propòsit disposem de 2 eines fonamentals: | Per a aquest propòsit disposem de 2 eines fonamentals: | ||
| + | Hi ha diferents [[https:// | ||
| + | \\ | ||
| + | |||
| + | ===== Configuració Viewport bàsica ===== | ||
| + | |||
| + | El codi mínim que ens quedaria per a una aplicació amb '' | ||
| + | |||
| + | Al ser unitats divisibles caldrà emprar //floats//, i no // | ||
| + | |||
| + | <file java Joc.java> | ||
| + | // Exemple amb ApplicationAdapter, | ||
| + | public class Joc extends ApplicationAdapter { | ||
| + | private SpriteBatch batch; | ||
| + | public FitViewport viewport; | ||
| + | |||
| + | @Override | ||
| + | public void create() { | ||
| + | batch = new SpriteBatch(); | ||
| + | viewport = new FitViewport(8, | ||
| + | } | ||
| + | |||
| + | @Override | ||
| + | public void render() { | ||
| + | // pintem background de color | ||
| + | ScreenUtils.clear(0.15f, | ||
| + | // PUNT CLAU: ajustem càmera per traduir resolucions quan pintem | ||
| + | viewport.apply(); | ||
| + | batch.setProjectionMatrix(viewport.getCamera().combined); | ||
| + | // pintem! | ||
| + | batch.begin(); | ||
| + | // ...instruccions de dibuix... | ||
| + | batch.end(); | ||
| + | } | ||
| + | |||
| + | // SUPER IMPORTANT, sense resize no funciona el Viewport | ||
| + | // és un error típic oblidar aquest mètode, esteu avisats | ||
| + | @Override | ||
| + | public void resize(int width, int height) { | ||
| + | viewport.update(width, | ||
| + | } | ||
| + | |||
| + | @Override | ||
| + | public void dispose() { | ||
| + | batch.dispose(); | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ==== Desktop ==== | ||
| + | |||
| + | Si volem que la pantalla de l' | ||
| + | |||
| + | <file java Lwjgl3Launcher.java> | ||
| + | public class Lwjgl3Launcher { | ||
| + | // ... | ||
| + | private static Lwjgl3ApplicationConfiguration getDefaultConfiguration() { | ||
| + | // ... | ||
| + | | ||
| + | // configurem 800x500 px però podria ser altra resolució que compleixi amb la relació d' | ||
| + | configuration.setWindowedMode(800, | ||
| + | // ... | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | \\ | ||
| + | |||
| + | ===== Dibuixem! ===== | ||
| + | |||
| + | Definicions: | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | Dibuixarem un cercle a la posició (2,2) de les nostres " | ||
| + | |||
| + | El '' | ||
| + | |||
| + | <code java> | ||
| + | public class Joc extends ApplicationAdapter { | ||
| + | // ... | ||
| + | | ||
| + | // Texture és l' | ||
| + | // es pot crear a partir d' | ||
| + | Texture pilotaTexture; | ||
| + | |||
| + | @Override | ||
| + | public void create() { | ||
| + | // ... | ||
| + | | ||
| + | // Creem la Texture de la pilota (format en pixels! , de moment) | ||
| + | Pixmap pilotaPixmap = new Pixmap(100, | ||
| + | pilotaPixmap.setColor(Color.RED); | ||
| + | pilotaPixmap.fillCircle(50, | ||
| + | pilotaTexture = new Texture(pilotaPixmap); | ||
| + | } | ||
| + | | ||
| + | public void render() { | ||
| + | // ... background, projection matrix, etc. | ||
| + | | ||
| + | // pintem! | ||
| + | batch.begin(); | ||
| + | // Tant fa l' | ||
| + | // A pintar la redefinim (textura, posx, posy, amplada, alçada) | ||
| + | batch.draw(pilotaTexture, | ||
| + | batch.end(); | ||
| + | } | ||
| + | |||
| + | // ... | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | \\ | ||
| + | |||
| + | ===== Movem l' | ||
| + | |||
| + | Per moure l' | ||
| + | |||
| + | Recordem que el loop típic dels jocs consisteix en: | ||
| + | - Inputs: processar controls de l' | ||
| + | - Calcular objectes | ||
| + | - Pintar objectes | ||
| + | |||
| + | <code java> | ||
| + | public class Joc extends ApplicationAdapter { | ||
| + | // ... | ||
| + | |||
| + | // les dades mínimes son posició i velocitat de la pilota | ||
| + | float posx, posy, velx, vely; | ||
| + | |||
| + | @Override | ||
| + | public void create() { | ||
| + | // ... | ||
| + | |||
| + | posx = posy = 0f; | ||
| + | velx = vely = 1f; // velocitat d'1 m/s | ||
| + | } | ||
| + | |||
| + | @Override | ||
| + | public void render() { | ||
| + | // 1- INPUTS (controls usuari)... | ||
| + | |||
| + | // 2- CALCULEM | ||
| + | // primera prova: increment 0.01mts per iteració | ||
| + | posx = posx + 0.01; | ||
| + | |||
| + | // 3- PINTEM | ||
| + | // projecció viewport, background, etc... | ||
| + | batch.begin(); | ||
| + | batch.draw(pilotaTexture, | ||
| + | batch.end(); | ||
| + | } | ||
| + | |||
| + | } | ||
| + | </ | ||
| + | |||
| + | Si proves el codi veuràs que la pilota avança poc a poc. | ||
| + | |||
| + | Però no hem fet servir la velocitat real '' | ||
| + | <code java> | ||
| + | posx = posx + velx; | ||
| + | </ | ||
| + | |||
| + | Què succeeix? | ||
| + | |||
| + | Si ho feu així veureu que la pilota no avança a 1 m/s, sinó que avança 1 metre per iteració. I els ajustos habituals solen ser de 30 FPS, per tant, la velocitat que ara estem executant és de 30 m/s, segurament ni l'heu vist passar !!! | ||
| + | |||
| + | Perquè la pilota avanci a 1 m/s de veritat (hauria de trigar 8 segons en travessar la pantalla) hauríem de fer el següent: | ||
| + | |||
| + | <code java> | ||
| + | public void render() { | ||
| + | // 1- INPUTS (controls usuari)... | ||
| + | |||
| + | // 2- CALCULEM | ||
| + | float delta = Gdx.graphics.getDeltaTime(); | ||
| + | posx = posx + velx * delta; | ||
| + | | ||
| + | // ... | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | <WRAP info> | ||
| + | **En termes físics** | ||
| + | |||
| + | En termes de física, les sumes han de ser de la mateixa magnitud, és a dir, a la posició x [metres] no podem sumar-li una velocitat [m/s], sinó que cal sumar-li un desplaçament també en [metres]. | ||
| + | |||
| + | posx = posx + velx; | ||
| + | |||
| + | {{mdi> | ||
| + | |||
| + | Quant és el desplaçament que cal aplicar-li a posx? Doncs dependrà del temps que hagi passat. Podriem calcular-ho en base als FPS, però tenim una manera millor encara, demanar-li a libGDX que ens digui el temps que ha passat des del darrer '' | ||
| + | float delta = Gdx.graphics.getDeltaTime(); | ||
| + | </ | ||
| + | |||
| + | Ara podrem calcular el desplaçament: | ||
| + | posx = posx + velx * delta; | ||
| + | |||
| + | Que en magnituds serà: | ||
| + | |||
| + | {{mdi> | ||
| + | |||
| + | Ara sí! | ||
| + | </ | ||