tag:linuxfr.org,2005:/users/jlgrallLinuxFr.org : les contenus de jlgrall2013-03-25T14:06:15+01:00/favicon.pngtag:linuxfr.org,2005:Diary/337422013-03-14T22:29:38+01:002013-03-14T22:29:38+01:00entity.JS - un "Entity System" en JavaScriptLicence CC By‑SA http://creativecommons.org/licenses/by-sa/3.0/deed.fr<h2 id="sommaire">Sommaire</h2>
<ul><li>
<a href="#toc_0">Entity System</a>
</li>
<li>
<a href="#toc_1">entity.JS</a>
</li>
</ul><p>J'ai commencé un "Entity component system" en JavaScript. Il s'agit d'une architecture logicielle non orientée objets, plus flexible pour créer des jeux. Plusieurs grands jeux multijoueurs en ligne qui sont sortis ces dernières années utilisent au moins en partie cette architecture (Battlefield 3, Tony Hawk Pro Skater).</p>
<h2 id="toc_0">Entity System</h2>
<p>On pourrait traduire "Entity component system" en français par "Entité composant système". Personnellement j'utilise le raccourci ES pour "Entity System", que j'ai souvent rencontré.</p>
<p>D'un point de vue architecture, ce qui est important dans un ES ce sont les entités, les composants et les systèmes.</p>
<p>Les composants sont les briques de base. Ils représentent un aspect d'une entité et contiennent les données correspondant à cet aspect. Les composants ne contiennent aucune logique de jeu, contrairement à la POO (Programmation Orientée Objets). Donc les méthodes des composants (s'il y en a) ne sont que de simple getters et setters, qui ne font aucune opération sur les données.<br />
En fait l'idée est de mettre la logique du jeu dans les systèmes. Le fait de découpler la logique de l'endroit où sont stockée les données supprime en grande partie la structuration de celles-ci, ce qui diminue la rigidité du jeu, permettant de plus facilement le modifier.<br />
Exemples de composants avec leur propriétés (données):<br />
- Position: peut avoir les propriétés x et y. Une méthode possible pourrait être setPosition(x, y)<br />
- Mobile: peut avoir les propriétés vitesse et direction.<br />
- Projectile peut avoir la propriété dégâts.</p>
<p>Plusieurs composants peuvent être liés entre eux pour former des entités. Il n'y a aucune restriction sur quels composants peuvent être liés ensemble, et de nouveaux composants peuvent être rajoutés ou supprimés à tout moment du jeu. Par exemple vous pouvez lier des composants de type Position, Mobile et Projectile pour faire un missile. Vous stockez la position du missile, sa vitesse, sa direction et combien de dégâts il causera dans ces composants. Il vous faudra peut-être aussi un composant indiquant quelle image utiliser pour l'affichage à l'écran, etc. Vous pouvez ajouter tous les composant que vous voulez. Cet ensemble de composants est ce qu'on appelle une entité.</p>
<p>Conceptuellement, une entité est une liste de composants. Rien de plus, rien de moins. (Pas de donnée, pas de logique de jeu non plus). Quelques exemple d'entités: un personnage, un missile, une arme, un objet, une ville, un paysage, une bulle de dialogue, etc.<br />
Les entités n'ont pas de type. Le "type" d'une entité est quelque chose de très fluide qui change en fonction de ses composants. Il est facile de faire voler un chien ou de zombifier n'importe quel personnage ou animal juste en rajoutant quelques composants. (Et si tout d'un coup vous pensez que ce serait bien dans votre jeu d'avoir des maisons zombifiées, vous n'êtes pas obligé de changer toute la structure du code de votre maison. Il suffit de rajouter quelques composants)</p>
<p>La logique du jeu se trouve dans les systèmes. Mais tout n'est pas mélangé. On compartimente par "aspects". Chaque système ne traite qu'un certain type de composants. Par exemple un système Déplacements va chercher tous les composants Position et Mobile, puis modifier la position en fonction de la vitesse et de la direction. Cela se fait en cherchant parmi toutes les entités du jeu, celles qui lient un composant Position et un composant Mobile, et en traitant ces deux composants. Un système ne s'intéresse donc qu'a un nombre restreint de type de composants et ne se demande pas si l'entité qui possède ces composants est un missile, un chien ou une maison.</p>
<p>Le comportement et l'aspect des objets du jeux est défini par les composants qu'il possède. Les comportements sont codés dans des systèmes différents qui sont exécutés en boucle en cour de jeu. La plupart des systèmes sont indépendants, ce qui permet de facilement les paralléliser, d'en ajouter, d'en modifier, etc..</p>
<p>En fait si on compare, en programmation OOP on a les données et les logiques dans les entités (les objets). Avec un ES on vide les entités en mettant les données dans les composants et les logiques dans les systèmes. D'ailleurs plusieurs implémentations d'ES représentent une entité uniquement par son numéro (et non par un objet), et chaque composant enregistre le numéro de l'entité à laquelle il est associé.</p>
<p>Je ne vais pas entrer plus en détails sur les avantages et les inconvénients des ES. Mon but est juste d'introduire les concepts de base pour ceux qui ne connaissent pas, car les informations disponibles sur le web sont toutes en anglais. Mais si vous avez d'autres sources d'informations je serai ravi de les connaître.</p>
<p>Pour aller plus loin:<br />
Un article bien fait pour commencer et qui permet de comprendre les avantages des ES étapes par étapes: <a href="http://www.richardlord.net/blog/what-is-an-entity-framework">http://www.richardlord.net/blog/what-is-an-entity-framework</a><br />
Un wiki central sur les ES avec toutes les informations disponibles: <a href="http://entity-systems.wikidot.com/">http://entity-systems.wikidot.com/</a></p>
<h2 id="toc_1">entity.JS</h2>
<p>Ca c'est le projet. Un ES (Entity System) en JavaScript plutôt orienté rapidité et efficacité. La licence sera la licence MIT.</p>
<p>Pour l'instant, il n'y a pas de code. Le but c'est de faire l'API en premier et ensuite de faire le code. Le premier brouillon de l'API se trouve ici: <a href="http://lite.framapad.org/p/Wbo5sHqiD2">http://lite.framapad.org/p/Wbo5sHqiD2</a></p>
<p>Voilà, ça m'a pris pas mal de temps pour faire ce premier brouillon, et je cherche à avoir des retours. Je voudrais aussi savoir qui est intéressé par ce concept. Et qui voudrait participer ou suivre le développement. C'est encore le tout début du projet, donc il y a déjà des idées, mais rien n'est encore complètement défini. Si cela vous intéresse, contactez-moi à travers linuxfr.org, ou laissez un commentaire. J'avertis juste que le développement se fera en anglais.</p>
<p>Voici un peu ce qu'il est prévu de faire (pas forcément dans cet ordre, et ça va dépendre de mon temps libre):<br />
- recevoir des retours sur l'API, discuter, modifier (ou pas :P )<br />
- finir d'écrire le brouillon contenant les lignes directrices de l'implémentation de l'API (comment organiser les données, lister les optimisations possibles, expliquer certains choix de l'API)<br />
- ré-écrire le brouillon de l'API au propre avec des couleurs, un formatage correct et des exemples de code<br />
- d'ici 2-3 semaines (c'est toujours plus long que ce qu'on prévoit…): commencer l'implémentation de l'API<br />
- ouvrir un repo sur github, y mettre l'API et le code</p>
<p>En plus du projet entity.JS, il y a le projet de faire un framework de jeu basé sur entity.JS et Node.js et qui pourra supporter canvas et webgl ainsi que tout ce qui peut être utile dans un jeu. Cela n'est pas toujours évident. Par exemple les moteurs de rendu webgl s'attendent à des données structurées sous une forme OOP, ce qui demande soit de modifier une bonne partie du moteur, soit de faire un pont entre les 2 structures de données (généralement aux dépends des performances). Je suis en discussion avec un développeur de moteur de rendu webgl 2D, mais mes connaissances dans ce domaines sont minces (1 projet OpenGL basique en Java il y a quelques années). Donc si d'autres personnes sont intéressées, elles sont les bienvenues.</p>
<p>Si vous avez des questions, n'hésitez pas. J'essaierai de répondre au mieux.</p><div><a href="https://linuxfr.org/users/jlgrall/journaux/entity-js-un-entity-system-en-javascript.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/97682/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/jlgrall/journaux/entity-js-un-entity-system-en-javascript#comments">ouvrir dans le navigateur</a>
</p>
jlgrallhttps://linuxfr.org/nodes/97682/comments.atom