Bienvenue, Invité. Merci de vous connecter ou de vous inscrire. Avez-vous oublié d'activer ?

Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.


Messages - Dono

Pages: [1]
1
Discussions générales / Re : Blog de développement - sfml
« le: Septembre 13, 2012, 11:46:21 pm »
Salut,

Je me présente vite fait, je travaille sur un "moteur de jeu" multi-plateformes : une sorte de SFML mais compatible IOS/Android/Windows phone, je compte d'ailleurs mettre en place le principe de l'entity-system dans mon "moteur". Plus d'informations au sujet du moteur ici.

Je suis tombé sur ton blog l'autre jour et l'article sur l'entity system est très interessant. Du coup je me suis aussi penché sur cette architecture et après de nombreuses lectures d'articles, je pense avoir correctement saisie le principe c'est pourquoi je pense qu'une approche commune pourrait nous permettre d'obtenir un résultat plus interessant, certains points étant encore obscurs à mes yeux :).

Je me suis penché sur les sources de ton projet et j'ai relevé quelques détails qui ont attirés mon attention :
  • Il manque la classe System dans les sources c'est normal ?;
  • Une entité possède un ensemble de composants et de systèmes, cela va à l'encontre de l'Entity System;
  • Le nom des System et l'ID des Component sont des chaines pas terrible la comparaison de chaines niveau performances du coup;
(Il y a peut être d'autres choses j'ai parcouru les sources assez vite)

Maintenant que j'ai soulevé certains points voici ce que j'ai de mon côté (je vire tout les commentaires) :

Entity :

class Entity
{
public:
    Entity( World& world );
    void addComponent( Component* component );

private:
    World* world;
};
 

Rien de bien interessant concernant cette classe, elle ne contient rien, passons à la classe Component :

Component :

class Component
{
public:
        Component();
        static Bitset key() const;

private:
       Entity* parent;

};

Comme tu peux le voir un composant dispose d'une méthode statique contenant une "clé" (Bitset = Sur-couche perso au type std::bitset). Cette clé est un nombre binaire unique : Mon objectif est d'avoir une clé unique par type de Component.

Cela va me permettre d'identifier un Component de façon très rapide mais aussi retrouver les types de Component utilisé par un System.

Je compte ainsi calculer le masque binaire d'un System en indiquant lors de son initialisation le type de Component que mon System utilise à l'aide d'une "formule" assez simple :

Exemple :
J'ai un System : SpriteRenderer qui a besoin de deux Components pour fonctionner : SpriteComponent et TransformableComponent (position, rotation, scale, ...). Lors de l'initialisation de mon SpriteRenderer je vais calculer son masque en faisant : mask = SpriteComponent::key() | TransformableComponent::key();
Je peux ainsi savoir si une entité est traité par un System en faisant quelque chose du genre if ( entity.getComponentsKey() == system.mask) mais aussi savoir si une entité à le Component Transformable à l'aide d'un OU logique.

System :
Un System contient une liste de Component sur lequel le system travaille.
Les Component sont ajoutés aux System adéquat lors du "AddComponent" (grace à sa clé on sait si le composant en question doit insérer une reference dans tel ou tel System). (Un System n'a pas besoin de connaitre une entity)

World :
La classe World contient la liste des Component, la liste des System et la liste des Entity.

Je pense avoir fait le tour de l'architecture que je compte mettre en place, je ne vois pas l'utilité de connaitre les Component d'une Entity à part lors ce que l'on souhaite supprimer une Entity (On supprime donc ses Components liés).

Voilà :).
(Désolé pour le pavé)

Pages: [1]