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

Auteur Sujet: [segfault] Appel de RenderWindow::create()  (Lu 13660 fois)

0 Membres et 1 Invité sur ce sujet

nicooomg

  • Jr. Member
  • **
  • Messages: 66
    • Voir le profil
Re : [segfault] Appel de RenderWindow::create()
« Réponse #30 le: Juin 26, 2012, 04:31:14 pm »
Ca marche :)
Mais du coup je n'herite pas de 'Screen', et je ne peux faire cette boucle:

    int iscreen = 0, temp;
    while(iscreen >= 0)
    {
        // On lance l'affichage
        temp = Screens[iscreen]->Run(App);
        // 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];
            App.clear();
            iscreen = temp;
        }
    }

Cela me permet dans la fonction Run de retourner un int qui correspond a lecran suivant ou precedant, et passer dun ecran a un autre en liberant proprement la memoire.

C'est etrange, avec new SplashScreen, ou en utilisant quelquechose comme:
SplashScreen ss(...);
vector.push_back(&ss);

Cela ne marche pas non plus, ya vraiment un truc louche ici.
Mais bon, je vois pas du tout, j'utilise comme base le tutorial, cela devrait marcher :)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : [segfault] Appel de RenderWindow::create()
« Réponse #31 le: Juin 26, 2012, 04:47:06 pm »
C'est ça le souci, c'est que tu essayes de faire tes tests dans ton code d'origine (avec son bug qui traîne là quelque part). Il faut se mettre dans un code vierge pour éviter toute interférence.
Laurent Gomila - SFML developer

nicooomg

  • Jr. Member
  • **
  • Messages: 66
    • Voir le profil
Re : [segfault] Appel de RenderWindow::create()
« Réponse #32 le: Juin 26, 2012, 06:22:54 pm »
Le bug se trouve dans l'heritage je suppose...!
Mais je suis pas assez bon pour trouver le probleme.

& pour le code vierge, eh bien cest ce qu'on a fait toute l'apres midi ! Donc j'aimerais retourner a mon systeme de plusieurs ecrans :)

nico

nicooomg

  • Jr. Member
  • **
  • Messages: 66
    • Voir le profil
Re : [segfault] Appel de RenderWindow::create()
« Réponse #33 le: Juin 27, 2012, 03:08:51 am »
Voici la solution !

En fait la SFML n'accepte pas de doublons sf::Event !
Donc avoir plusieurs classes qui servent d'écrans, avec chacune son propre membre sf::Event = aucun affichage.

Donc, pour avoir plusieurs ecrans, comme sur ce tutorial, avec gcc 4.7 (apparement !) https://github.com/SFML/SFML/wiki/TutorialScreens

Il faut utiliser une classe mere de ce type:


class Screen
{
    public :
        Screen() {};
        ~Screen() {};
        virtual int Run (sf::RenderWindow& App) {};

        static sfg::SFGUI m_sfgui;
        static sfg::Desktop desktop;
        static sf::Event event;
        static sf::Clock clock;
};

@LaurentGomila:
Merci de noter dans les tutoriels que plusieurs variables de type sf::Event fait foirer le code.
Est-ce un probleme interne ? Si oui, tu devrais mettre une protection sur les types qui ne doivent surtout pas exister plusieurs fois !

nico :)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : [segfault] Appel de RenderWindow::create()
« Réponse #34 le: Juin 27, 2012, 08:10:58 am »
Citer
Merci de noter dans les tutoriels que plusieurs variables de type sf::Event fait foirer le code.
Est-ce un probleme interne ? Si oui, tu devrais mettre une protection sur les types qui ne doivent surtout pas exister plusieurs fois !
Tel que tu décris ça, ça n'a aucun sens. sf::Event n'est qu'une bête union, tu peux bien entendu en déclarer autant que tu veux. Je pense que le souci venait de ce que tu fais avec ces deux instances, tu peux me montrer ?

Au passage, avoir un sf::Event en membre d'une classe, ça ne sert strictement à rien ;)
Laurent Gomila - SFML developer

gaulois94

  • Sr. Member
  • ****
  • Messages: 259
    • Voir le profil
