Contents |
Système d'entité
Dans cette section, sont décrites et expliquées les idées de bases et les détails derrière CEL.
Que sont les Entités
Tout objet dans un jeu est représenté par une entité. Le système d'entité permet aux programmeur de jeu (utilisant CEL) de dialoguer avec les objets du jeu de façon cohérente. Voici des exemples d'entités : le personnage joueur, le monde lui-même, les créatures, une bougie, des objets en général, des articles, ... Il est important de noter que les entités ne représentent pas obligatorement des objets visuels. Une entité peut être une partie du scénario (ex: une quête) que le joueur doit résoudre.
Deux couches
CEL fournit une Couche Physique (Physical Layer) pour s'interfacer avec Crystal Space et pour les calculs complexes (physique, pesanteur, ...), et une Couche Comportement (Behaviour Layer) pour s'occuper des fonctionnalités de jeu à haut-niveau (logique de jeu), en utilisant la Couche Physique comme son API de niveau inférieur comme approprié.
Les Classes de Propriété de la Couche Physique sont mises en oeuvre pour manipuler un nombre significatif de tâches laborieuses et pour manipuler toutes interactions directes avec des objets de jeu Crystal Space, tel que des meshes, des caméras, des entrées clavier, et bien d'autres.
Les Classes de la Couche Comportement manipuleront la logique de jeu, la stratégie, le traitement d'évènements, etc. en appelant les Classes de Propriété suivant les besoins (et ainsi obtenir des évènements de la part des Classes de Propriété) et ne devraient jamais avoir besoin d'appeler directement des structures Crystal Space (bien que ce soit toujours possible voire indispensable dans certains cas).
Voici une autre façon de voir :
- Couche Physique : Cette couche contrôle la mécanique du jeu. Elle contrôle les contraintes physiques que les entités ont, en interagissant avec le monde et d'autres entités. Pour ce faire, on utilise les Classes de Propriété (voir plus bas). La Couche Physique possède aussi la notion d'évènements ou de messages. La Couche Physique est écrite en C++.
- Couche Comportement : Cette couche contrôle la façon dont les entités se comportent avec les contraintes mises en avant par la Couche Physique. Cette couche est responsable de la construction d'évènements ou de messages de la Couche Physique. Une grande partie de la Couche Comportement peut être écrite dans un langage de script (comme Python) puisque c'est l'aspect le plus dynamique du système d'entité. A noter que la Couche Comportement peut être écrite en Python ou en C++. Python est complètement optionnel.
En plus de ces deux couches, il existe également une bibliothèque de Classes de Propriété générales qui sont très utiles pour la plupart des jeux.
Classes de Propriété
Un des concepts les plus important dans CEL est la notion de Classes de Propriété. Attachée à chaque entité, nous avons une liste de Classes de Propriété. Une Classe de Propriété décrit une partie spécifique du comportement ou un ensemble d'attributs pour une entité. L'ensemble des Classes de Propriété définit ce qu'est réellement l'entité. Ceci deviendra plus clair si nous exposons une liste des Classes de Propriété courantes mises en oeuvre :
Ce sont essentiellement des parties de codes (comme des classes en C++) que vous pouvez lier à des entités. Ils peuvent envoyer des messages.
- pcworld.region : Une région représente une zone dans le moteur Crystal Space. Elle contient d'habitude des secteurs avec leur géométrie bien qu'il soit possible de créer des régions contenant uniquement des fabriques de mesh ou des matériaux.
- pcworld.zonemanager : Le gestionnaire de zône est une version plus puissante de pcregion. Il supporte le chargement dynamique pour les mondes imposants.
- pccamera.standard : Une caméra représente ce que le joueur voit sur son écran. Une caméra est habituellement en mode première personne ou troisième personne.
- pcinput.standard : Cette Classe de Propriété représente les entrées d'un clavier, d'une souris, d'un joystick. Une entité qui possède cette Classe de Propriété, recevra des messages lorsqu'une entrée sera générée.
- pctools.inventory : La Classe de Propriété inventaire contient un ensemble d'autres entités. Une entité qui possède cette Classe de Propriété est capable de contenir d'autres entités. Cette Classe de Propriété peut avoir plusieurs attributs qui mettent une limite à ce que l'inventaire peut contenir. La Classe de Propriété pctools.inventory.characteristics est utilisée pour définir des limites aux entités (voir plus bas). Les limites usuelles sont le poids, la taille, le nombre d'emplacement de l'inventaire, ... mais le système n'est pas limité à ceux-ci. Le système est hiérarchisé. Par exemple, une entité boite peut avoir un inventaire pour que vous puissiez mettre des objets dans cette boite. Si le joueur ramasse la boite, alors la boite incluant le contenu sera dans l'inventaire du joueur. Tous les objets dans le monde (excepté le monde lui-même) appartiennent à un inventaire. Ceci pour éviter des références pendantes (dangling references ?). Le système d'inventaire s'évertue à s'assurer que la capacité maximale à l'intérieur ne soit pas dépassée. Ceci fonctionne également pour des inventaires emboités, par exemple si le joueur transporte une boite et que le poids de cette boite plus son contenu soit proche de la limite que le joueur puisse porter, alors vous ne pourrez pas ajouter un autre article dans la boite.
- pctools.inventory.characteristics : Cette Classe de Propriété définit les caractéristiques qu'un certain objet possède en relation avec le système d'inventaire. Par exemple, avec cette Classe de Propriété, vous pouvez dire que le poids d'une entité est de 10.
- pcobject.mesh : Cette Classe de Propriété représente un mesh pour le moteur Crystal Space. A utiliser si vous désirez une représentation visuelle d'une entité.
- pcobject.mesh.select : Si vous voulez que cette entité reçoive des messsages lorsque d'autres meshes (ou ce même mesh) sont sélectionnés, vous pouvez employer cette Classe de Propriété. Elle est très configurable et vous permet même de tirer des objets le long d'un plan 3D. (even allows you to drag objects along a 3D plane ?)
- pcmove.solid : Si votre mesh possède une représentation solide qui nécessite d'être utilisé pour la détection de collision ou les physiques, alors il se doit de posséder cette Classe de Propriété.
- pcmove.linear : C'est le système de déplacement. Si vous voulez une entité qui puisse se déplacer, posséder une détection de collision appropriée, et la pesanteur alors vous devrez utiliser cette Classe de Propriété.
- pcmove.actor.analog et pcmove.actor.standard : Ce sont des Classes de Propriété qui peuvent être utilisées pour l'acteur principal. Elles aident à la synchronisation de la caméra, du système de mouvement et de l'animation du modèle. La première permet des mouvements multi-directionnels comme dans les jeux de plateforme ou les jeux d'action, alors que la seconde permet l'utilisation de mouvements avance/recul et rotation qui sont très utiles dans certains cas.
- pc2d.tooltip : C'est une Classe de Propriété générale qui vous permet d'avoir des infobulles. Dans certains jeux c'est très utile pour montrer des informations sur l'acteur sur lequel s'est arrêté le curseur.
- pctools.timer : Utilisez cette Classe de Propriété pour recevoir des messages quand une durée spécifique s'est écoulée. Peut également se répéter.
- pctools.properties : C'est une Classe de Propriété générale pour stocker des propriétés dans une entité. Ces propriétés ne sont de toutes façons pas utilisées. C'est une manière simple d'associer des données à une entité.
- pclogic.spawn : Une Classe de Propriété qui représente un point de génération où des créatures (ou d'autres entités) peuvent être créées.
- pclogic.trigger : Une Classe de Propriété qui envoit des messages au comportement dès qu'une autre entité entre dans la zone de déclenchement. Peut être très utile pour des portes qui s'ouvrent quand un personnage joueur s'approche ou autre chose.
- pc2d.billboard : Elle peut être utilisée pour des images en 2D par dessus le monde 3D ou même pour faire des jeux entièrement en 2D.
- pclogic.quest : C'est un système de quêtes général mais très puissant qui utilise une machine à état. Ce n'est pas uniquement utilisable par des jeux de rôle mais aussi pour des jeux de tir où une quête peut être aussi simple que : le joueur appuie sur le bouton → la lumière s'allume.
- pcmove.pathfinder: La recherche de chemin (pathfinder) peut être utilisée par des créatures qui doivent trouver comment se rendre à certains endroits à travers la carte. Cette Classe de Propriété travaille de concert avec pcmove.steer de façon à déplacer l'entité jusqu'à atteindre la destination. Cette Classe de Propriété génère ainsi des évènements quand cette destination est atteinte ou lorsque celle-ci ne le peut pas pour certaines raisons.
- et plus encore...
Plusieurs autres Classes de Propriété sont prévues telles que :
- pclocator : La balise est utilisée pour maintenir la position d'une autre entité. Il peut y avoir de multiples instances de la balise liées à une entité, si cette entité est comprise dans plus d'une entité. Lorsqu'une balise est liée à une entité, l'entité recevra des évènements lorsque les autres entités se déplaceront, deviendront visibles/invisibles, ou seront détruites. Seul ce dernier évènement est immédiat. Les autres sont uniquement calculés toutes les secondes (par défaut, c'est configurable pour chaque balise). La balise est très utile en combinaison avec la classe pcpathfinder précédente.
Ce n'est qu'un début. D'autres Classes de Propriété suivront au fur et à mesure que le système de jeu s'affinera. Le système de Classes de Propriété est un système très dynamique et flexible qui nous permet de modifier dynamiquement des propriétés d'entités à la volée. Il est possible d'ajouter ou de retirer chacune des Classes de Propriété ci-dessus à chaque instant. C'est une chose très difficile à faire si nous avions utilisé le système d'entité basé sur le traditionnel héritage.
Les Classes de Propriété sont créées par obtention de leur fabrique de Classe de Propriété. Celles-ci sont habituellement mises en oeuvre dans un plugin. Vous chargez le plugin au démarrage de votre jeu et vous pouvez créer des Classes de Propriété pour vos entités à partir de ce plugin lorsque vous en avez besoin.
La Couche Physique
Comme expliqué ci-dessus, la Couche Physique décrit les contraintes sur des interactions entre les entités, et donc des contraintes sur ce que peut faire une entité. L'idée est que vous liez des Classes de Propriété à une entité. Chaque Classe de Propriété définit des attributs ou contraintes physiques spécifiques pour une entité. L'ensemble de toutes les Classes de Propriété liées à une entité définit ce que l'entité est réellement. Les Classes de Propriété peuvent être ajoutées ou retirées dynamiquement à partir d'une entité donnée. Habituellement, c'est la Couche Comportement qui s'en occupe.
Une note importante à propos de ce système d'entité est qu'habituellement on ne sous-classe pas les entités. Il n'existe qu'un seul type d'entité et il est fournit par la Couche Physique. Pour contrôler le comportement des entités, on ajoute à la place des Classes de Propriété appropriées. Le noyau de CEL ne possède pas de mise en oeuvre de Classes de Propriété, mais fournit seulement des interfaces qui permettent à un jeu de créer des mise en oeuvre de Classe de Propriété. Mais CEL contient un ensemble de Classes de Propriété préfabriquées qui sont potentiellement utiles pour la plupart, voire tous les jeux.
La Couche Physique elle-même est divisée en plusieurs sous couches :
- Entity Manager : Le gestionnaire d'entité est responsable de la création et de la gestion des squelettes d'entités
- Message System : Le système de message permet aux Classes de Propriété d'envoyer des messages à la Couche Comportement.
- Property Class System : C'est ici que sont gérées les Classes de Propriété.
- Persistence Layer : La couche de persistance est définie pour sauvegarder/charger des entités.
La Couche Comportement
La Couche Comportement fonctionnera avec la Couche Physique pour créer des entités, ajouter des Classes de Propriété, paramétrer un comportement, et réagir aux évènements ou messages des Classes de Propriété. Cette couche est souvent mise en oeuvre en utilisant un langage de script (mais ce n'est pas obligatoire).
Dans cette couche, le système d'entité basé sur l'héritage traditionnel peut être utilisé (mais c'est optionnel). Par exemple, on peut créer une entité créature qui soit responsable du paramétrage de toutes les Classes de Propriété appropriées pour des créatures. Le joueur peut (dans certains jeux) être également une créature et il serait alors une sous-classe de créature. Cette sous-classe peut alors définir des Classes de Propriété additionnelles qui soient utiles pour un joueur (comme une caméra ou un contrôle d'entrée clavier/souris/joystick). Si la Couche Comportement est écrite en Python alors le sous-classement Python peut être facilement utilisé;
Les évènements ou les messages sont employés pour communiquer de la Couche Physique à la Couche Comportement. La plupart des évènements sont générés par les Classes de Propriété qui sont liées à certaines entités et sont habituellement envoyés à la représentation de la Couche Comportement de cette entité. Si la Couche Comportement est écrite en Python (par exemple), alors tous les évènements pourront correspondre à une méthode Python dans le script correspondant à cette entité.
Le tableau suivant liste tous les messages habituels groupés par Classe de Propriété suivant laquelle ils sont générés (à partir de la liste d'exemple de Classes de Propriété ci-dessus) :
- pcinventory_addchild : Une entité est ajoutée à l'inventaire contenu à l'intérieur de cette entité.
- pcinventory_removechild : Une entité est retirée à l'inventaire contenu à l'intérieur de cette entité.
- pcinventory_added : Cette entité est ajoutée à un autre inventaire.
- pcinventory_removed : Cette entité est retirée d'un autre inventaire.
- pcmeshsel_down : Mouse down on a mesh (selection).
- pcmeshsel_up : Mouse up on a mesh.
- pcmeshsel_move : Mouse move for a mesh.
- pctimer_wakeup : Evènement d'un temporisateur de réveil.
- pcproperties_setproperty : La propriété a été définie.
- pcproperties_clearproperty : La propriété a été effacée.
- pccommandinput_...1 : La commande spécifiée a été activée (Par exemple : la touche associée à la commande est enfoncée).
- pccommandinput_...0 : La commande spécifiée a été désactivée (Par exemple : la touche associée à la commande est relâchée).
- et plus encore...
Bien sûr, plus d'évènements suivront. Ce n'est qu'un début.
La Couche Persistance
La Couche Persistance de CEL permet aux jeux de sauvegarder et charger les états des entités. Dans un jeu en solo, ce peut être utilisé pour sauvegarder l'état actuel du jeu, ainsi le joueur peut recharger le jeu plus tard. Dans un jeu en multi-joueur, ce peut être utilisé dans des scénarios plus contrôlés pour qu'une partie du monde persiste dans un cache ou sur le réseau. Il existe actuellement deux Couches Persistance : classique (utilisant une sortie binaire) ou XML.
Langue:
English •
Brazilian •
Chinese •
Deutsch •
Español •
Esperanto •
Français •
Magyar
Translate this page