bytes.cat

La wiki d'FP d'informàtica

Eines de l'usuari

Eines del lloc


jocs_libgdx

Diferències

Ací es mostren les diferències entre la revisió seleccionada i la versió actual de la pàgina.

Enllaç a la visualització de la comparació

Ambdós costats versió prèvia Revisió prèvia
Següent revisió
Revisió prèvia
jocs_libgdx [2023/04/18 00:45]
enric_mieza_sanchez moure secció comunicacions
jocs_libgdx [2024/04/12 11:52] (actual)
enric_mieza_sanchez [Desenvolupament de jocs amb libGDX]
Línia 3: Línia 3:
  
 En aquest article utilitzarem una llibreria específica, libGDX per realitzar el joc. Aquesta té molts avantatges, sobretot que permet compilar en diverses plataformes (Android, Desktop, iOS, HTML). A més, ens permetrà utilitzar recursos gràfics específics que ens facilitaran operacions complexes en 2D i 3D amb acceleració OpenGL. En aquest article utilitzarem una llibreria específica, libGDX per realitzar el joc. Aquesta té molts avantatges, sobretot que permet compilar en diverses plataformes (Android, Desktop, iOS, HTML). A més, ens permetrà utilitzar recursos gràfics específics que ens facilitaran operacions complexes en 2D i 3D amb acceleració OpenGL.
