Ací es mostren les diferències entre la revisió seleccionada i la versió actual de la pàgina.
Ambdós costats versió prèvia Revisió prèvia Següent revisió | Revisió prèvia | ||
jocs_libgdx [2023/04/18 00:34] enric_mieza_sanchez [Desenvolupament de jocs amb libGDX] |
jocs_libgdx [2024/04/12 11:52] enric_mieza_sanchez [Desenvolupament de jocs amb libGDX] |
||
---|---|---|---|
Línia 3: | Línia 3: | ||
En aquest article utilitzarem una llibreria específica, | En aquest article utilitzarem una llibreria específica, | ||
- | + | {{ libgdx.png? | |
{{tag> #FpInfor #Dam #DamMp08 #DamMp08Uf3 # | {{tag> #FpInfor #Dam #DamMp08 #DamMp08Uf3 # | ||
Enllaços: | Enllaços: | ||
+ | - [[libGDX Comunicacions]] en aquesta wiki. | ||
- [[https:// | - [[https:// | ||
- [[https:// | - [[https:// | ||
- [[https:// | - [[https:// | ||
- | {{ drop-game.jpeg |Joc Drop del tutorial | + | \\ |
+ | |||
+ | ===== Instal·lació ===== | ||
+ | Necessites tenir instal·lat Android Studio. | ||
+ | |||
+ | Crea el projecte amb l' | ||
+ | |||
+ | ==== Troubleshooting ==== | ||
+ | Si t' | ||
+ | - Eliminar la compilació de la plataforma iOS. | ||
+ | - Editar '' | ||
+ | buildToolsVersion " | ||
+ | </ | ||
+ | |||
+ | \\ | ||
+ | |||
+ | ===== Definicions ===== | ||
+ | Objectes principals del // | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | \\ | ||
===== Primer joc: Drops ===== | ===== Primer joc: Drops ===== | ||
+ | |||
+ | {{ drop-game.jpeg }} | ||
+ | |||
<WRAP todo> | <WRAP todo> | ||
- Crea un [[https:// | - Crea un [[https:// | ||
Línia 295: | 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; | ||
</ | </ | ||
Línia 340: | Línia 375: | ||
===== Comunicacions ===== | ===== Comunicacions ===== | ||
- | Llibreries de comunicacions: | + | <WRAP info> |
- | | + | Vés a l' |
- | * [[https:// | + | * Crides |
+ | * Ús WebSockets per comunicacions | ||
+ | </ | ||
\\ | \\ | ||
- | ==== WebSockets | + | ===== Ortographic Camera ===== |
- | Podem seguir | + | Tal i com explica el tutorial del Drop Game, la '' |
- | --> | + | Les operacions que realitzarà la càmera seran: |
- | Afegiu les següent línies a les seccions adequades: | + | Coordenades virtuals |
- | <file gradle build.gradle> | + | |
- | allprojects { | + | |
- | ext { | + | |
- | wsVersion = ' | + | |
- | } | + | |
- | repositories { | + | |
- | maven { url " | + | |
- | } | + | |
- | } | + | |
- | project(": | + | Posant que volem una pantalla de 800x480 |
- | dependencies { | + | |
- | api " | + | |
- | } | + | |
- | } | + | |
- | project(": | + | <file java DesktopLauncher.java> |
- | | + | public class DesktopLauncher |
- | api " | + | |
- | | + | |
- | } | + | |
- | + | ||
- | project(": | + | |
- | dependencies | + | |
- | | + | |
- | | + | |
- | api " | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | project(": | + | |
- | dependencies { | + | |
- | api " | + | |
- | } | + | |
- | } | + | |
</ | </ | ||
- | <file xml GdxDefinition.gwt.xml> | + | A l'arxiu de '' |
- | < | + | |
- | < | + | |
- | </ | + | |
- | Recordeu també que per tal que funcionin les comunicacions en Android cal activar els permisos adequats: | + | <code java> |
+ | public final int GAME_WIDTH = 800; | ||
+ | public final int GAME_HEIGHT = 480; | ||
- | <file xml AndroidManifest.xml> | + | public void create() { |
- | < | + | |
- | < | + | |
- | </ | + | |
- | <-- | + | |
- | + | ||
- | Per connectar-nos al servidor des de l'app libGDX ho fem així: | + | |
- | <file java GameScreen.java> | + | |
- | class GameScreen extends Screen { | + | |
- | WebSocket socket; | + | |
- | String address = " | + | |
- | int port = 8888; | + | |
- | + | ||
- | // constructor de l' | + | |
- | public GameScreen { | + | |
- | if( Gdx.app.getType()== Application.ApplicationType.Android ) | + | |
- | // en Android el host és accessible per 10.0.2.2 | + | |
- | address = " | + | |
- | socket = WebSockets.newSocket(WebSockets.toWebSocketUrl(address, | + | |
- | socket.setSendGracefully(false); | + | |
- | socket.addListener((WebSocketListener) new MyWSListener()); | + | |
- | socket.connect(); | + | |
- | socket.send(" | + | |
- | } | + | |
- | + | ||
- | // Es poden enviar dades al render() en tems real! | + | |
- | // Millor no fer-ho a cada frame per no saturar el server | + | |
- | // ni ralentitzar el joc | + | |
- | | + | |
- | | + | |
- | lastSend | + | |
- | socket.send(" | + | |
- | | + | |
- | } | + | |
- | + | ||
- | // COMUNICACIONS (rebuda de missatges) | + | |
- | ///////////////////////////////////////////// | + | |
- | class MyWSListener implements WebSocketListener { | + | |
- | + | ||
- | @Override | + | |
- | public boolean onOpen(WebSocket webSocket) { | + | |
- | System.out.println(" | + | |
- | return | + | |
- | } | + | |
- | + | ||
- | @Override | + | |
- | public boolean onClose(WebSocket webSocket, int closeCode, String reason) { | + | |
- | System.out.println(" | + | |
- | return false; | + | |
- | | + | |
- | + | ||
- | | + | |
- | public boolean onMessage(WebSocket webSocket, String packet) { | + | |
- | System.out.println(" | + | |
- | return false; | + | |
- | } | + | |
- | + | ||
- | @Override | + | |
- | public boolean onMessage(WebSocket webSocket, byte[] packet) { | + | |
- | System.out.println(" | + | |
- | return false; | + | |
- | } | + | |
- | + | ||
- | @Override | + | |
- | public boolean onError(WebSocket webSocket, Throwable error) { | + | |
- | System.out.println(" | + | |
- | return false; | + | |
- | } | + | |
- | } | + | |
} | } | ||
- | </file> | + | </code> |
- | === Servidor WebSockets | + | Per fer que el '' |
- | Podem emprar la [[https:// | + | <code java> |
- | + | public void render() { | |
- | --> Servidor HTTP + WebSockets amb NodeJS# | + | |
- | + | | |
- | Ens caldrà crear un projecte NodeJS i instal·lar les llibreries: | + | |
- | $ mkdir ws1 | + | //... |
- | $ cd ws1 | + | |
- | $ npm init | + | |
- | $ npm install http ws | + | |
- | + | ||
- | Afegeix '' | + | |
- | $ node index.js | + | |
- | + | ||
- | Cal indicar el projecte com a " | + | |
- | <file javascript package.json> | + | |
- | { | + | |
- | " | + | |
- | " | + | |
- | | + | |
} | } | ||
- | </file> | + | </code> |
- | <file javascript index.js> | + | Si estem capturant entrades de la pantalla, caldrà la operació contrària: |
- | import { createServer } from 'http'; | + | |
- | import { WebSocketServer } from 'ws'; | + | |
- | const server = createServer(); | + | <code java> |
- | const wss = new WebSocketServer({ server }); | + | protected int virtual_joystick_control() { |
+ | // iterar per multitouch | ||
+ | // cada " | ||
+ | for(int i=0;i< | ||
+ | if (Gdx.input.isTouched(i)) { | ||
+ | Vector3 touchPos | ||
+ | touchPos.set(Gdx.input.getX(i), | ||
+ | // traducció de coordenades reals (depen del dispositiu) a 800x480 | ||
+ | game.camera.unproject(touchPos); | ||
+ | // les dades convertides s' | ||
+ | //... | ||
+ | </ | ||
- | wss.on(' | + | \\ |
- | console.log(" | + | |
- | ws.send(' | + | |
- | ws.on(' | + | ===== 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 '' | ||
- | ws.on(' | + | Algunes referències: |
- | | + | * [[https:// |
- | | + | * [[https:// |
+ | | ||
+ | * [[https:// | ||
- | ws.on(' | + | IMPORTANT: perquè funcioni |
- | console.log(" | + | |
- | }) | + | |
- | + | ||
- | }); | + | |
- | + | ||
- | server.listen( 8888, function() { | + | |
- | console.log(" | + | |
- | }); | + | |
- | + | ||
- | </ | + | |
- | <-- | + | |
- | + | ||
- | === Exercicis === | + | |
- | <WRAP todo> | + | |
- | Implementa el servidor NodeJS indicat. | + | |
- | + | ||
- | Afegeix la llibreria de WebSockets al teu joc libGDX i fes que envii la posició del nostre personatge 1 cop per segon. | + | |
- | + | ||
- | Assegura' | + | |
- | </ | + | |
\\ | \\ | ||
- | ==== JSON and Jackson ==== | ||
- | Per treballar amb comunicacions és probable que us calgui codificar i descodificar JSON. Una opció és la [[https:// | ||
- | <file gradle gradle.settings> | ||
- | project(": | ||
- | dependencies { | ||
- | implementation ' | ||
- | implementation ' | ||
- | implementation ' | ||
- | } | ||
- | } | ||
- | </ |