libgdx - RIP Tutorial · 2019. 1. 18. · Présentation générale de LibGDX 9 Ajout du support...

29
libgdx #libgdx

Transcript of libgdx - RIP Tutorial · 2019. 1. 18. · Présentation générale de LibGDX 9 Ajout du support...

Page 1: libgdx - RIP Tutorial · 2019. 1. 18. · Présentation générale de LibGDX 9 Ajout du support pour le code spécifique à la plate-forme 9 Gestionnaire d'actifs 10 Le graphe de

libgdx

#libgdx

Page 2: libgdx - RIP Tutorial · 2019. 1. 18. · Présentation générale de LibGDX 9 Ajout du support pour le code spécifique à la plate-forme 9 Gestionnaire d'actifs 10 Le graphe de

Table des matières

À propos 1

Chapitre 1: Démarrer avec libgdx 2

Versions 2

Examples 2

Installation ou configuration 2

Boîtes de saisie 3

Sous projets 4

Les extensions 4

Avancée 4

Génération 5

LibGDX Bonjour tout le monde 5

Lancer votre jeu 6

Exécution en utilisant Eclipse 6

Exécution avec Intellij Idea 7

Que se passe-t-il dans la classe MyGdxGame? 8

Présentation générale de LibGDX 9

Ajout du support pour le code spécifique à la plate-forme 9

Gestionnaire d'actifs 10

Le graphe de scène 2D 11

Chapitre 2: Box2D 12

Examples 12

Créer des corps Box2D à partir d'une carte en mosaïque 12

Chapitre 3: Cycle de la vie 14

Remarques 14

Créer 14

Rendre 14

Disposer 14

Pause 14

CV 14

Page 3: libgdx - RIP Tutorial · 2019. 1. 18. · Présentation générale de LibGDX 9 Ajout du support pour le code spécifique à la plate-forme 9 Gestionnaire d'actifs 10 Le graphe de

Redimensionner 14

Examples 14

Fichier du jeu principal 15

Chapitre 4: Déplacement des acteurs sur le chemin à vitesse constante 16

Examples 16

Mouvement simple entre deux emplacements 16

Chapitre 5: Soutenir plusieurs résolutions 18

Examples 18

Fenêtres 18

Fenêtres intégrées 19

Fenêtres personnalisées 19

StretchViewport 20

FitViewport 20

Chapitre 6: Système d'entité Ashley 22

Remarques 22

Examples 22

Créer un composant 22

Création d'un système d'entités 22

Création d'un système d'entités triées 24

Création d'un système d'itération d'intervalle 25

Crédits 26

Page 4: libgdx - RIP Tutorial · 2019. 1. 18. · Présentation générale de LibGDX 9 Ajout du support pour le code spécifique à la plate-forme 9 Gestionnaire d'actifs 10 Le graphe de

À propos

You can share this PDF with anyone you feel could benefit from it, downloaded the latest version from: libgdx

It is an unofficial and free libgdx ebook created for educational purposes. All the content is extracted from Stack Overflow Documentation, which is written by many hardworking individuals at Stack Overflow. It is neither affiliated with Stack Overflow nor official libgdx.

The content is released under Creative Commons BY-SA, and the list of contributors to each chapter are provided in the credits section at the end of this book. Images may be copyright of their respective owners unless otherwise specified. All trademarks and registered trademarks are the property of their respective company owners.

Use the content presented in this book at your own risk; it is not guaranteed to be correct nor accurate, please send your feedback and corrections to [email protected]

https://riptutorial.com/fr/home 1

Page 5: libgdx - RIP Tutorial · 2019. 1. 18. · Présentation générale de LibGDX 9 Ajout du support pour le code spécifique à la plate-forme 9 Gestionnaire d'actifs 10 Le graphe de

Chapitre 1: Démarrer avec libgdx

Versions

Version Date de sortie

1.9.3 2016-05-16

1.9.5 2016-12-11

Examples

Installation ou configuration

LibGDX a une configuration assez simple, à l'aide d'un simple programme Java. Vous pouvez trouver le téléchargement ici . Lorsque vous démarrez l'application, cela ressemblera à ceci:

https://riptutorial.com/fr/home 2

Page 6: libgdx - RIP Tutorial · 2019. 1. 18. · Présentation générale de LibGDX 9 Ajout du support pour le code spécifique à la plate-forme 9 Gestionnaire d'actifs 10 Le graphe de

Remarque: Cette capture d'écran a été prise sous Linux et indique un chemin différent de celui d'une installation Windows. Cependant, le formulaire est le même sur tout système d'exploitation compatible avec cette application de configuration

Boîtes de saisie

Dans la zone de saisie "Nom", le nom du jeu correspondant à votre projet. La zone de saisie "Package" correspond au package de votre classe principale. La zone de saisie "Game Class" est la classe principale appelée lors de l'exécution de votre jeu. La zone de saisie "Destination" correspond à la destination de la génération de votre projet. La zone de saisie "Andriod SDK", le chemin d'accès à votre SDK Android. Cette zone de saisie est entièrement facultative, donc si vous ne souhaitez pas déployer votre application sur Android, vous n'avez pas à vous en préoccuper.

