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

Auteur Sujet: Affichage d'écrans differents, flash d'un sprite  (Lu 3808 fois)

0 Membres et 1 Invité sur ce sujet

nicooomg

  • Jr. Member
  • **
  • Messages: 66
    • Voir le profil
Affichage d'écrans differents, flash d'un sprite
« le: Juin 10, 2012, 12:30:29 am »
Bonjour,
Je me suis mis pour de bon à la sfml apres avoir vu la comparaison sfml vs sdl du createur...

Je fais un jeu en 2D, et je vais avoir besoin de trois ecrans, un splash screen, le menu de connexion et le jeu lui meme, donc pour separer proprement ces ecrans, voici mon main:

int main()
{
    Window* w = new Window();

    std::vector<Screen*> Screens;
    Screens.push_back(new SplashScreen());
    //Screens.push_back(new LoginScreen());
    Screens.push_back(new Ingame());

    int iscreen = 0, temp;
    while(iscreen >= 0)
    {
        // On lance l'affichage
        temp = Screens[iscreen]->Run(w);
        // On vient de sortir de la boucle de Screen::Run()
        // Si temp est different, on met a jour les variables
        if(temp != iscreen)
        {
            delete Screens[iscreen];
            w->Clear();
            iscreen = temp;
        }
    }
    return EXIT_SUCCESS;
}

L'affichage du Splash se fait tres bien, mais apres quelques secondes (le temps que le splash passe, j'ai du mettre 2secondes) mon ecran commence a flasher l'image qu'il y avait dans le splash.

Voici le code du splash:
class SplashScreen: public Screen
{
    public:
        SplashScreen() {}
        ~SplashScreen() {}
        int Run (Window* App);

    private:
};

int SplashScreen::Run(Window* App)
{

    sf::Texture splash;
    splash.loadFromFile("Data/gui/splash/splashscreen.jpg");

    sf::Sprite spr(splash);

    sf::Clock clock;
    sf::Event event;

    clock.restart();


    while(App->Running()) {
        // Event processing.
        while(App->GetEvent(event) ) {
            //desktop.HandleEvent( event );

            // If window is about to be closed, leave program.
            if(Window::Closing(event)) {
                exit(0);
            }
        }
        std::cout << "splash screen"<<std::endl;
        if(clock.getElapsedTime() > sf::seconds(2)) // On reste sur cet ecran 2secs
        {
            return 1;
        }
        App->Draw(spr);
        App->Render();
    }
    return -1;
}

Infos:
App->Draw(spr) est un simple template pour faire appel à RenderWindow::draw();
App->Render() est un simple alias pour faire appel à RenderWindow::display();

Donc a la sortie du splash, comme on le voit dans le main, je fais un w->Clear(); (alias pour RenderWindow::clear()) et de plus, l'objet SplashScreen est détruit, donc le sprite & texture devraient logiquement disparaitres....
Mais a ce moment la, mon ecran flash, et si je le regarde plus de 30sec, je fais une crise d'épilepsie !

Quelqu'un a une idée?

nico.

Cpl.Bator

  • Hero Member
  • *****
  • Messages: 540
    • Voir le profil
Re : Affichage d'écrans differents, flash d'un sprite
« Réponse #1 le: Juin 10, 2012, 12:53:30 am »
tu as le code de la partie Ingame::Run() ?
le problème dois venir de lui si le splash screen se passe bien.

nicooomg

  • Jr. Member
  • **
  • Messages: 66
    • Voir le profil
Re : Affichage d'écrans differents, flash d'un sprite
« Réponse #2 le: Juin 11, 2012, 01:19:22 am »
En gros, le ingame::run() c'est ca:
int Ingame::Run(Window* App)
{



    while(App->Running()) {
        // Event processing.
        while(App->GetEvent(event) ) {
            //desktop.HandleEvent( event );

            // If window is about to be closed, leave program.
            if(Window::Closing(event)) {
                exit(0);
            }
        }
        std::cout << "in game"<<std::endl;
        App->Render();
    }
    return -1;
}

Mais j'ai toujours cet ecran epileptique... :(

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Affichage d'écrans differents, flash d'un sprite
« Réponse #3 le: Juin 11, 2012, 08:10:06 am »
Tu n'affiches rien dans ton ton écran Ingame, c'est normal que ça clignote. Il faut au moins que tu effaces la fenêtre (je veux dire, à chaque tour de boucle).

La raison c'est que SFML utilise du double-buffering, donc en interne il y a deux surfaces de dessin distinctes, qui alternent à chaque fois que tu appelles window.display(). Or toi tu en effaces une et tu laisses l'autre telle qu'elle, donc ça clignote ;)
Laurent Gomila - SFML developer

nicooomg

  • Jr. Member
  • **
  • Messages: 66
    • Voir le profil
Re : Affichage d'écrans differents, flash d'un sprite
« Réponse #4 le: Juin 11, 2012, 03:40:06 pm »
Merci de te réponse laurent, ca marche ^^

Donc a chaque tour de boucle, je refais:

clear()
window.draw() sur chaque objet visible
display()

C'est bien ca?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Affichage d'écrans differents, flash d'un sprite
« Réponse #5 le: Juin 11, 2012, 03:50:00 pm »
C'est tout à fait ça.
Laurent Gomila - SFML developer

nicooomg

  • Jr. Member
  • **
  • Messages: 66
    • Voir le profil
Re : Affichage d'écrans differents, flash d'un sprite
« Réponse #6 le: Juin 11, 2012, 05:33:29 pm »
Merci
Les modos peuvent fermer le topic ^^