Bonsoir,
Je suis actuellement sur un projet où beaucoup d’entités seront animées.
Une animation comporterait ces propriétés :
class Animation
{
public:
Animation();
void Draw(sf::RenderWindow& window)
{
window.draw(sprites[cursor]);
}
void Update();
protected:
std::vector<sf::Sprite> sprites;
int cursor;
}
l'idée étant de faire varier le cursor selon une sf::clock.
Première question, cette architecture vous parait elle viable ?
Secondement, sachant que je risque d'avoir de nombreux items identiques au même moment à l'écran, vaut il mieux passer une reference vers le vector de sprites l'animation aux entités ? ce qui éviterait de créer n copie des mêmes sprites.
Concrètement, un sf::Sprite utilise t'il beaucoup de mémoire ?
J'espère avoir été clair sur mes interrogations (notamment sur la deuxième partie).
D'avance merci pour votre aide qui m'est très précieuse et bonne soirée ;)
Salut,
J'aurais une question.
Est-il bien d'écrire ici :
Draw(sf::RenderWindow& window)
{
window.draw(sprites[cursor]);
}
Aussi j'aimerais savoir les raisons qui t'on poussé à ne pas écrire public:
car ça va passer en mode private:
Merci de me répondre ;)
C'est toujours bien d'apprendre des nouvelles choses grâces aux codes des autres :P
Bonsoir,
Merci de m'avoir répondu sinon moi je pense pas qu'il y a trop d'erreur mais il est étrange d'avoir deux constructeur :
Animation();
Draw(sf::RenderWindow& window)
{
window.draw(sprites[cursor]);
}
Update();
Sinon pour la première question c'est bon j'ai compris j'avais oublié un petit détail ^^
D'après ce que j'ai compris un sf::Sprite ne fait qu'utiliser une image, et c'est l'image (sf::Image) qui prends de la place et dont les modifications sont délicates, mais je pense qu'il vaut mieux tout de même passer par des références que par des copies dès qu'on s'éloigne des types du genre int, double, string, etc.
Après pour ce qui est de l'architecture ce n'est pas comme cela que j'aurais fait :
/*!
\class Animation
\brief gere les mecanismes des animations
*/
class Animation
{
public:
Animation(const sf::Clock*, sf::Sprite&, sf::Vector3f subrects);
Animation(const sf::Clock*, sf::Sprite&, sf::Vector3f subrects, int period);
Animation(const sf::Clock*, sf::Sprite&, sf::Vector3f subrects, sf::Vector2f pos);
Animation(const sf::Clock*, sf::Sprite&, sf::Vector3f subrects, sf::Vector2f pos, voidFnPtr startFn, voidFnPtr eachFn, voidFnPtr endFn);
Animation(const sf::Clock*, sf::Sprite&, sf::Vector3f subrects, sf::Vector2f pos, int period, voidFnPtr startFn, voidFnPtr eachFn, voidFnPtr endFn);
void test(); /*!< teste et actualise l'animation \warning a appeler a chaque actualisation de l'objet concerne */
void play(); /*!< lance l'animation */
void stop(); /*!< arrete l'animation */
bool isPlaying();
protected:
voidFnPtr m_startFn; /*!< fonction appelee a chaque debut d'animation */
voidFnPtr m_eachFn; /*!< fonction appelee a chaque periode de l'animation */
voidFnPtr m_endFn; /*!< fonction appelee a chaque fin d'animation */
sf::Sprite *m_spr; /*!< sprite subissant les modfifications */
sf::Vector3f m_subrects; /*!< x = largeur d'un cadre, y = longueur, z = nombre de cadres/phases */
sf::Vector2f m_pos; /*!< position dans le sprite du premier cadre */
int m_period; /*!< temps separant chaque phase */
int m_startTime; /*!< temps de départ */
bool m_playing; /*!< statut de l'animation */
const sf::Clock *m_clock;
};
Ce n'est pas du tout la même approche et je ne sais pas ce qui est le mieux, bonne réflexion :P.
PS : J'utilise des pointeurs sur fonction, voidFnPtr est un typedef.