https://riptutorial.com/fr/home 3

Page 7: libgdx - RIP Tutorial · 2019. 1. 18. · Présentation générale de LibGDX 9 Ajout du support pour le code spécifique à la plate-forme 9 Gestionnaire d'actifs 10 Le graphe de

Sous projets

Les sous-projets ne sont que les plates-formes à déployer. Cette partie est assez explicite. Si vous ne souhaitez pas le déployer au format HTML, par exemple, décochez simplement la case.

Les extensions

Les extensions sont les extensions officielles de LibGDX. Voici un tableau vous indiquant ce que chacun est:

Nom de l'extension

La description

BalleBullet est une bibliothèque de détection de collision 3D et de dynamique de corps rigide.

FreetypeFreetype vous permet d'utiliser des polices .ttf plutôt que d'utiliser des polices Bitmap

Outils Vous permet d'implémenter la sortie des outils LibGDX.

ContrôleursVous permet de mettre en œuvre des contrôleurs tels que les contrôleurs XBox 360.

Box2d Une bibliothèque de physique pour les jeux 2d.

Box2dlightsPermet d'ajouter facilement des lumières dynamiques et douces à un jeu de physique.

Ashley Un petit cadre d'entité

Ai Un cadre d'intelligence artificielle.

Vous pouvez ajouter des extensions tierces, mais leurs détails ou noms ne seront pas affichés ici.

Avancée

Dans la section Avancé, vous pouvez définir plusieurs paramètres et générer des fichiers de projet supplémentaires pour Eclipse et IDEA IDE.

Nom du paramètre La description

URL Miroir Maven Remplace Maven Central par l'URL Maven fournie

IDÉE Génère des fichiers de projet Intellij IDEA

https://riptutorial.com/fr/home 4

Page 8: libgdx - RIP Tutorial · 2019. 1. 18. · Présentation générale de LibGDX 9 Ajout du support pour le code spécifique à la plate-forme 9 Gestionnaire d'actifs 10 Le graphe de

Nom du paramètre La description

Éclipse Génère des fichiers de projet Eclipse

Mode hors-ligne Ne forcez pas les dépendances de téléchargement

Génération

Une fois que vous avez tous vos paramètres corrects, vous pouvez appuyer sur le bouton "Générer". Cela peut prendre quelques secondes, mais cela générera les fichiers de base, et Gradle nécessaire pour votre projet. Une fois que vous avez terminé, il est temps d’importer le projet sur votre IDE.

LibGDX Bonjour tout le monde

Les bases

Les projets générés contiennent une application basique de type Hello World déjà implémentée.

Le projet principal est le projet principal, qui contient tout le code indépendant de la plate-forme. Ceci est obligatoire, mais selon vos paramètres de génération, vous pouvez avoir plusieurs autres projets pour chaque plate-forme que vous avez sélectionnée.

L'exemple

Ouvrez com.mygdx.game.MyGdxGame.java dans le projet core . Vous verrez le code suivant:

public class MyGdxGame extends ApplicationAdapter { SpriteBatch batch; Texture img; @Override public void create () { batch = new SpriteBatch(); img = new Texture("badlogic.jpg"); } @Override public void render () { Gdx.gl.glClearColor(1, 0, 0, 1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); batch.begin(); batch.draw(img, 0, 0); batch.end(); } @Override public void dispose () { batch.dispose(); img.dispose(); } }

https://riptutorial.com/fr/home 5

Page 9: libgdx - RIP Tutorial · 2019. 1. 18. · Présentation générale de LibGDX 9 Ajout du support pour le code spécifique à la plate-forme 9 Gestionnaire d'actifs 10 Le graphe de

Bien que ce soit votre projet principal, vous ne l' exécutez directement, vous devez toujours exécuter le programme de lancement spécifique à la plateforme, pour le bureau , il est appelé com.mygdx.game.desktop.DesktopLauncher.java dans le desktop du projet.

public class DesktopLauncher { public static void main (String[] arg) { LwjglApplicationConfiguration config = new LwjglApplicationConfiguration(); new LwjglApplication(new MyGdxGame(), config); } }

Dans cette classe, vous pouvez définir des paramètres spécifiques à la plate-forme.

Lancer votre jeu

Eclipse et Intellij utilisent deux méthodes différentes pour exécuter votre projet. Trouvez l'IDE que vous utilisez ci-dessous.

Exécution en utilisant Eclipse

En utilisant eclipse, vous pouvez exécuter votre application en exécutant cette classe en tant qu'application Java (Cliquez avec le bouton droit sur le projet -> Exécuter en tant que -> Application Java). Vous verrez la fenêtre suivante:

https://riptutorial.com/fr/home 6

Page 10: libgdx - RIP Tutorial · 2019. 1. 18. · Présentation générale de LibGDX 9 Ajout du support pour le code spécifique à la plate-forme 9 Gestionnaire d'actifs 10 Le graphe de

Exécution avec Intellij Idea

Dans Intellij, vous devrez effectuer une configuration d'exécution. Pour ce faire, vous devez cliquer sur le bouton en haut à droite qui ressemble à une carotte descendante:

Cliquez ensuite sur le bouton "Modifier les configurations ...". Vous serez présenté avec un écran de toutes vos configurations d'exécution actuelles. Cliquez sur le "+" en haut à gauche de cette fenêtre et sélectionnez l'option "Application". De là, sélectionnez le fichier "DesktopLauncher" pour l'option "Classe principale", définissez l'option "Utiliser le chemin de classe du module" sur l'option principale et définissez "Répertoire de travail" sur le dossier des ressources de votre dossier principal. Le produit final devrait ressembler à ceci:

https://riptutorial.com/fr/home 7

Page 11: libgdx - RIP Tutorial · 2019. 1. 18. · Présentation générale de LibGDX 9 Ajout du support pour le code spécifique à la plate-forme 9 Gestionnaire d'actifs 10 Le graphe de

Une fois cela fait, vous pouvez sélectionner un nom pour votre configuration d'exécution, puis cliquer sur "Appliquer", puis sur "OK". Une fois que vous avez terminé avec cela, vous pouvez cliquer sur l'icône verte en haut à droite:

Que se passe-t-il dans la classe MyGdxGame?

https://riptutorial.com/fr/home 8

Page 12: libgdx - RIP Tutorial · 2019. 1. 18. · Présentation générale de LibGDX 9 Ajout du support pour le code spécifique à la plate-forme 9 Gestionnaire d'actifs 10 Le graphe de

Tout d'abord, la méthode create est appelée, ce qui initialisera le lot qui attire à l'écran. Ensuite, la méthode charge le fichier badlogic.jpg dans la mémoire.

Après cela, la méthode de render est appelée à plusieurs reprises jusqu'à ce que l'application soit arrêtée. Cette méthode rétablit la couleur d'arrière-plan au rouge et dessine l'image à l'écran. Comme vous pouvez le voir, vous devez toujours commencer et terminer le dessin par lots. Enfin, lorsque l'application est sur le point d'arrêter, la méthode dispose est appelée, ce qui libère l'espace mémoire utilisé par la texture et le lot.

