Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Animation simple  (Lu 2252 fois)

0 Membres et 1 Invité sur ce sujet

2ant

  • Newbie
  • *
  • Messages: 17
    • Voir le profil
Animation simple
« le: Septembre 01, 2014, 02:35:15 pm »
Bonjour, je suis debutant en c++ et en sfml.

Je cherche à créer un T-rpg iso et pour l'instant je fais des test pour découvrir les possibilités de la sfml.

Je cherche à faire une animation simple : toute les 2 secondes un sprite change de texture.

Le sprite s'affiche bien mais ne change pas de texture.

J'aimerais de l'aide pour savoir pourquoi ce que j'ai fais ne fonctionne pas

Mon code:

#include <SFML/Graphics.hpp>

using namespace sf;

int main()
{
    sf::RenderWindow window(sf::VideoMode(1280, 720,32), "SFML works!");

    window.setVerticalSyncEnabled(true);

    sf::Color alpha(250,100,250);
    sf::Color fond (128,225,255,255);

    sf::Texture background;
        if (!background.loadFromFile("background.png"))
        return -1;
    sf::Sprite back;
        back.setTexture(background);


    sf::Image sniper1;
        if (!sniper1.loadFromFile("testamod.png"))
        return -1;
        sniper1.createMaskFromColor(alpha);

    sf::Texture snip1;
        if (!snip1.loadFromImage(sniper1,sf::IntRect(128,64, 64, 64)))
        return -1;

    sf::Sprite spritesnip1;
        spritesnip1.setTexture(snip1);
        spritesnip1.setPosition(sf::Vector2f(320, 80));



    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }

        sf::Clock clock;
                    sf::Time t2 = sf::seconds(2.0);
                    sf::Time t4 = sf::seconds(4.0);
                    sf::Time t6 = sf::seconds(6.0);
                    sf::Time t8 = sf::seconds(8.0);

                    sf::Time elapsed1 = clock.getElapsedTime();

                    if (elapsed1 > t2 && elapsed1 < t4)
                    {
                        snip1.loadFromImage(sniper1,sf::IntRect(196,64, 64, 64));
                    }

                    if (elapsed1 > t4 && elapsed1 < t6)
                    {
                        snip1.loadFromImage(sniper1,sf::IntRect(196,128, 64, 64));
                    }

                    if (elapsed1 > t6 && elapsed1 < t8)
                    {
                        snip1.loadFromImage(sniper1,sf::IntRect(128,64, 64, 64));
                    }
                    if (elapsed1 > t8)
                    {
                        clock.restart();
                    }

        window.clear(fond);
        window.draw(back);
        window.draw(spritesnip1);
        window.display();
    }

    return 0;
}

 

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : Animation simple
« Réponse #1 le: Septembre 01, 2014, 03:13:22 pm »
Si tu recrées ta clock à chaque tour de boucle le temps va pas trop avancer. ;)
Quand t'as un problème t'as le droit de regarder ce que valent tes variables, un coup d'oeil à la valeur d'elapsed1 suffit pour voir d'où ça vient.

2ant

  • Newbie
  • *
  • Messages: 17
    • Voir le profil
Re : Animation simple
« Réponse #2 le: Septembre 01, 2014, 05:40:57 pm »
Merci Point G  :D

J'ai déplacer clock , corrigé mes appels de textures et remis tout en ordre.

Je poste la solution avec des commentaires pour ceux que ça peux aider.

#include <SFML/Graphics.hpp>

using namespace sf;


