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...