(Il est bon de savoir que l'élimination peut également se produire à l'exécution sur d'autres plates-formes, par exemple Android, car Android peut libérer de l'espace mémoire lorsque les applications sont en arrière-plan, mais c'est un sujet plus avancé)

Remarque: Si vous obtenez une erreur en cours d'exécution, consultez la question ci-dessous pour obtenir une réponse!

Fichier non trouvé: badlogic.jpg (Internal)

Présentation générale de LibGDX

LibGDX est une bibliothèque gratuite de développement de jeux open source développée en Java. Ses objectifs sont de permettre aux utilisateurs de développer des jeux multi-plateformes fonctionnant sur les navigateurs de bureau, Android, iOS et Web. Écrivez le code une fois, déployez-le sur l'une des plates-formes principales.

Ajout du support pour le code spécifique à la plate-forme

LibGDX est conçu de manière à pouvoir écrire le même code et à le déployer sur plusieurs plates-formes différentes. Cependant, il y a des moments où vous voulez avoir accès au code spécifique à la plateforme. Pour un exemple, si vous avez des classements et des réalisations dans votre jeu, vous pouvez utiliser des outils spécifiques à la plate-forme (tels que Google Play Games) en plus de les stocker localement. Ou vous voulez utiliser une base de données ou quelque chose de complètement différent.

Vous ne pouvez pas ajouter ce type de code dans le module principal. La première étape consiste donc à créer une interface. Créez-le dans le module de base. Ce premier est un utilitaire pour gérer d’autres interfaces:

public interface PlatformWrapper{ //here you can also add other things you need that are platform specific. //If you want to create your own file saver for an instance, a JSON based database, //achievements, leaderboards, in app purchases and anything else you need platform specific code for. SQLWrapper getSQLSaver();//This one will be used in this example AchievementWrapper getAchievementHandler();//this line is here as an example }

https://riptutorial.com/fr/home 9

Page 13: libgdx - RIP Tutorial · 2019. 1. 18. · Présentation générale de LibGDX 9 Ajout du support pour le code spécifique à la plate-forme 9 Gestionnaire d'actifs 10 Le graphe de

Ensuite, nous devons créer une seconde interface, SQLWrapper. Celui-ci va également dans le module de base.

public interface SQLWrapper{ void init(String DATABASE); void saveSerializable(int id, Object o); Object loadSerializable(int id, Object o); void saveString(int id, String s); //.... and other methods you need here. This is something that varies //with usage. You may not need the serializable methods, but really need a custom method for saving //an entire game world. This part is entirely up to you to find what methods you need //With these three methods, always assume it is the active database in question. Unless //otherwise specified, it most likely is String getActiveDatabase(); void deleteDatabase(); void deleteTable(String table);//delete the active table }

Maintenant, vous devez aller dans chaque projet et créer une classe pour implémenter PlatformWrapper et une autre pour implémenter SQLWrapper. Dans chaque projet, vous ajoutez le code nécessaire, comme les instances, les constructeurs, etc.

Une fois que vous avez remplacé toutes les interfaces que vous avez créées, assurez-vous qu'elles ont toutes une instance dans la classe qui implémente PlatformWrapper (et qu'il existe un getter). Enfin, vous modifiez le constructeur de la classe principale. La classe principale est la classe que vous référencez depuis le lanceur. Il étend soit ApplicationAdapter, implémente ApplicationListener ou étend Game. Editez le constructeur et ajoutez PlatformWrapper comme argument. Dans l'encapsuleur de la plate-forme, vous avez des utilitaires (si vous en avez ajouté) en plus de tous les autres wrappers (sql, réalisations ou tout autre élément ajouté).

Maintenant, si tout est correctement configuré, vous pouvez appeler le PlatformWrapper et obtenir l'une des interfaces multiplates-formes. Appelez n'importe quelle méthode et (en supposant que le code exécuté est correct) vous verrez sur n'importe quelle plate-forme, il fait ce qu'il est censé faire avec le code spécifique à la plate-forme

Gestionnaire d'actifs

AssetManager est une classe qui vous aide à gérer vos actifs.

Tout d'abord, vous devez créer une instance:

AssetManager am = new AssetManager();

Une fois cette opération initialisée, et avant de rendre quoi que ce soit, vous souhaitez obtenir les ressources suivantes:

am.load("badlogic.jpg", Texture.class);//Texture.class is the class this asset is of. If it is a //sound asset, it doesn't go under Texture. if it is a 3D model, it doesn't go under

https://riptutorial.com/fr/home 10

Page 14: libgdx - RIP Tutorial · 2019. 1. 18. · Présentation générale de LibGDX 9 Ajout du support pour le code spécifique à la plate-forme 9 Gestionnaire d'actifs 10 Le graphe de

Texture.class //Which class added depends on the asset you load //... other loading here ...// //when finished, call finishLoading: am.finishLoading();

Maintenant, où que vous vous sentiez pour obtenir badlogic.jpg :

Texture texture = am.get("badlogic.jpg"); //Ready to render! The rendering itself is in the normal way

Utiliser AssetManager vous permet de les charger une fois dans la mémoire de AssetManager, puis de les récupérer autant de fois que vous le souhaitez.

Pourquoi utiliser AssetManager? (à partir du wiki ):

AssetManager (code) vous aide à charger et à gérer vos actifs. C'est la méthode recommandée pour charger vos ressources, grâce aux comportements suivants:

Le chargement de la plupart des ressources se fait de manière asynchrone, vous pouvez donc afficher un écran de chargement réactif pendant le chargement

Les actifs sont la référence comptée. Si deux actifs A et B dépendent tous deux d'un autre actif C, C ne sera pas éliminé tant que A et B n'auront pas été éliminés. Cela signifie également que si vous chargez un actif plusieurs fois, il sera effectivement partagé et ne prendra qu'une seule mémoire!

Un lieu unique pour stocker tous vos actifs.•Permet de mettre en œuvre de manière transparente des éléments tels que les caches (voir FileHandleResolver ci-dessous)

Le graphe de scène 2D

Lorsque vous commencez à utiliser Java ou Android, vous apprenez rapidement que (0,0) se trouve dans le coin supérieur gauche. Dans LibGDX, cependant, (0,0) est par défaut dans le coin inférieur gauche.

À l'aide d'une caméra orthographique, vous pouvez obtenir (0, 0) dans le coin supérieur gauche. Bien que par défaut, (0, 0) se trouve dans le coin inférieur gauche. C'est quelque chose de important à savoir, car cela change aussi le coin des textures qui ont les coordonnées X et Y.

Lire Démarrer avec libgdx en ligne: https://riptutorial.com/fr/libgdx/topic/1368/demarrer-avec-libgdx

https://riptutorial.com/fr/home 11

Page 15: libgdx - RIP Tutorial · 2019. 1. 18. · Présentation générale de LibGDX 9 Ajout du support pour le code spécifique à la plate-forme 9 Gestionnaire d'actifs 10 Le graphe de

Chapitre 2: Box2D

Examples

Créer des corps Box2D à partir d'une carte en mosaïque

Les objets créés dans une carte en mosaïque (.tmx) peuvent être simplement chargés en tant que corps dans un monde Box2D en utilisant la classe Libgdx MapObject comme suit:

public void buildBuildingsBodies(TiledMap tiledMap, World world, String layer){ MapObjects objects = tiledMap.getLayers().get(layer).getObjects(); for (MapObject object: objects) { Rectangle rectangle = ((RectangleMapObject)object).getRectangle(); //create a dynamic within the world body (also can be KinematicBody or StaticBody BodyDef bodyDef = new BodyDef(); bodyDef.type = BodyDef.BodyType.DynamicBody; Body body = world.createBody(bodyDef); //create a fixture for each body from the shape Fixture fixture = body.createFixture(getShapeFromRectangle(rectangle),density); fixture.setFriction(0.1F); //setting the position of the body's origin. In this case with zero rotation body.setTransform(getTransformedCenterForRectangle(rectangle),0); } }

Les fonctions suivantes aident à mapper les coordonnées de l'objet en mosaïque à la forme Box2D.

public static final float TILE_SIZE = 16; //Also you can get tile width with: Float.valueOf(tiledMap.getProperties().get("tilewidth",Integer.class)); public static Shape getShapeFromRectangle(Rectangle rectangle){ PolygonShape polygonShape = new PolygonShape(); polygonShape.setAsBox(rectangle.width*0.5F/ TILE_SIZE,rectangle.height*0.5F/ TILE_SIZE); return polygonShape; }

Et cette fonction permet de mapper le centre d'un objet en mosaïque à la forme rectangle de Libgdx.

public static Vector2 getTransformedCenterForRectangle(Rectangle rectangle){ Vector2 center = new Vector2(); rectangle.getCenter(center); return center.scl(1/TILE_SIZE); }

Ainsi, la première fonction peut être utilisée comme suit:

https://riptutorial.com/fr/home 12

Page 16: libgdx - RIP Tutorial · 2019. 1. 18. · Présentation générale de LibGDX 9 Ajout du support pour le code spécifique à la plate-forme 9 Gestionnaire d'actifs 10 Le graphe de

public static final float GRAVITY = 9.8F; public void createBodies(AssetManager assetManager){ TiledMap tiledMap = assetManager.get("tiledMap.tmx"); //create a Box2d world will contain the physical entities (bodies) World world = new World(new Vector2(0,GRAVITY),true); String layerName = "BuildingsLayers"; buildBuildingsBodies(tiledMap,world,layerName); }

Lire Box2D en ligne: https://riptutorial.com/fr/libgdx/topic/5052/box2d

https://riptutorial.com/fr/home 13

Page 17: libgdx - RIP Tutorial · 2019. 1. 18. · Présentation générale de LibGDX 9 Ajout du support pour le code spécifique à la plate-forme 9 Gestionnaire d'actifs 10 Le graphe de

Chapitre 3: Cycle de la vie

Remarques

Créer

Cette méthode est appelée une fois au démarrage de l'application. Dans cette méthode, les ressources doivent être chargées et les variables doivent être initialisées.

Rendre

La méthode est appelée chaque image et est utilisée pour afficher tout ce qui doit être affiché. Il est également utilisé pour mettre à jour les variables / classes pouvant nécessiter une mise à jour, comme une caméra.

Disposer

Cette méthode est appelée lorsque l'application est détruite et utilisée pour libérer des ressources, par exemple Texture ou SpriteBatch . Vous saurez qu'un objet doit être éliminé s'il implémente l'interface Disposable .

Pause

Cette méthode est appelée lorsque l'application est en pause. Habituellement, lorsque l'application perd le focus.

CV

Cette méthode est appelée lorsque l'application doit être reprise. Habituellement, lorsque l'application reprend le focus.

Redimensionner

Cette méthode est appelée lorsque l'application est redimensionnée. Cette méthode est généralement utilisée pour redimensionner une fenêtre.

Examples

https://riptutorial.com/fr/home 14

Page 18: libgdx - RIP Tutorial · 2019. 1. 18. · Présentation générale de LibGDX 9 Ajout du support pour le code spécifique à la plate-forme 9 Gestionnaire d'actifs 10 Le graphe de

Fichier du jeu principal

class Tutorial extends Game { public ScreenNumberOne screenNumberOne; public void create(){ screenNumberOne = new ScreenNumberOne(this); this.setScreen(screenNumberOne); } public void render() { super.render(); } }

C'est le fichier de base pour vous permettre de créer plusieurs écrans. Notez qu'il étend le Game .

Lire Cycle de la vie en ligne: https://riptutorial.com/fr/libgdx/topic/5053/cycle-de-la-vie

https://riptutorial.com/fr/home 15

Page 19: libgdx - RIP Tutorial · 2019. 1. 18. · Présentation générale de LibGDX 9 Ajout du support pour le code spécifique à la plate-forme 9 Gestionnaire d'actifs 10 Le graphe de

Chapitre 4: Déplacement des acteurs sur le chemin à vitesse constante

Examples

Mouvement simple entre deux emplacements

Pour cela, la meilleure solution consiste à utiliser des actions . Pour ajouter une nouvelle action à un acteur de Scene2D appelez simplement:

Action action = Actions.moveTo(x,y,duration); actorObject.addAction(action);

Où x et y est l'emplacement cible et la durée est la vitesse de ce mouvement en secondes ( float ).

Si vous voulez arrêter cette action (et l'acteur par elle), vous pouvez le faire en appelant:

actorObject.removeAction(action);

ou vous pouvez supprimer toutes les actions en appelant:

actorObject.clearActions();

Cela arrêtera immédiatement l'exécution de l'action.

L'action moveTo manipule les propriétés x et y de l'acteur. Ainsi, lorsque vous dessinez l'acteur à l'écran, utilisez toujours getX () et getY () pour dessiner des textures. Tout comme dans l'exemple suivant:

public class MovingActor extends Actor { private Action runningAction; private float speed = 2f; public void moveTo(Vector2 location) { runningAction = Actions.moveTo(location.x, location.y, speed); this.addAction(runningAction); } public void stopAction() { this.removeAction(runningAction); } public void stopAllActions() { this.clearActions(); } @Override

https://riptutorial.com/fr/home 16

Page 20: libgdx - RIP Tutorial · 2019. 1. 18. · Présentation générale de LibGDX 9 Ajout du support pour le code spécifique à la plate-forme 9 Gestionnaire d'actifs 10 Le graphe de

public void draw(Batch batch, float parentAlpha){ batch.draw(someTexture, getX(), getY()); } }

Lire Déplacement des acteurs sur le chemin à vitesse constante en ligne: https://riptutorial.com/fr/libgdx/topic/6384/deplacement-des-acteurs-sur-le-chemin-a-vitesse-constante

https://riptutorial.com/fr/home 17

Page 21: libgdx - RIP Tutorial · 2019. 1. 18. · Présentation générale de LibGDX 9 Ajout du support pour le code spécifique à la plate-forme 9 Gestionnaire d'actifs 10 Le graphe de

Chapitre 5: Soutenir plusieurs résolutions

Examples

Fenêtres

Pour prendre en charge plusieurs résolutions et formats d'image, Libgdx utilise les " Viewports . Il existe quelques types de Viewports qui utilisent différentes stratégies pour gérer plusieurs résolutions et rapports d'aspect. Un Viewport utilise un Camera sous le capot et gère viewportHeight et viewportWidth . Vous pouvez éventuellement donner à la Viewport une Camera dans son constructeur, sinon elle utilisera une OrthographicCamera par défaut:

private Viewport viewport; private Camera camera; public void create() { camera = new PerspectiveCamera(); viewport = new FitViewport(8f, 4.8f, camera); }

De plus, vous devez spécifier worldWidth et worldHeight au worldHeight de la fenêtre. Cet espace représentera le système de coordonnées virtuel que vous utiliserez pour spécifier la position des objets à dessiner et leurs tailles. La transformation de fenêtre d'affichage, qui peut être appliquée à un SpriteBatch, par exemple, se chargera automatiquement de transformer les coordonnées logiques en coordonnées d'écran réelles, d'une manière conforme au type de fenêtre que vous utilisez. Par exemple, lorsque vous utilisez une projection orthographique ( OrthographicCamera , qui est la valeur par défaut): si la taille de votre monde est de 12,8 x 7,8 mètres et que l'écran de votre appareil mesure 2560 x 1560 pixels, votre monde sera projeté de manière dynamique avec 200 pixels par mètre.

Lorsque la taille de la Viewport change (par exemple, si l'orientation de l'écran du smartphone est en train de changer), vous devez informer la Viewport de ce changement. Il mettra alors automatiquement à jour le viewportHeight et le viewportWidth Camera :

public void resize(int width, int height) { viewport.update(width, height); }

Les Viewport visualisation gèrent également la fenêtre OpenGL Viewport et modifient la zone de dessin selon les besoins.

Les Viewport prennent également soin de convertir les coordonnées de l'écran en coordonnées de jeu, ce qui est nécessaire en particulier pour la cueillette:

private Vector2 worldPos = new Vector2(); public boolean touchDown (int x, int y, int pointer, int button) {

https://riptutorial.com/fr/home 18

Page 22: libgdx - RIP Tutorial · 2019. 1. 18. · Présentation générale de LibGDX 9 Ajout du support pour le code spécifique à la plate-forme 9 Gestionnaire d'actifs 10 Le graphe de

worldPos.set(x, y); viewport.unproject(worldPos); processPicking(worldPos); }

Fenêtres intégrées

Il y a quelques fenêtres intégrées qui font chacune des choses différentes. Voici une liste des noms et de leurs descriptions:

Nom de la fenêtre

La description

StretchViewportVa étirer l'écran. Pas de barres noires, mais les proportions peuvent être désactivées.

FitViewportMaximisera sa taille en fonction du ratio d'aspect. Pourrait avoir des barres noires.

FillViewport Tout comme un FitVieport, mais remplit toujours tout l'écran.

ScreenViewport Remplit toujours tout l'écran, mais ne redimensionne aucun enfant.

ExtendedViewportMaintient le rapport hauteur / largeur sans barres noires en étendant le monde dans une direction

CustomViewportUne fenêtre personnalisée programmée. Pourrait avoir des barres noires, et pourrait garder les proportions.

Fenêtres personnalisées

Vous pouvez créer votre propre fenêtre personnalisée. Il peut avoir des barres noires et il peut ou non conserver son format, en fonction de la façon dont vous le programmez. Une fenêtre personnalisée ressemblerait à ceci: public class Tutorial extends Viewport . Vous devez remplacer la update(width, height) à update(width, height) , mais c'est tout.

Une autre tentative consisterait à étendre le ScalingViewport générique et à fournir un autre Scaling qui n'est pas déjà fourni. Supposons que vous le définissiez sur Scaling.none . Cela ressemblerait à ceci:

https://riptutorial.com/fr/home 19

Page 23: libgdx - RIP Tutorial · 2019. 1. 18. · Présentation générale de LibGDX 9 Ajout du support pour le code spécifique à la plate-forme 9 Gestionnaire d'actifs 10 Le graphe de

Si vous voulez une référence, vous pouvez trouver les classes de fenêtre intégrées ici .

StretchViewport

Le StretchViewport est une Viewport d' Viewport de type, qui prend en charge une taille de l' écran virtuel. Cela vous permet de définir une largeur et une hauteur fixes (résolution indépendante). StretchViewport , comme son nom l'indique, étend l'écran virtuel si le format d'image virtuel ne correspond pas au rapport d'aspect réel. La fenêtre OpenGL ne sera pas modifiée et il n’y aura pas de barres noires.

Usage:

private Viewport viewport; private Camera camera; public void create() { camera = new OrthographicCamera(); viewport = new StretchViewport(80, 48, camera); } public void resize(int width, int height) { viewport.update(width, height); }

FitViewport

Les FitViewports sont des fenêtres qui conservent toujours les proportions. Cela se fait en créant des barres noires sur les bords où il reste de la place. C'est l'une des fenêtres les plus utilisées.

Usage:

private Viewport viewport; private Camera camera;

https://riptutorial.com/fr/home 20

Page 24: libgdx - RIP Tutorial · 2019. 1. 18. · Présentation générale de LibGDX 9 Ajout du support pour le code spécifique à la plate-forme 9 Gestionnaire d'actifs 10 Le graphe de

public void create() { camera = new OrthographicCamera(); viewport = new FitViewport(80, 48, camera); } public void resize(int width, int height) { viewport.update(width, height); }

Lire Soutenir plusieurs résolutions en ligne: https://riptutorial.com/fr/libgdx/topic/4219/soutenir-plusieurs-resolutions

https://riptutorial.com/fr/home 21

Page 25: libgdx - RIP Tutorial · 2019. 1. 18. · Présentation générale de LibGDX 9 Ajout du support pour le code spécifique à la plate-forme 9 Gestionnaire d'actifs 10 Le graphe de

Chapitre 6: Système d'entité Ashley

Remarques

Ashley Entity System est une bibliothèque Entity System gérée sous l' organisation LibGDX et parfaitement adaptée au développement de jeux. Cela dépend des classes d'utilitaires LibGDX, mais peut être utilisé avec d'autres frameworks de jeu Java non basés sur LibGDX.

Les systèmes d'entités offrent une manière différente de gérer les données et les fonctionnalités vers de grands ensembles d'objets sans avoir à rendre les classes d'objets riches en héritage.

Utiliser Ashley pourrait être une approche utile pour ceux qui recherchent une approche de modélisation d’objets comme celle fournie par Unity, mais avec la portée d’un framework au lieu d’un moteur de jeu.

Examples

Créer un composant

Les composants sont simplement des instances qui implémentent la classe de composants Ashley.

import com.badlogic.ashley.core.Component; import com.badlogic.ashley.core.ComponentMapper; public class Position implements Component { public static final ComponentMapper<Position> Map = ComponentMapper.getFor(Position.class); public float x = 0f, y = 0f; }

Les mappes de composants permettent d'accéder rapidement aux composants des entités. Deux méthodes courantes pour gérer vos mappes de composants consistent à conserver une instance statique dans la classe de votre composant ou à avoir une classe / enum contenant tous les mappeurs de tous vos composants.

Il n'est pas nécessaire de déclarer un mappeur pour un type de composant plus d'une fois dans votre application.

Création d'un système d'entités

Les systèmes d'entités sont la manière dont vous effectuez des opérations fonctionnelles sur des ensembles d'entités. Les composants ne doivent généralement pas être associés à une logique impliquant la connaissance des données ou de l'état des autres instances du composant, car cela est la tâche d'un système d'entités. Un système d'entités ne peut pas être enregistré sur plusieurs

https://riptutorial.com/fr/home 22

Page 26: libgdx - RIP Tutorial · 2019. 1. 18. · Présentation générale de LibGDX 9 Ajout du support pour le code spécifique à la plate-forme 9 Gestionnaire d'actifs 10 Le graphe de

moteurs à la fois.

Les systèmes d'entités ne doivent pas effectuer plus d'un type de fonction. Un MovementSystem ne devrait gérer que le positionnement, etc., tandis que quelque chose comme RenderSystem devrait gérer le dessin des entités.

import com.badlogic.ashley.core.Entity; import com.badlogic.ashley.core.EntitySystem; import com.badlogic.ashley.core.Family; public class MovementSystem extends EntitySystem { //the type of components necessary for entities to have to be operated on private static final Family FAMILY = Family.all(Position.class).get(); public MovementSystem () { super(); } /** * The update method called every tick. * @param deltaTime The time passed since last frame in seconds. */ public void update (float deltaTime) { for (Entity e : this.getEngine().getEntitiesFor(FAMILY)) { Position pos = Position.Map.get(e); // do entity movement logic on component ... } }

Il est parfois utile d'étendre votre EntitySystems avec des fonctionnalités supplémentaires telles que celles trouvées dans EntityListeners, afin de ne garder en mémoire que les types d'entités sur lesquelles vous souhaitez travailler, au lieu de les parcourir tous les cycles. Les EntityListeners sont déclenchés à chaque fois qu'une entité est ajoutée au même moteur que celui sur lequel le système est enregistré.

import com.badlogic.ashley.core.EntityListener; import com.badlogic.gdx.utils.Array; public class MovementSystem extends EntitySystem implements EntityListener { Array<Entity> moveables = new Array<>(); ... @Override public void entityAdded(Entity entity) { if (FAMILY.matches(entity)) { moveables.add(entity); } } @Override public void entityRemoved(Entity entity) { if (FAMILY.matches(entity)) { moveables.removeValue(entity, true); } }

https://riptutorial.com/fr/home 23

Page 27: libgdx - RIP Tutorial · 2019. 1. 18. · Présentation générale de LibGDX 9 Ajout du support pour le code spécifique à la plate-forme 9 Gestionnaire d'actifs 10 Le graphe de

public void update (float deltaTime) { for (Entity e : this.moveables) { Position pos = Position.Map.get(e); // do entity movement logic on component ... } } }

Le suivi d'un sous-ensemble d'entités que le système traite à tout moment peut également être optimal, car vous pouvez supprimer une entité particulière du traitement de ce système sans avoir à supprimer le composant associé ou à le retirer du moteur dans son ensemble.

Création d'un système d'entités triées

Un EntitySystem simple qui traite chaque entité d'une famille donnée dans l'ordre spécifié par un comparator et appelle processEntity() pour chaque entité à chaque mise à jour d' EntitySystem . Ce n'est vraiment qu'une classe de commodité, car les systèmes de rendu ont tendance à parcourir une liste d'entités de manière triée. L'ajout d'entités entraînera le recours à la liste d'entités. Appelez forceSort() si vous avez modifié vos critères de tri. Pour plus d'informations, voir SortedIteratingSystem

Dans l'exemple de code ci-dessous, la meilleure utilisation pour cela est le rendu de vos images-objets dans un ordre trié par zindex.

public class SpriteComponent implements Component { public TextureRegion region; public int z = 0; } public class Mapper { public static ComponentMapper<SpriteComponent> sprite = ComponentMapper.getFor(SpriteComponent.class); } public class RenderingSystem extends SortedIteratingSystem { public RenderingSystem () { super(Familly.all(SpriteComponent.class).get(), new ZComparator()) } public void processEntity(Entity entity, float deltaTime) { if(checkZIndexHasChangeValue()) { forceSort(); } } private static class ZComparator implements Comparator<Entity> { @Override public int compare(Entity entityA, Entity entityB) { return (int)Math.signum(Mapper.sprite.get(entityA).z - Mapper.sprite.get(entityB).z); } }

https://riptutorial.com/fr/home 24

Page 28: libgdx - RIP Tutorial · 2019. 1. 18. · Présentation générale de LibGDX 9 Ajout du support pour le code spécifique à la plate-forme 9 Gestionnaire d'actifs 10 Le graphe de

}

Création d'un système d'itération d'intervalle

Un EntitySystem simple qui traite une famille d'entités non pas une fois par image, mais après un intervalle donné. La logique de traitement des entités doit être placée dans processEntity(Entity) . Pour plus d'informations, voir IntervalIteratingSystem

Dans l'exemple de code ci-dessous, la meilleure utilisation est l'étape du monde de la physique.

public class Constants { public final static float TIME_STEP = 1 / 60.0f; // 60 fps public final static int VELOCITY_ITERATIONS = 6; public final static int POSITION_ITERATIONS = 2; } public class PhysicsSystem extends IntervalIteratingSystem { public PhysicsSystem () { super(Family.all(PhysicsComponent.class), Constants.TIME_STEP); } @Override protected void processEntity(Entity entity) { // process the physics component here with an interval of 60fps } @Override protected void updateInterval() { WorldManager.world.step(Constants.TIME_STEP, Constants.VELOCITY_ITERATIONS, Constants.POSITION_ITERATIONS); super.updateInterval(); } }

Lire Système d'entité Ashley en ligne: https://riptutorial.com/fr/libgdx/topic/2620/systeme-d-entite-ashley

https://riptutorial.com/fr/home 25

Page 29: libgdx - RIP Tutorial · 2019. 1. 18. · Présentation générale de LibGDX 9 Ajout du support pour le code spécifique à la plate-forme 9 Gestionnaire d'actifs 10 Le graphe de

Crédits

S. No

Chapitres Contributeurs

1Démarrer avec libgdx

Aryan, Community, Deniz Yılmaz, gaRos, Jesse Lawson, mttprvst13, Winter, Wyatt, Zoe

2 Box2D Alex Sifuentes, Alvaro Hernandez

3 Cycle de la vie Benedikt S. Vogler, mttprvst13, nhydock, Skrelp

4

Déplacement des acteurs sur le chemin à vitesse constante

gaRos

5Soutenir plusieurs résolutions

Eames, Lake, mttprvst13, Springrbua, Xoppa

6Système d'entité Ashley

nhydock, ronscript

https://riptutorial.com/fr/home 26