Les outils standards sont fournis par le module lionengine-game
, permettant un développement de jeux équilibré avec des classes standards et une architecture de base.
C'est également la dépendance principale pour les autres modules de jeux spécialisés.
Dans cette section nous verrons comment utiliser ces outils.
Les objets primaires ont été conçu pour êtres réutilisés autant que possible, étant suffisamment génériques et utilisables.
ObjectGame
C'est le principal type d'objet primaire, fournissant les outils essentiels pour tout objet dérivé. Il est conçu pour fonctionner avec un
SetupGame
, requis par son constructeur.
EffectGame
C'est un
ObjectGame
étendu, déjà spécialisé dans la création d'effets, tels que les explosions et les trainées de fumée (par exemple). Il contient également une architecture minimaliste, et supporte la localisation.
EntityGame
C'est la principale version étendue d'un
ObjectGame
, spécialisé pour des objets plus complexes, supportant la gravité et la collision. Il fournit également un calcul simple de distance avec une autre entité.
ProjectileGame
C'est un
ObjectGame
étendu, dédié pour les projectiles, lancés depuis unLauncherProjectileGame
. Il fournit une architecture avancée, permettant de personnaliser son mouvement et sa cible.
La FactoryObjectGame
La FactoryObjectGame
améliore la FactoryGame
en créant des objets typés de manière générique.
De plus, l'implémentation de la factory est plus facile, puisque le Media
de configuration est déjà fourni
par le type d'objet.
Un seul et unique argument doit être utilisé, le SetupGame
.
Comme nous avons utilisé l'implémentation par défaut, tous les objets qui peuvent êtres créés par la factory doivent
être dans le dossier "factory/"
. Vous pouvez surcharger createSetup(...)
en la rendant
plus complexe afin de gérer plusieurs dossiers. Si vous ne souhaitez pas utiliser le système de réflexion, vous
pouvez définir votre propre méthode create()
en utilisant un switch classique avec appel direct des
constructeurs des classes cibles de chaque type.
Il est maintenant possible de créer des instances de chaque type, sans réaliser de cast. Assurez-vous juste de garantir la relation entre le type et sa classe cible. Le cas contraire, vous aurez une erreur lors de la création.
L'HandlerObjectGame
permet de gérer plusieurs objets, dans le but de les mettre à jour et de les afficher.
Il est possible d'ajouter et de supprimer des objets à n'importe quel moment. Les changements seront effectifs à la fin
des opérations du gestionnaire.
Vous pouvez maintenant mettre à jour une série d'objet, et les afficher. Les nouveaux objets peuvent êtres ajoutés à n'importe quel moment.
Un effet est une représentation d'objet spécialement dédiée pour améliorer le rendu du jeu.
Il est conçu pour être déclenché lors d'un évènement particulier, comme l'explosion d'une entité, ou pour représenter ses trainées. Cet objet n'est pas sensé avoir une existence prolongée.
Il est fortement recommandé de comprendre comment marche le système de fabrique et de gestionnaire !
Vous pouvez maintenant voir le système d'effet en action. Le but d'un effet est d'être déclenché lors d'un évènement particulier, comme la mort d'une entité, la fumée d'un projectile...
Le système de projectile représente deux composants principaux:
Le lanceur est un objet spécifique (LauncherProjectileGame
) capable de lancer un ProjectileGame
à une fréquence donnée, vers une cible fixe ou mobile.
Le projectile est un objet (ProjectileGame
) lancé par un LauncherProjectileGame
, avec une routine de mise à jour et de rendu autonome, avec une trajectoire adaptable.
Ce système inclut également un HandlerProjectileGame
prêt à l'emploi, qui va mettre à jour et afficher tous les projectiles actifs.
Il est fortement recommandé de comprendre comment marche le système de fabrique et de gestionnaire !
La manière dont l'entité est implémentée n'est pas important ici, étant donné que nous allons simplement montrer le système de projectile en action.
Le lanceur doit savoir avec quels objets il va fonctionner (projectile, lanceur et cible).
La fabrique va permettre au lanceur de créer les projectiles à partir de leur type énuméré. C'est un moyen très simple de définir comment ils seront lancés par le lanceur.
Cela va permettre de créer facilement un lanceur pour une entité.
La partie la plus importante concerne l'implémentation du mouvement, où vous pouvez définir sa trajectoire après avoir été lancé, et ce qu'il soit de passer en cas de contact.
Vous pouvez maintenant voir le système de projectile en action. Il est possible de créer un système plus complexe en permettant un système de changement d'arme, et créer un lanceur plus complexe avec différents projectiles.
Une map représente une composition de tile, où un tile est une image à une certaine position, incluant des informations additionnelles telles que la collision. Les images des tiles sont stockées sous forme de tilesheet.
La taille du tile détermine la taille finale de la map, car cette dernière connait son nombre de tile et ses positions.
C'est ici que sont définis les différents types de collision (comme le sol, les pentes...)
La map est responsable de la création des tiles, et est également capable de générer les collision depuis un fichier externe. Une minimap peut aussi être générée à tout moment.
Vous pouvez maintenant voir le système de map en action.
Le WorldGame
est utilisé comme conteneur de jeu principal, plutôt que la Sequence
, car il supporte des
opérations de chargement et de sauvegarde de monde. Son principal objectif est de gérer la logique du jeu, dont l'ordre
de mise à jour et de rendu. Avec une telle classe, la Sequence
est seulement utilisée pour charger un WorldGame
,
le mettre à jour et l'afficher, rien de plus.
Pour montrer les principales caractéristiques, le monde sauvegardera une simple chaine, et la chargera. Il affichera également la chaine chargée à l'écran.
Le seul objet géré par la scène est le monde, en appelant save & load
juste pour montrer le fonctionnement de
base.
Comme vous pouvez le voir, c'est très basique. Mais dès lors que vous ajouterez plus d'éléments (tels que la Map,
Handler
...), il sera plus facile de définir la sauvegarde et le chargement du monde, étant donné que chaque objet
complexe peut être sauvegardé et chargé facilement (MapTile
possède déjà ce type de fonction). Vous
pouvez également implémenter différentes versions d'un monde, et en sélectionner un depuis la Sequence
,
sans rien changer d'autre.
Lire la suite: Jeux de plateforme