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

Auteur Sujet: Problème lors du déplacement de la fenêre  (Lu 13468 fois)

0 Membres et 1 Invité sur ce sujet

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème lors du déplacement de la fenêre
« Réponse #15 le: Avril 19, 2012, 10:30:51 am »
De toute façon oui, avec SFML 1.6 tu es obligé de faire dériver de sf::Thread la classe qui "fait les trucs threadés".
Laurent Gomila - SFML developer

yusera

  • Jr. Member
  • **
  • Messages: 73
    • Voir le profil
Re : Problème lors du déplacement de la fenêre
« Réponse #16 le: Avril 19, 2012, 10:44:12 am »
Pas avec SFML 2.0 ?
Merci pour tes réponse ! Je vais essayer comme ça.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème lors du déplacement de la fenêre
« Réponse #17 le: Avril 19, 2012, 12:13:43 pm »
Avec SFML 2 déjà tu ne dérives plus de sf::Thread.
Laurent Gomila - SFML developer

yusera

  • Jr. Member
  • **
  • Messages: 73
    • Voir le profil
Re : Problème lors du déplacement de la fenêre
« Réponse #18 le: Avril 19, 2012, 03:07:08 pm »
OK mais j'ai encore un problème. Y a t'il une solution pour envoyer un sf:RenderWindow en paramètre pour la classe qui hérite de sf::Thread ? Car les "Screen" ont pour fonction virtual int Run(sf::RenderWindow &App) = 0;
Or si je tappe:
sf::RenderWindow App(...);
Screen t;
t.Run(App);
Ça ne va pas lancer le thread car ça ne marche pas, le programme arrête totalement de fonctionner lorsque qu'on bouge la fenêtre...

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème lors du déplacement de la fenêre
« Réponse #19 le: Avril 19, 2012, 03:17:25 pm »
Tu veux faire ça ?
// ça c'est le point d'entrée public
void Screen::Run(sf::RenderWindow& window)
{
    m_window = &window;
    Launch();
}

// et ça c'est la fonction threadée
void Screen::Run()
{
    // use m_window ...
}
 
Laurent Gomila - SFML developer

yusera

  • Jr. Member
  • **
  • Messages: 73
    • Voir le profil
Re : Problème lors du déplacement de la fenêre
« Réponse #20 le: Avril 19, 2012, 05:26:48 pm »
Oui, c'est simple en fait mais j'ai une erreur lorsque l'attribut sf::RenderWindow de la classe Screen fait réference à sf::RenderWindow& window :
error C2758: 'Screen::App' : doit être initialisé(e) dans la liste des initialiseurs base/membre du constructeur
// Screen.hpp
class Screen : public sf::Thread
{
        public :
                Screen();
                int Run(sf::RenderWindow &window);
               
        protected :
                sf::RenderWindow &App;
                int exit;
};

// Screen.cpp
Screen::Screen() : exit(-1)
{

}

int Screen::Run(sf::RenderWindow &window)
{
        App = window;
        Launch();

        return exit;
}
 

J'ai tenté d'initialiser sf::RenderWindow App dans le constructeur en mettant: App(sf::RenderWindow()) mais ça ne marche pas.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème lors du déplacement de la fenêre
« Réponse #21 le: Avril 19, 2012, 06:16:41 pm »
Tu ne peux pas "binder" une référence après sa construction, c'est pourquoi j'ai utilisé un pointeur dans mon exemple.
Laurent Gomila - SFML developer

yusera

  • Jr. Member
  • **
  • Messages: 73
    • Voir le profil
Re : Problème lors du déplacement de la fenêre
« Réponse #22 le: Avril 20, 2012, 09:01:09 pm »
En effet, j'avais oublié.
Je te répondrai plus en détail plus tard car il y a encore quelques problèmes etje n'ai pas le temps ce week-end.

yusera

  • Jr. Member
  • **
  • Messages: 73
    • Voir le profil
Re : Problème lors du déplacement de la fenêre
« Réponse #23 le: Avril 26, 2012, 07:19:29 pm »
Alors me revoilà.
Donc en fait il y a un problème de pointage, c'est-à-dire que lorsque je crée une classe Jeu qui hérite de Screen avec pour fonction virtual void Run(), l'attribut hérité de Screen (sf::RenderWindow *App) ne "marche" pas dans la fonction héritée.

Il y a comme un problème de pointage avec le sf::RenderWindow App(sf::VideoMode(1024, 768, 32), "Nouveau Jeu", sf::Style::Close) du main puisque par exemple lorsque j'appelle GetWidth() de sf::RenderWindow, aucune valeur n'est renvoyée ...

De plus, rien n'est affiché à l'écran.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème lors du déplacement de la fenêre
« Réponse #24 le: Avril 26, 2012, 09:05:30 pm »
Citer
aucune valeur n'est renvoyée
Ca veut dire quoi ? Ca crashe ? Ca renvoie zéro ? Du caca ?