Re : [segfault] Appel de RenderWindow::create()
« Réponse #35 le: Juin 27, 2012, 02:17:12 pm »
Personnellement je peux créer autant de sf::Event que je veux (j'en fait généralement une par Fenêtre).

nicooomg

  • Jr. Member
  • **
  • Messages: 66
    • Voir le profil
Re : [segfault] Appel de RenderWindow::create()
« Réponse #36 le: Juin 27, 2012, 03:35:16 pm »
Eh bien je pouvais egalement en creer plusieurs quand j'avais gcc 4.4.
Une fois passer a 4.7, et avoir recompiler sfml. J'avais un ecran noir avec le meme code.
Le passage de sf::Event unique pour chaque ecran resolvait le probleme.

Tu veux quoi exactement LG?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : [segfault] Appel de RenderWindow::create()
« Réponse #37 le: Juin 27, 2012, 03:42:06 pm »
Citer
Tu veux quoi exactement LG?
Toutes les lignes de code (avec un peu de contexte pour comprendre) qui impliquaient les sf::Event dont tu parles.
Laurent Gomila - SFML developer

nicooomg

  • Jr. Member
  • **
  • Messages: 66
    • Voir le profil
Re : [segfault] Appel de RenderWindow::create()
« Réponse #38 le: Juin 27, 2012, 05:35:02 pm »
Le contexte:
- Avoir plusieurs ecrans differents dans une meme RenderWindow, tres utile pour un jeu ! (splash screen, menu, jeu, options, etc.)

int main()
{
    // sfml window
    sf::RenderWindow App(sf::VideoMode(800, 600), "Game");

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

    int current_screen = SplashScreen::ID;
    int temp_screen;

    while(current_screen >= 0)
    {
        // On lance l'affichage
        temp_screen = Screens[current_screen]->Run(App);
        if(temp_screen != current_screen)
        {
            current_screen = temp_screen;
        }
    }
    return EXIT_SUCCESS;
}


// SplashScreen
class SplashScreen: public Screen
{
    public:
        SplashScreen()
        {

        }
        ~SplashScreen() {}
        int Run (sf::RenderWindow& App);

        static const int ID = 0;
};




int SplashScreen::Run(sf::RenderWindow& App)
{
    // Splash Screen loading
    sf::Texture splash;
    if(!splash.loadFromFile("Data/gui/splash/splashscreen.jpg"))
    {
        exit(0);
    }
    sf::Sprite spr(splash);

    while(App.isOpen()) {
        // Clearing out the window
        App.clear();
        // Event processing.
        while(App.pollEvent(m_event) ) {
            // If window is about to be closed, leave program.
            if(m_event.type == sf::Event::Closed) {
                App.close();
            }
        }


        App.draw(spr);

        App.display();
    }
    return -1;
}


Et maintenant, Screen

class Screen
{
    public :
        Screen() {};
        ~Screen() {};
        virtual int Run (sf::RenderWindow& App) {};

        static sf::Event m_event;
        static sf::Clock m_clock;

};

Sans le static, j'ai un ecran noir. :)

J'ajoterais que c'est le meme probleme en ajoutant SFGUI pas en static, ecran noir :)

voila !

nico

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : [segfault] Appel de RenderWindow::create()
« Réponse #39 le: Juin 27, 2012, 06:14:06 pm »
Je pense que c'est plutôt un effet de bord causé par un autre bug plus vicieux. Il n'y a aucune raison pour que ça produise des bugs, encore moins graphiques. Tu devrais creuser parce que ça risque de te retomber dessus plus vite que tu ne le penses.

Ensuite, déclarer un membre de type sf::Event, ça sert à quoi ? Les évènements sont typiquement très locaux, en dehors de la boucle d'évènements tu n'en as pas besoin. Du coup tu peux le déclarer juste avant.
sf::Event event;
while(App.pollEvent(event) )
   ...

Il manque aussi le fait que le destructeur de Screen devrait être virtuel. Ca pourrait avoir un lien avec tes problèmes, bien que d'après le code que tu montres ça n'en ait pas l'air.

Il manque aussi la destruction des screens, mais j'imagine que c'est fait dans le code original.
Laurent Gomila - SFML developer

nicooomg

  • Jr. Member
  • **
  • Messages: 66
    • Voir le profil
Re : [segfault] Appel de RenderWindow::create()
« Réponse #40 le: Juin 27, 2012, 06:21:38 pm »
Oui j'avais oublié de la rajouter, mais ce systeme etait justement fait pour egalement faire la destruction automatique !
Je vais voir par la suite si ca me retombe dessus, mais la j'avance doucement mais bien ^^

merci lg !

nico

 

anything