Bonjour !
Je suis assez déconcerté par un bug que j'ai eu assez subitement avec la SFML : je travaillais sous Linux, ai porté mon projet sous Windows, et à mon retour sous Linux après relativement peu de modifications, je fais une segfault sur pollEvent(...) alors que je n'ai rien modifié du bout de code qui plante. Une ancienne version compilée marche toujours, mais pas la nouvelle...
Voici le bout de code qui plante :
/* Project : Particules
* Version : 0.31
*/
#include "fenetre.h"
using namespace std;
Fenetre::Fenetre()
: m_pause(false), m_continue(true), m_fullscreen(true) {
cfg = ConfigParser::get();
cfgWindowTitle = cfg->readString("windowTitle");
cfgWindowWidth = cfg->readInt("windowWidth");
cfgWindowHeight = cfg->readInt("windowHeight");
// mode fenetre
m_window = new sf::RenderWindow(sf::VideoMode(cfgWindowWidth, cfgWindowHeight, 32), cfgWindowTitle);
// mode plein ecran
//m_window = new sf::RenderWindow(sf::VideoMode::getFullscreenModes()[0], cfgWindowTitle, sf::Style::Fullscreen);
m_window->setVerticalSyncEnabled(true);
m_font.loadFromFile("Square.ttf");
particleSystem = new ParticleSystem(m_window->getSize().x, m_window->getSize().y, m_font);
textFps.setFont(m_font);
textFps.setCharacterSize(10);
textFps.setStyle(sf::Text::Bold);
textFps.setColor(sf::Color::Red);
textFps.setPosition(m_window->getSize().x - 100, 10);
clock.restart();
clockText.restart();
}
Fenetre::~Fenetre() {
delete m_window;
delete particleSystem;
}
int Fenetre::exec() {
while (m_continue && m_window->isOpen()) {
dt = clock.restart().asSeconds();
handleEvents();
if (!m_pause)
update();
display();
}
return EXIT_SUCCESS;
}
void Fenetre::handleEvents() {
sf::Event event;
/*************** ICI **************/
while (m_window->pollEvent(event))
{
// ...
}
}
void Fenetre::update() {
if (clockText.getElapsedTime().asSeconds() >= 1.) {
std::ostringstream oss;
oss << "FPS : " << (int) (1/dt);
textFps.setString(oss.str());
clockText.restart();
}
particleSystem->update(dt);
}
void Fenetre::display() {
m_window->clear();
particleSystem->display(m_window);
m_window->draw(textFps);
m_window->display();
}
void Fenetre::updateWindowSize(const int width, const int height) {
sf::View view(sf::FloatRect(0, 0, width, height));
m_window->setView(view);
particleSystem->setWindowSize(sf::Vector2f(width, height));
textFps.setPosition(width - 100, 10);
}
Ce que gdb en dit :
61 while (m_window->pollEvent(event))
(gdb) s
sf::Window::pollEvent (this=0x808a090, event=...)
at /home/adrien/Sources/SFML2.0/src/SFML/Window/Window.cpp:183
183 if (m_impl && m_impl->popEvent(event, false))
(gdb) bt
#0 sf::Window::pollEvent (this=0x808a090, event=...)
at /home/adrien/Sources/SFML2.0/src/SFML/Window/Window.cpp:183
#1 0x0804d79e in Fenetre::handleEvents (this=0xbffff300)
at ./fenetre.cpp:61
#2 0x0804d499 in Fenetre::exec (this=0xbffff300) at ./fenetre.cpp:47
#3 0x0804c542 in main (argc=1, argv=0xbffff514) at ./main.cpp
Je suis sous Ubuntu 10.04 avec Awesome comme gestionnaire de fenetres. Je ne pense pas que ca soit très utile sachant que mon précédent projet marche très bien sous cette configuration (j'ai pas essayé de le recompiler cela dit, je fais ca de suite)
J'ai lu que ce genre de problème pouvait venir d'un conflit entre versions de la SFML (j'avais effectivement la version des dépots installée avant ca). J'ai désinstallé le paquet, supprimé toute trace de la SFML dans /usr/, et recompilé en suivant les indications de ce tuto :
http://sfmlcoder.wordpress.com/2011/08/16/building-sfml-2-0-with-make-for-gcc/.
Merci d'avance pour votre aide !
Edit :
En réinstallant SFML2.0 que je viens de télécharger depuis le site officiel, je vois que sf::Keyboard::Back n'existe plus mais est remplacé par sf::Keyboard::BackSpace. C'est pas noté dans la doc...