-
Bonjour,
Je viens de reinstaller Code::Blocks, avec pour compilateur: MinGW ayant GCC 4.7.0 !
J'utilise SFML 2 !
De: http://freefr.dl.sourceforge.net/project/mingw/Installer/mingw-get-inst/mingw-get-inst-20120426/mingw-get-inst-20120426.exe
Mon code compilait très bien avant cette mise à jour...
Maintenant...:
#0 6E182F29 sf::Window::Window(this=0x77af1bd1) (D:\developpement\sfml-master\src\SFML\Window\Window.cpp:47)
#1 00919519 sf::RenderWindow::RenderWindow(this=0x77af1bd1) (D:\developpement\sfml-master\src\SFML\Graphics\RenderWindow.cpp:35)
#2 00402BCC ?? () (??:??)
#3 004010B9 ?? () (??:??)
#4 00401284 ?? () (??:??)
#5 7694339A KERNEL32!BaseCleanupAppcompatCacheSupport() (C:\Windows\syswow64\kernel32.dll:??)
#6 7EFDE000 ?? () (??:??)
#7 77A59EF2 ntdll!RtlpNtSetValueKey() (C:\Windows\system32\ntdll.dll:??)
#8 7EFDE000 ?? () (??:??)
#9 77A59EC5 ntdll!RtlpNtSetValueKey() (C:\Windows\system32\ntdll.dll:??)
#10 0040126C ?? () (??:??)
#11 ?? ?? () (??:??)
Dans mon projet (C::B) j'ai
link options:
-lsfml-graphics-d
-lsfml-window-d
-lsfml-system-d
-lsfgui
-lopengl32
compile define:
SFML_STATIC
SFGUI_STATIC
Que faut-il faire?
merci, nico
-
Que raconte "gcc -v" dans la console ?
-
gcc version 4.7.0 <GCC>
et pleins d'autres trucs... !
-
et pleins d'autres trucs... !
Sans déconner ;D
C'est justement ça qui m'intéresse.
-
(http://img32.imageshack.us/img32/1264/gcc.png)
-
Quelle variante de SFML utilises-tu (il y a différentes versions pour MinGW sous Windows) ?
-
LaurentGomila-SFML-2.0-rc-37-g5706111.zip :)
Ensuite, CMake 2.8 !
Et compilé avec GCC 4.7.
-
Ah, tu as donc compilé SFML toi-même. Si tu l'as bien fait avec le même compilo que celui que tu utilises pour ton programme, alors je ne vois pas ce qui peut merder. Ca paraît évident mais je le dis quand même : assure-toi bien qu'il n'y ait pas des restes de vieilles versions qui traînent, et que tu as bien recompilé complètement ton programme.
-
Meme compilo oui :)
Aucune version ne traine dans mes dossiers... :S Et j'ai egalement recompilé.
Bon je vais tester avec SFML 2 deja compilée
-
Avec la version du site, toujours la meme erreur de segmentation... :(
-
Bon j'ai recommencé le projet avec chaque petite etape du tuto, voici ce que j'obtient....
c:\mingw\bin\..\lib\gcc\mingw32\4.7.0\..\..\..\libsfml-graphics-s-d.a(RenderTarget.cpp.obj)||In function `_ZN2sf12RenderTarget5clearERKNS_5ColorE':|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|57|undefined reference to `___gxx_personality_sj0'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|57|undefined reference to `__Unwind_SjLj_Register'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|60|undefined reference to `__Unwind_SjLj_Resume'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|61|undefined reference to `__Unwind_SjLj_Resume'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|61|undefined reference to `__Unwind_SjLj_Unregister'|
c:\mingw\bin\..\lib\gcc\mingw32\4.7.0\..\..\..\libsfml-graphics-s-d.a(RenderTarget.cpp.obj)||In function `_ZN2sf12RenderTarget4drawEPKNS_6VertexEjNS_13PrimitiveTypeERKNS_12RenderStatesE':|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|133|undefined reference to `___gxx_personality_sj0'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|133|undefined reference to `__Unwind_SjLj_Register'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|197|undefined reference to `__Unwind_SjLj_Resume'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|198|undefined reference to `__Unwind_SjLj_Resume'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|199|undefined reference to `__Unwind_SjLj_Resume'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|208|undefined reference to `__Unwind_SjLj_Resume'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|136|undefined reference to `__Unwind_SjLj_Unregister'|
c:\mingw\bin\..\lib\gcc\mingw32\4.7.0\..\..\..\libsfml-graphics-s-d.a(RenderTarget.cpp.obj)||In function `_ZN2sf12RenderTarget12pushGLStatesEv':|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|222|undefined reference to `___gxx_personality_sj0'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|222|undefined reference to `__Unwind_SjLj_Register'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|225|undefined reference to `__Unwind_SjLj_Resume'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|226|undefined reference to `__Unwind_SjLj_Resume'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|227|undefined reference to `__Unwind_SjLj_Resume'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|228|undefined reference to `__Unwind_SjLj_Resume'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|229|undefined reference to `__Unwind_SjLj_Resume'|
c:\mingw\bin\..\lib\gcc\mingw32\4.7.0\..\..\..\libsfml-graphics-s-d.a(RenderTarget.cpp.obj):D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|230|more undefined references to `__Unwind_SjLj_Resume' follow|
c:\mingw\bin\..\lib\gcc\mingw32\4.7.0\..\..\..\libsfml-graphics-s-d.a(RenderTarget.cpp.obj)||In function `_ZN2sf12RenderTarget12pushGLStatesEv':|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|235|undefined reference to `__Unwind_SjLj_Unregister'|
c:\mingw\bin\..\lib\gcc\mingw32\4.7.0\..\..\..\libsfml-graphics-s-d.a(RenderTarget.cpp.obj)||In function `_ZN2sf12RenderTarget11popGLStatesEv':|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|241|undefined reference to `___gxx_personality_sj0'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|241|undefined reference to `__Unwind_SjLj_Register'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|244|undefined reference to `__Unwind_SjLj_Resume'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|245|undefined reference to `__Unwind_SjLj_Resume'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|246|undefined reference to `__Unwind_SjLj_Resume'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|247|undefined reference to `__Unwind_SjLj_Resume'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|248|undefined reference to `__Unwind_SjLj_Resume'|
c:\mingw\bin\..\lib\gcc\mingw32\4.7.0\..\..\..\libsfml-graphics-s-d.a(RenderTarget.cpp.obj):D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|249|more undefined references to `__Unwind_SjLj_Resume' follow|
c:\mingw\bin\..\lib\gcc\mingw32\4.7.0\..\..\..\libsfml-graphics-s-d.a(RenderTarget.cpp.obj)||In function `_ZN2sf12RenderTarget11popGLStatesEv':|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|251|undefined reference to `__Unwind_SjLj_Unregister'|
c:\mingw\bin\..\lib\gcc\mingw32\4.7.0\..\..\..\libsfml-graphics-s-d.a(RenderTarget.cpp.obj)||In function `_ZN2sf12RenderTarget13resetGLStatesEv':|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|258|undefined reference to `___gxx_personality_sj0'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|258|undefined reference to `__Unwind_SjLj_Register'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|265|undefined reference to `__Unwind_SjLj_Resume'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|266|undefined reference to `__Unwind_SjLj_Resume'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|267|undefined reference to `__Unwind_SjLj_Resume'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|268|undefined reference to `__Unwind_SjLj_Resume'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|269|undefined reference to `__Unwind_SjLj_Resume'|
c:\mingw\bin\..\lib\gcc\mingw32\4.7.0\..\..\..\libsfml-graphics-s-d.a(RenderTarget.cpp.obj):D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|270|more undefined references to `__Unwind_SjLj_Resume' follow|
c:\mingw\bin\..\lib\gcc\mingw32\4.7.0\..\..\..\libsfml-graphics-s-d.a(RenderTarget.cpp.obj)||In function `_ZN2sf12RenderTarget13resetGLStatesEv':|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|285|undefined reference to `__Unwind_SjLj_Unregister'|
c:\mingw\bin\..\lib\gcc\mingw32\4.7.0\..\..\..\libsfml-graphics-s-d.a(RenderTarget.cpp.obj)||In function `_ZN2sf12RenderTarget16applyCurrentViewEv':|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|304|undefined reference to `___gxx_personality_sj0'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|304|undefined reference to `__Unwind_SjLj_Register'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|308|undefined reference to `__Unwind_SjLj_Resume'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|311|undefined reference to `__Unwind_SjLj_Resume'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|312|undefined reference to `__Unwind_SjLj_Resume'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|317|undefined reference to `__Unwind_SjLj_Unregister'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|315|undefined reference to `__Unwind_SjLj_Resume'|
c:\mingw\bin\..\lib\gcc\mingw32\4.7.0\..\..\..\libsfml-graphics-s-d.a(RenderTarget.cpp.obj)||In function `_ZN2sf12RenderTarget14applyBlendModeENS_9BlendModeE':|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|323|undefined reference to `___gxx_personality_sj0'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|323|undefined reference to `__Unwind_SjLj_Register'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|332|undefined reference to `__Unwind_SjLj_Resume'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|334|undefined reference to `__Unwind_SjLj_Resume'|
||More errors follow but not being shown.|
||Edit the max errors limit in compiler options...|
||=== Build finished: 50 errors, 0 warnings (0 minutes, 9 seconds) ===|
Il doit me manquer un .a... mais lequel ? :)
-
Non. Là par contre t'as clairement une incompatibilité entre compilos, ce qui signifie que SFML n'a pas été compilée avec le compilo que tu utilises là.
-
J'ai avancé un petit peu.
J'ai ma fenetre, mais la sigsegv se trouve sur "sfml-graphics-2.dll"
Je vais recompiler cette dll egalement... !
-
Wow.
Ca va etre long :/
#0 702D3474 glFlush() (C:\Windows\SysWOW64\opengl32.dll:??)
#1 7030C269 wglGetProcAddress() (C:\Windows\SysWOW64\opengl32.dll:??)
#2 64DCE1C5 __GLeeGetExtStrPlat() (D:\C__~1\projects\CLIENT~3\bin\Debug\sfgui.dll:??)
#3 64DCE238 __GLeeGetExtensions() (D:\C__~1\projects\CLIENT~3\bin\Debug\sfgui.dll:??)
#4 64DCE453 GLeeInit() (D:\C__~1\projects\CLIENT~3\bin\Debug\sfgui.dll:??)
#5 64DE7CE5 GLee_Lazy_glGenBuffers@8() (D:\C__~1\projects\CLIENT~3\bin\Debug\sfgui.dll:??)
#6 64DADA89 sfg::Renderer::Renderer() () (D:\C__~1\projects\CLIENT~3\bin\Debug\sfgui.dll:??)
#7 64DADC99 sfg::Renderer::Create() () (D:\C__~1\projects\CLIENT~3\bin\Debug\sfgui.dll:??)
#8 64DBA403 sfg::SFGUI::SFGUI() () (D:\C__~1\projects\CLIENT~3\bin\Debug\sfgui.dll:??)
#9 00474D7B ?? () (??:??)
#10 004010B9 ?? () (??:??)
#11 00401284 ?? () (??:??)
#12 7694339A KERNEL32!BaseCleanupAppcompatCacheSupport() (C:\Windows\syswow64\kernel32.dll:??)
#13 7EFDE000 ?? () (??:??)
#14 77A59EF2 ntdll!RtlpNtSetValueKey() (C:\Windows\system32\ntdll.dll:??)
#15 7EFDE000 ?? () (??:??)
#16 77A59EC5 ntdll!RtlpNtSetValueKey() (C:\Windows\system32\ntdll.dll:??)
#17 0040126C ?? () (??:??)
#18 ?? ?? () (??:??)
J'ai ceci apres avoir recompiler entirement la SFML. (Bravo, maintenant la segmentation se trouve dans openGL!!
Je dois recompiler quoi maintenant?
-
Est-ce que tu pourrais commencer par un code simple (par exemple celui du tutoriel), de façon à être certain que tes bibliothèques compilées sont ok ? Parce que là ça pourrait très bien être ton code, SFGUI, SFML, etc. tu testes trop de choses en même temps.
-
Le truc c'est que mon code marchait parfaitement ! :)
Bon je viens de recompiler Sfgui. La compilation = niquel.
Et mon programme n'a plus de sigsegv. Mais bon, ecran noir :P. Sfgui... >:(
-
Si tu as changé de compilo il faut évidemment que tu recompiles absolument toutes les bibliothèques C++ que tu utilises.
-
Oui je savais pas ^_^
Bon eh bien maintenant passons a un truc plus simple ou tu pourras meclairer :)
int SplashScreen::Run()
{
// Splash Screen loading
sf::Texture splash;
splash.loadFromFile("Data/gui/splash/splashscreen.jpg");
sf::Sprite spr(splash);
while(m_window->Running()) {
// Clearing out the window
m_window->Clear(); // RenderWindow::clear();
m_window->Draw(spr); // RenderWindow::draw(...);
m_window->Render(); // RenderWindow::display();
}
return -1;
}
Le fichier jpg est bien chargé.
Pourtant... ecran noir!
-
Le fichier jpg est bien chargé.
Comment le sais-tu ? Tu ne gères pas la valeur de retour de loadFromFile.
Essaye aussi d'ajouter une boucle d'évènements (vide) dans ta boucle principale.
-
j'ai mis if(!splash.LoadFromFile...) { exit(0); } et mon programme ne se termine pas.
J'ai egalement ajouter une boucle d'evenements...
while(m_window
->GetEvent
(event
) ) { //desktop.HandleEvent( event ); // If window is about to be closed, leave program. if(mWindow
::Closing(event
)) { exit(0); } }
Toujours ecran noir.
-
Dans ce cas essaye de mettre ce code (sans les fioritures, avec les appels SFML directement) dans un code complet minimal, et vois si ça reproduit le problème. Si c'est le cas je pourrai alors le tester chez moi.
-
Ca marche !
sf::RenderWindow window;
window.create(sf::VideoMode(800, 600, 32), "Game");
window.setFramerateLimit(60);
sf::Texture splash;
if(!splash.loadFromFile("Data/gui/splash/splashscreen.jpg"))
{
exit(0);
}
sf::Sprite spr(splash);
sf::Event event;
while(window.isOpen()) {
// Clearing out the window
window.clear();
// Event processing.
while(window.pollEvent(event) ) {
}
window.draw(spr);
window.display();
}
Donc le probleme vient de ma classe mWindow.
class mWindow
{
public:
/** Default constructor */
mWindow(Perennials* per);
/** Default destructor */
~mWindow();
inline void Render()
{
window.display();
}
inline void RenderGUI(sfg::SFGUI& gui)
{
gui.Display(window);
}
inline void Clear()
{
window.clear();
}
inline const sf::RenderWindow& GetRenderWindow()
{
return window;
}
inline bool Running() const
{
return running && window.isOpen();
}
inline bool GetEvent(sf::Event& e)
{
return window.pollEvent(e);
}
inline void resetGLStates()
{
window.resetGLStates();
}
inline void popGLStates()
{
window.popGLStates();
}
static inline bool Closing(const sf::Event& e)
{
return e.type == sf::Event::Closed;
}
template<typename T>
inline void Draw(const T& obj)
{
window.draw(obj);
}
inline const sf::Vector2u GetScreenSize() const
{
return window.getSize();
}
Perennials* GetPerennials() const { return perennial; }
protected:
private:
bool running;
sf::RenderWindow window;
Perennials* perennial;
};
-
Je ne vois rien de bizarre dans cette classe.
Puisque le code minimal fonctionne, remet des éléments de ton code original au fur et à mesure et vois à quel moment ça ne fonctionne plus. Par exemple, dans un premier temps remets la class mWindow. Puis la classe SplashScreen.
-
Etrange.
Perennials* perenial = new Perennials();
// sfml window
mWindow* w = new mWindow(perenial);
sf::Texture splash;
if(!splash.loadFromFile("Data/gui/splash/splashscreen.jpg"))
{
exit(0);
}
sf::Sprite spr(splash);
sf::Event event;
while(w->Running()) {
// Clearing out the window
w->Clear();
// Event processing.
while(w->GetEvent(event)) {
}
w->Draw(spr);
w->Render();
}
Ce code marche... donc c'est dans SplashScreen.
Tu as la fonction Run(), voici le header.
class mWindow;
class ClientSocket;
class SplashScreen: public Screen
{
public:
SplashScreen(mWindow* wd, ClientSocket* tcps)
{
m_window = wd;
m_tcpsocket = tcps;
}
~SplashScreen() {}
int Run ();
static const int ID = 1;
private:
// Common structure
sfg::SFGUI m_sfgui;
sfg::Desktop desktop;
sf::Event event;
sf::Clock clock;
};
// et voici Screen
class mWindow;
class ClientSocket;
class Screen
{
public :
virtual int Run () = 0;
mWindow* m_window;
ClientSocket* m_tcpsocket;
ClientSocket* m_udpsocket;
};
edit:
De plus, avec ce code quand je ferme l'appli je n'ai aucun probleme, avec l'original, je crash. Mais ca c'est du a sfgui il me semble.
-
Continue à mettre au fur et à mesure des éléments du code original, tu vas bien tomber sur un truc ;)
-
J'ai supprimé ma classe mWindow, et dans la fonction Run je passe directement l'objet RenderWindow par reference.
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
Ap.clear();
// Event processing.
while(App.pollEvent(event) ) {
//desktop.HandleEvent( event );
// If window is about to be closed, leave program.
if(event.type == sf::Event::Closed) {
exit(0);
}
}
App.draw(spr);
App.display();
}
return -1;
}
C'est donc une copie quasi egale à https://github.com/SFML/SFML/wiki/TutorialScreens
Toujours ecran noir.
-
Puisque ce code fonctionne lorsqu'il est tout seul dans main(), le problème vient forcément de la gestion externe de SplashScreen.
-
Bonjour,
J'ai lu le sujet rapidement et il me semble qu'il y a un léger problème là :
link options:
-lsfml-graphics-d
-lsfml-window-d
-lsfml-system-d
-lsfgui
-lopengl32
compile define:
SFML_STATIC
SFGUI_STATIC
En effet, il y a les defines pour compiler en statique alors que les bibliothèques dynamiques sont liées. :o
Il faut soit enlever les defines, soit lier avec les bibliothèques statiques (contenant "-s" ).
-
Non ceci est corrigé:
-lsfml-graphics-s-d
-lsfml-window-s-d
-lsfml-system-s-d
-lsfgui
-lopengl32
@LG:
Oui je m'en doute, mais je passe sf::RenderWindow directement. Qu'est-ce qui pourrait bien foirer le rendu ? :s
-
Avec ça :
int main()
{
sf::RenderWindow window(sf::VideoMode(800, 600), "test");
SplashScreen sp;
sp.Run(window);
return 0;
}
... ça foire ?
Normalement non, donc il faut vraiment que tu te concentres sur la gestion du splash screen et non sur son code, qui lui est correct.
-
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 :)
-
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.
-
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
-
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 :)
-
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 ;)
-
Personnellement je peux créer autant de sf::Event que je veux (j'en fait généralement une par Fenêtre).
-
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?
-
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.
-
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
-
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.
-
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