-
Bonjour à tous,
j'ai réussi à faire une animation avec un sprite, cependant celle-ci va à 3000 à l'heure(pas dans le déplacement du sprite, mais dans la lecture du sprite), il y a un moyen de limiter le vitesse de l'animation?
mon code pour l'animation :
sf::Texture perso;
sf::Sprite sprite_perso;
enum Dir{Down, Left, Right, Up};
sf::Vector2i anim(1, Down);
bool updateFPS =true;
Main {...
//Chargement de la texture
if (!perso.loadFromFile("player.png"))
{
std::cout << "Erreur chargement perso" ;
}
sprite_perso.setTexture(perso);
anim.x++;
if(anim.x *32 >= perso.getSize().x)
{
anim.x = 0;
}
sprite_perso.setTextureRect(sf::IntRect(anim.x * 32, anim.y * 32, 32, 32));
window.draw(sprite_perso);
}
Merci d'avance
BIOoOAG
-
Bah ouai, au lieu de faire anim.x++ à chaque frame, fais le juste quand un certain temps est écoulé. ;)
-
ahhhh, oki, bon je vais essayer de le faire ça! :D merci
-
Re,
alors j'ai essayé avec les clock, mais c'est trop "aléatoire", car je le mets dans ma boucle while window is open en gros,
je cherche du coup comment savoir le frame rate, je n'ai pas trouvé de getFramerate, une idée, mais ça sera aussi "aléatoire",
Vous aurez un moyen de déclancher les phases de l'animation quand on veut de façon fixe?
Merci d'avance!
-
Pour calculer le frame rate, c'est le dernier code dans le tutoriel : http://www.sfml-dev.org/tutorials/2.1/system-time-fr.php
Le framerate (fps) c'est l'inverse du temps (en secondes) écoulé en une frame.
Comment ça aléatoire ?
Comment ça "de façon fixe" ?
Sinon dans le wiki y'a des exemples de classes d'animations, ça peut aider à faire la tienne. (ou à utiliser la leur)
-
salut 8)
lis attentivement ce bout de code
float image_count= 0, image_change= 100, image_v= 500;
sf::Clock clock;
image_count+= image_v* clock.restart().asSeconds();
if(image_count>= image_change){
image_count= 0;
//source.x++;
if((source.x * 32) >= pTexture.getSize().x)
source.x = 0;
}
on variant le image_v on peut ralentir ou accélérer , c'et ce qu'on a appelle un facteur de temps
-
Ok, merci je vais essayer ta méthode. Et voir ce que ça donne!
-
Re, j'ai pu y toucher un peu ce soir et de changer image_v ne change rien mon perso à toujours une anim à 3000 à l'heure!
Je vous donne mon code, si vous pouvez m'aider.
sf::Texture perso;
sf::Sprite sprite_perso;
enum Dir{Down, Left, Right, Up};
sf::Vector2i anim(1, Down);
bool updateFPS =true;
Main{...
sf::Clock time;
float fpsCount = 0,
switchFps = 100,
fpsSpeed = 500;
// J'ai un peu allégé le code.
//Chargement de la texture
if (!perso.loadFromFile("player.png"))
{
std::cout << "Erreur chargement perso" ;
}
sprite_perso.setTexture(perso);
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
if (updateFPS)
{
fpsCount += fpsSpeed * time.restart().asSeconds();
std::cout << fpsCount;
}
else
fpsCount = 0;
if (fpsCount >= switchFps)
{
anim.x++;
// getSize().x donne la largeur de la texture
if(anim.x *32 >= perso.getSize().x)
{
anim.x = 0;
}
}
sprite_perso.setTextureRect(sf::IntRect(anim.x * 32, anim.y * 32, 32, 32));
window.draw(sprite_perso);
}
Merci d'avance.
-
Faut que tu remettes fpsCount à 0 de temps en temps. Genre quand ton animation "avance". ;)
T'as même mis un cout de fpsCount donc t'aurais pu remarquer qu'une fois > switchFps il l'était tout le temps.