- +{{ libgdx.png?250 }}
 {{tag> #FpInfor #Dam #DamMp08 #DamMp08Uf3 #DamMp08Uf03 jocs games}} {{tag> #FpInfor #Dam #DamMp08 #DamMp08Uf3 #DamMp08Uf03 jocs games}}
  
Línia 14: Línia 13:
   - [[https://libgdx.com/dev/simple_game/#the-game|Tutorial joc Drop]].   - [[https://libgdx.com/dev/simple_game/#the-game|Tutorial joc Drop]].
  
-{{ drop-game.jpeg |Joc Drop del tutorial libGDX}}+\\ 
 + 
 +===== Instal·lació ===== 
 +Necessites tenir instal·lat Android Studio. 
 + 
 +Crea el projecte amb l'[[https://libgdx.com/dev/project_generation/|eina per iniciar projectes libGDX]]. 
 + 
 +==== Troubleshooting ==== 
 +Si t'apareix l'[[https://stackoverflow.com/questions/70340427/unable-to-find-method-void-org-apache-commons-compress-archivers-zip-zipfile|error relacionat amb la llibreria ZIP]] tens 2 opcions: 
 +  - Eliminar la compilació de la plataforma iOS. 
 +  - Editar ''android/build.gradle'' i ajustar les llibreries:<file text android/build.gradle> 
 +buildToolsVersion "33.0.0" 
 +</file> 
 + 
 +\\ 
 + 
 +===== Definicions ===== 
 +Objectes principals del //framework//: 
 +  * ''Game'': classe principal del joc, contenidor de pantalles. 
 +  * ''Screen'': hi encapsulem una pantalla (game over, presentació, etc.), nivell, minijoc. Cadascuna és independent de l'altra. 
 +  * ''OrtographicCamera'': objecte per traduir coordenades. Pot servir per adaptar tamanys de pantalla o per projectar en 2D una imatge 3D. 
 +  * ''SpriteBatch'': objecte per pintar //sprites// (imatges, animacions). 
 +  * ''ShapeRenderer'': objecte per pintar formes geomètriques (cercles, el·lipses, rectangles, triangles, etc. 
 +  * ''BitmapFont'': objecte per pintar lletres. 
 +  * ''Texture'': imatge. 
 +  * ''TextureRegion'': fragment d'una imatge. 
 +  * ''Animation'': objecte per gestionar les animacions i //spritesheets//
 +  * ''Actor'': objecte tipus //widget//, que pot ser alhora un element gràfic i una entrada de dades. Exemples: Button, Dialog, TextInputListener, etc. 
 +  * ''Stage'': objecte per renderitzar ''Actors''
 +  * ''Skin'': conjunt de imatges i fonts per renderitzar ''Actors''. Imprescindible si es vol emprar ''Actor'' i ''Stage''
 + 
 +\\
  
 ===== Primer joc: Drops ===== ===== Primer joc: Drops =====
 +
 +{{ drop-game.jpeg }}
 +
 <WRAP todo> <WRAP todo>
   - Crea un [[https://libgdx.com/dev/project_generation/|nou projecte amb aquesta eina]]. Puja'l a Github (i al Moodle).   - Crea un [[https://libgdx.com/dev/project_generation/|nou projecte amb aquesta eina]]. Puja'l a Github (i al Moodle).
Línia 296: Línia 329:
 <code java> <code java>
 Rectangle up, down, left, right, fire; Rectangle up, down, left, right, fire;
 +final int IDLE=0, UP=1, DOWN=2, LEFT=3, RIGHT=4;
 </code> </code>
  
Línia 346: Línia 380:
   * Ús WebSockets per comunicacions a temps real.   * Ús WebSockets per comunicacions a temps real.
 </WRAP> </WRAP>
 +
 +\\
 +
 +===== Ortographic Camera =====
 +Tal i com explica el tutorial del Drop Game, la ''OrtographicCamera'' ens facilitarà la traducció entre les coordenades que hem definit pel joc (o "coordenades virtuals") i les coordenades reals del dispositiu (//device//), que poden tenir dimensions diferents. A més, al treballar amb una llibreria multiplataforma, voldrem fer un sol joc a la carpeta ''core/'', i el codi de les carpetes de les plataformes (''android/'', ''ios/'', ''html/'') haurà de ser fix (no hem de repetir el joc a cada plataforma).
 +
 +Les operacions que realitzarà la càmera seran:
 +  Coordenades virtuals -> project -> Coordenades reals (//device//)
 +  Coordenades virtuals <- unproject <- Coordenades reals (//device//)
 +
 +Posant que volem una pantalla de 800x480
 +
 +<file java DesktopLauncher.java>
 +public class DesktopLauncher {
 +    public static void main (String[] arg) {
 +        Lwjgl3ApplicationConfiguration config = new Lwjgl3ApplicationConfiguration();
 +        config.setWindowedMode(480, 800);
 +</file>
 +
 +A l'arxiu de ''Game'' o ''Screen'':
 +
 +<code java>
 +public final int GAME_WIDTH = 800;
 +public final int GAME_HEIGHT = 480;
 +
 +public void create() {
 +        camera = new OrthographicCamera();
 +        camera.setToOrtho(false, GAME_WIDTH, GAME_HEIGHT);
 +        
 +        //...
 +}
 +</code>
 +
 +Per fer que el ''SpritBatch'' tradueixi automàticament en totes les accions de dibuix, el configurarem a l'inici del ''render()'': 
 +
 +<code java>
 +public void render() {
 +        camera.update();
 +        spriteBatch.setProjectionMatrix(camera.combined);
 +        
 +        //...
 +}
 +</code>
 +
 +Si estem capturant entrades de la pantalla, caldrà la operació contrària: ''unproject()''
 +
 +<code java>
 +protected int virtual_joystick_control() {
 +    // iterar per multitouch
 +    // cada "i" és un possible "touch" d'un dit a la pantalla
 +    for(int i=0;i<10;i++)
 +    if (Gdx.input.isTouched(i)) {
 +        Vector3 touchPos = new Vector3();
 +        touchPos.set(Gdx.input.getX(i), Gdx.input.getY(i), 0);
 +        // traducció de coordenades reals (depen del dispositiu) a 800x480
 +        game.camera.unproject(touchPos);
 +        // les dades convertides s'enregistren a la mateixa variable touchPos
 +        //...
 +</code>
 +
 +\\
 +
 +===== Actors, Scenes i Skins =====
 +Per fer controls avançats com Buttons, Dialogs, etc. hem de tenir en compte que son elements tant de renderització com de entrada de dades, i es tracten de forma especial. En caldrà emprar els objectes ''Stage'' i ''Skin'':
 +
 +Algunes referències:
 +  * [[https://stackoverflow.com/questions/33062574/how-to-properly-implement-a-dialog-box-using-libgdx|Com fer un Dialog]].
 +  * [[https://github.com/BlueBoxWare/LibGDXPlugin|libGDX plugin per IntelliJ (Android Studio)]]
 +  * [[https://github.com/libgdx/libgdx-skins/tree/master/skins|Skins bàsics]]
 +  * [[https://github.com/czyzby/gdx-skins|Mes skins]]
 +
 +IMPORTANT: perquè funcioni el skin cal descarregar tots els arxius a la carepta assets.
  
 \\ \\
  
jocs_libgdx.1681778756.txt.gz · Darrera modificació: 2023/04/18 00:45 per enric_mieza_sanchez