int main()
{
    sf::RenderWindow window(sf::VideoMode(1280, 720,32), "SFML works!");// Crée une fençetre de 1280 par 720 en mode 32 bits nommée "SFML works!"

    window.setVerticalSyncEnabled(true);// Active la synchronisation verticale

    sf::Color alpha(250,100,250);//Crée une couleur ( rose )
    sf::Color fond (128,225,255);//Crée une couleur ( bleu clair )

    sf::Texture background;//Crée une texture nommée background
        if (!background.loadFromFile("background.png"))//A partir du fichier background.png
        return -1;
    sf::Sprite back;//Crée un sprite nommé back
        back.setTexture(background);//Applique la texture backgroung sur le sprite back

   
    sf::Image sniper1;//Crée une image nommée sniper1
        if (!sniper1.loadFromFile("testamod.png"))//A partir du fichier testamod.png
        return -1;
        sniper1.createMaskFromColor(alpha);//Rend la couleur alpha ( rose ) transparente

    sf::Texture snip1;//Crée une texture nommée snip1
        if (!snip1.create(64, 64))//snip1 est crée vide et de taille 64x64
        return -1;

    sf::Sprite spritesnip1;//Crée un sprite nommé spritesnip1
        spritesnip1.setTexture(snip1);//Applique la texture snip1 sur le sprite spritesnip1
        spritesnip1.setPosition(sf::Vector2f(320, 80));//Définis la position du sprite spritesnip1 à 320 de X et 80 d'Y

    sf::Clock clock;//Démarre un chrono

    while (window.isOpen())//Boucle du programme
    {
        sf::Event event;//Gestionnaire d'évênement
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }

                    sf::Time t1 = sf::seconds(1.0);//Une seconde
                    sf::Time t2 = sf::seconds(2.0);//Deux secondes
                    sf::Time t3 = sf::seconds(3.0);//Trois secondes
                    sf::Time t4 = sf::seconds(4.0);//Quatre secondes

                    sf::Time elapsed1 = clock.getElapsedTime();//Inscris dans elapsed1 le temps écoulé depuis le démarrage du chrono

                    if (elapsed1 <= t1)//Si temps écoulé est inférieur ou égal à une seconde
                    {
                        snip1.loadFromImage(sniper1,sf::IntRect(128, 64, 64, 64));//Rempis la texture snip1 par un morceau de 64x64 pixels situé à 128 de X et 64 d'Y de l'image sniper1
                    }

                    if (elapsed1 > t1 && elapsed1 < t2)//Si temps écoulé est compris entre 1 et 2 secondes
                    {
                        snip1.loadFromImage(sniper1,sf::IntRect(192, 0, 64, 64));//Change la texture snip1 par un morceau de 64x64 pixels situé à 192 de X et 0 d'Y de l'image sniper1
                    }

                    if (elapsed1 > t2 && elapsed1 < t3)//Si temps écoulé est compris entre 2 et 3 secondes
                    {
                        snip1.loadFromImage(sniper1,sf::IntRect(192, 64, 64, 64));//Change la texture snip1 par un morceau de 64x64 pixels situé à 192 de X et 64 d'Y de l'image sniper1
                    }

                    if (elapsed1 > t3 && elapsed1 < t4)//Si temps écoulé est compris entre 3 et 4 secondes
                    {
                        snip1.loadFromImage(sniper1,sf::IntRect(192, 0, 64, 64));//Change la texture snip1 par un morceau de 64x64 pixels situé à 192 de X et 0 d'Y de l'image sniper1
                    }
                    if (elapsed1 > t4)//Si temps écoulé est supérieur à 4 secondes
                    {
                        clock.restart();Redémarre le chrono
                    }

        window.clear(fond);//Nettoie le buffer avec la couleur fond ( bleu clair )
        window.draw(back);//Dessine le sprite back
        window.draw(spritesnip1);//Dessine le sprite spritesnip1
        window.display();//Affiche le rendu
    }

    return 0;
}

 

TheKingArthur

  • Invité
Re : Animation simple
« Réponse #3 le: Septembre 02, 2014, 06:40:36 pm »
Pas mal. Un conseil ne met pas tout ton code dans le main, la POO est la pour ça. Sinon c'est super.

2ant

  • Newbie
  • *
  • Messages: 17
    • Voir le profil
Re : Animation simple
« Réponse #4 le: Septembre 03, 2014, 10:42:05 am »
Pour l'instant j'utilise le main pour tester comment faire ce dont j'ai besoin le plus simplement possible. Lorsque j'aurais tous les éléments nécessaires à mon jeu je créerais des classes.