Définition de ses propres types d'entités statiques

Pour créer ses propres types d'entités, il suffit d'hériter de la classe odfaeg::graphic::GameObject.
Il y a quelque méthodes à redéfinir :
opérator==(Entity* other), celui ci compare deux entités, ceci évite d'ajouter deux entités identique dans le gestionnaire
d'entités.
isAnimated() : méthode qui doit renvoyer true si l'entité est animée, false sinon.
isModel() : méthode qui doit renvoyer true si l'entité est un modèle, false si l'entité est un sol.
selectable() : méthode qui doit renvoyer true si l'entité peut être sélectionnée, sinon false.
isLight() : méthode qui doit renvoyer true si l'entité est une lumière.
isShadow() : méthode qui doit renvoyer true si l'entité est une ombre.
isLeaf() : méthode qui doit renvoyer true si l'entité ne possède pas d'entités enfants.

Il y a également quelque méthodes que vous pouvez redéfinir vous même, les voici :
onDraw(RenderTarget &target, RenderStates states) : méthode à redéfinir pour dessiner l'entité.
onMove(math::Vec3f& t) : méthode à redéfinir si l'on doit mettre à jour des données lors du déplacement de l'entité.
onScale(math::Vec3f& s) : méthode à redéfinir si l'on doit mettre à jour des données lors du changement d'échelle de l'entité.
onRotate(float angle) : méthode à redéfinir si l'on doit mettre à jour des données lors de la rotation d'entité.

Définition de ses propres types d'entités dynamique.

Les méthodes à redéfinir sont différentes que ci-dessus, les entités animées ne peuvent pas être une lumière,
ni une ombre, ni une feuille, ni un modèle.
Celà n'empêche pas qu'une entités animée puisse contenir des frames de lumières si l'on souhaîte par exemple faire des
lumières dynamiques.
Une animation n'est rien d'autre qu'une entité spéciale possédant plusieurs entités enfant, qui sont les frames de l'animation.
Les seules méthode à redéfinir sont donc selectable.
Pour redéfinir une entité animée (par exemple un personnage), vous pouvez hériter de la classe BoneAnimation.
L'avantage d'hériter de la classe BoneAnimation est que vous pouvez sélectionner une animation qui sera affichée par rapport à une série d'animations.
Pour celà il suffit d'appeler la méthode setBoneAnimationIndex de la classe BoneAnimation. Par exemple si vous avez 8 animations suivant la direction avec laquelle le personnage se déplace, il suffit de faire ceci :
Les méthodes play et stop permettent de jouer et d'arrêter l'animation, play prend un paramètre booléen qui indique si l'animation doit être jouer en boucle.


    void Caracter::setDir (Vec2f dir) {
        float angleRadians = dir.getAngleBetween(Vec2f::yAxis);
        int angle = Math::toDegrees(angleRadians);
        unsigned int previousAnimIndex = currentAnimIndex;
        //Sud
        if (angle >= -10 && angle <= 10)
            currentAnimIndex = 4;
        //Sud ouest
        else if (angle > -80 && angle < -10)
            currentAnimIndex = 6;
        //Ouest
        else if (angle >= -100 && angle <= -80)
            currentAnimIndex = 7;
        //Nord ouest
        else if (angle > -170 && angle < -100)
            currentAnimIndex = 3;
        //Nors est
        else if (angle > 100 && angle < 170)
            currentAnimIndex = 2;
        //Est
        else if (angle >= 80 && angle <= 100)
            currentAnimIndex = 0;
        //Sud est
        else if (angle > 10 && angle < 80)
            currentAnimIndex = 5;
        //Nord
        else
            currentAnimIndex = 1;
        this->dir = dir;
        if (moving && previousAnimIndex != currentAnimIndex) {
            anims[baseAnimIndex + previousAnimIndex]->stop();
            anims[baseAnimIndex + currentAnimIndex]->play(true);
            BoneAnimation::setBoneAnimationIndex(baseAnimIndex + currentAnimIndex);
        }

    }
  
Pour que celà fonctione vous devez appelé la méthode setBoneIndex de la classe entity et ajouté un index pour chaque animation du personnage.
for (unsigned int i = 0; i < 8; i++) {
            Anim* animation = entityFactory.make_entity(0.1f, Vec3f(-25, -50, 0), Vec3f(50, 100, 0), entityFactory);
            for (unsigned int j = 0; j < 8; j++) {
                sf::IntRect textRect (textRectX, textRectY, textRectWidth, textRectHeight);
                Tile *tile = entityFactory.make_entity(text, Vec3f(-25, -50, 0), Vec3f(textRectWidth, textRectHeight, 0), textRect, entityFactory);
                tile->setLayer(1);
                tile->getFace(0)->getMaterial().setTexId("VLADSWORD");
                g2d::Decor *frame = entityFactory.make_entity(tile, &g2d::AmbientLight::getAmbientLight(), entityFactory);
                frame->setShadowCenter(Vec3f(0, 200, 200));
                textRectX += textRectWidth;
                if (textRectX >= textWidth) {
                    textRectX = 0;
                    textRectY += textRectHeight;
                }
                animation->addFrame(frame);
            }
            animation->getCurrentFrame()->setBoneIndex(i);
            caracter->addAnimation(animation);
            au->addAnim(animation);
        }
Il y a une nouvelle méthode à redéfinir : getCurrentFrame(), cette méthode renvoie l'animation courante.
Comme pour les entités on peut bien sûr redéfinir les méthodes onMove, onScale, etc...