Recommandations communes COB - CB « Montages déconsolidants et sorties d'actifs »
libgdx - RIP Tutorial · 2019. 1. 18. · Présentation générale de LibGDX 9 Ajout du support...
Transcript of libgdx - RIP Tutorial · 2019. 1. 18. · Présentation générale de LibGDX 9 Ajout du support...
libgdx
#libgdx
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
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
À 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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
}
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
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