Le code est-il suffisamment petit pour que tu puisses nous le montrer (au moins en partie) ?
Laurent Gomila - SFML developer

yusera

  • Jr. Member
  • **
  • Messages: 73
    • Voir le profil
Re : Problème lors du déplacement de la fenêre
« Réponse #25 le: Avril 26, 2012, 11:18:05 pm »
Ça ne crash pas mais si je veux afficher la valeur avec cout :
cout << App->GetWidth() << endl;
Aucune valeur n'est affichée alors que si je place ce bout de code dans la fonction Run(sf::RenderWindow &App) qui est déclarée dans la classe Screen, ça affiche bien la longueur de la fenêtre (ici 1024)

Voilà un bout de code :
class Screen : public sf::Thread
{
        public :
                Screen();
                int Run(sf::RenderWindow &window);
                //int GetExit();
                //virtual void Run();
               
        protected :
                sf::RenderWindow *App;
                int exit;

        //private :
                //virtual void Run() = 0;
};
Screen::Screen() : exit(-3)
{

}

int Screen::Run(sf::RenderWindow &window)
{
        App = &window;
        Launch();

        while(exit == -3);

        return exit;
}
void Jeu::Run()
{
        bool Running(true);
        sf::Event Event;

        while(Running)
        {
                while(App->GetEvent(Event))
                {
                        if(Event.Type == sf::Event::Closed)

                                exit = SCREEN_EXIT;
                        if(Event.Type == sf::Event::KeyPressed)
                        {
                                switch(Event.Key.Code)
                                {
                                        case sf::Key::Escape:
                                                exit = SCREEN_MENU;
                                                break;
                                }
                        }
                }
               
                if(exit != -3)
                        Running = false;

                // Affichage
                App->Clear(sf::Color(0, 255, 0));
                App->Display();
        }

        exit = SCREEN_EXIT;
}
 
Et la fonction main :
int main(int argc, char** argv)
{
        sf::RenderWindow App(sf::VideoMode(1024, 768, 32), "Nouveau Jeu", sf::Style::Close);//|sf::Style::Fullscreen);
        //sf::RenderWindow App(sf::VideoMode(800, 600, 32), "Nouveau Jeu", sf::Style::Close);

        // Vue
        sf::View view(sf::FloatRect(0, 0, 1024, 768));
        App.SetView(view);

        // Menu/Jeu/Options
        std::vector<Screen*> screens;
        int screen = 0;

        Jeu s_jeu; // Creation d'un affichage pour le jeu
        screens.push_back(&s_jeu);

        while(screen >= 0)
        {
                screen = screens[screen]->Run(App);
        }

        return EXIT_SUCCESS;
}
 

Une remarque :
Par rapport à la ligne while(exit == -3);, ça ne fonctionne pas comme je veux donc ne la prend pas en compte, c'est juste pour ne pas répéter la boucle du main.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème lors du déplacement de la fenêre
« Réponse #26 le: Avril 26, 2012, 11:37:13 pm »
Donc en fait Jeu::Run() n'est pas du tout appelé ? C'est ça ?
Laurent Gomila - SFML developer

yusera

  • Jr. Member
  • **
  • Messages: 73
    • Voir le profil
Re : Problème lors du déplacement de la fenêre
« Réponse #27 le: Avril 27, 2012, 05:31:28 pm »
Si si puisque un cout << "text" << endl; dans la fonction Run() affiche correctement le texte dans la console. C'est le pointeur sf::RenderWindow *App qui a un problème car le fait d'afficher un fond rouge
App->Clear(sf::Color(0, 255, 0));
App->Display();
ne marche pas puisqu'il y a un écran noir.

De plus, App->GetEvent(Event) renvoie toujours false car la boucle while(App->GetEvent(Event)) de la fonction Run() n'est jamais lancé. Donc j'en déduit qu'il y a un problème de pointage ... Et je ne comprends pas pourquoi ça ne marche pas

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème lors du déplacement de la fenêre
« Réponse #28 le: Avril 27, 2012, 07:33:46 pm »
T'es sûr que tu n'as pas une autre instance de sf::RenderWindow, non initialisée, qui traîne quelque part et qui pourrait être pointée à la place de la bonne instance ?
Laurent Gomila - SFML developer

yusera

  • Jr. Member
  • **
  • Messages: 73
    • Voir le profil
Re : Problème lors du déplacement de la fenêre
« Réponse #29 le: Avril 28, 2012, 01:41:30 pm »
Je suis sûr. En fait, ça vient du fait que la classe jeu hérite de Screen car dans la fonction Run(sf::RenderWindow &window) de Screen, si j’ajoute:
App->Clear(sf::Color(255, 0, 0));
App->Display();
La fenêtre devient rouge alors que ça ne marche pas dans la classe Jeu ...

 

anything