Installation de la SFML

a marqué ce sujet comme résolu.

Bonjour,

J’essaye d’installer la SFML. Je suis sous Windows 10 avec CLion. À la compilation de mon projet, il ne me met pas d’erreur, l’autocomplétion des classes de la bibliothèque fonctionne également correctement. Je n’ai juste aucune fenêtre, rien ne s’affiche. Voici mon code :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#include <SFML/Graphics.hpp>

int main() {
    sf::RenderWindow window(sf::VideoMode(800, 200), "Hello from SFML");

    while (window.isOpen()) {
        sf::Event event{};

        while (window.pollEvent(event)) {
            if (event.type == sf::Event::Closed)
                window.close();
        }

        window.display();
    }

    return 0;
}

Et mon cmake :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
cmake_minimum_required(VERSION 3.9)
project(HelloWorld)

set(CMAKE_CXX_STANDARD 14)

add_executable(HelloWorld main.cpp)

set(SFML_ROOT "D:/Bibliotheques/SFML-2.4.2")
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake_modules")
find_package(SFML REQUIRED system window graphics network audio)
if (SFML_FOUND)
    include_directories(${SFML_INCLUDE_DIR})
    link_directories(${SFML_ROOT})
    target_link_libraries(HelloWorld ${SFML_LIBRARIES})
endif()

Le script findSFML est dans le dossier cmake_modules. Mais je ne pense pas qu’il ne trouve pas la bibliothèque sinon il me le dirait non?

Merci de votre aide !

Pour un fonctionnement normale de la SFML, il faut faire un

window.clear();
window.display();

Je suis pas expert, mais je crois que ça un rapport avec un double buffer utiliser en interne avec OpenGL

Et autre chose que j’ai remarqué mais qui n’est pas dit dans la doc (il me semble) c’est quand sans la boucle d’événement il y a des comportements inattendus (pas besoins de faire tout les cas de l’event, suffit de faire un minimum comme ça:

1
2
3
4
5
while (window.pollEvent(event)) {
    if (event.type == sf::Event::Closed)
        window.close();

}

PS: je viens de tester avec Xcode + SFML et ton code fonctionne en rajoutant le window.clear();

EDIT

Enfait c’est bien dit ici qu’il faut tjrs .clear() .draw() .display()

Ce cycle clear/draw/display est la seule bonne manière de dessiner. N’essayez pas d’autres stratégies, telles que garder certains pixels de la frame précédente, "effacer" des pixels, ou bien encore dessiner une seule fois et appeler display plusieurs fois. Vous obtiendrez des résultats bizarres à cause du double buffering. Les puces et les APIs graphiques modernes sont vraiment faites pour des cycles clear/draw/display répétés, où tout est complètement rafraîchi à chaque itération de la boucle de dessin. Ne soyez pas effrayés de dessiner 1000 sprites 60 fois par seconde, vous êtes encore loin des millions de triangles que votre machine peut gérer.

+0 -0

Hello, quelques remarques

  • tu n’as pas besoin de tester SFML_FOUND parce que tu as précisé que SFML était requis
  • généralement SFML_ROOT est plutot défini dans ton cmakecache pour faciliter le partage de ton soft

Par rapport a ton probleme, as-tu utilisé un debogueur pour voir si tu arrivais jusqu’au display ?

D’accord merci. Effectivement, le debogeur va peut-être nous aider. J’ai mis des breakpoints dans ma fonction main et pourtant le programme continuait de s’exécuter comme si de rien n’étais. J’ai donc essayé d’afficher du texte. Ce qui me donne ce simple programme :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <SFML/Graphics.hpp>
#include <iostream>

int main() {
    std::cout << "hello" << std::endl;
    sf::RenderWindow window(sf::VideoMode(800, 200), "Hello from SFML");


    while (window.isOpen()) {
        sf::Event event{};

        while (window.pollEvent(event)) {
            if (event.type == sf::Event::Closed)
                window.close();
        }

        window.clear();
        window.display();
    }

    return 0;
}

Et bien rien ne s’affiche dans la console. Par contre si je supprime tout le code lié à la SFML, pas de soucis…

Justement, dans le débogueur, même en mettant mes breakpoints (les points où il est sensé s’arrêter) il ne s’arrête pas. C’est à dire qu’en reprenant mon code :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <SFML/Graphics.hpp>
#include <iostream>

int main() {
*    std::cout << "hello" << std::endl;
*    sf::RenderWindow window(sf::VideoMode(800, 200), "Hello from SFML");


    while (window.isOpen()) {
*       sf::Event event{};

        while (window.pollEvent(event)) {
            if (event.type == sf::Event::Closed)
                window.close();
        }

*       window.clear();
*       window.display();
    }

    return 0;
}

Les étoiles représentent les breakpoints. Il s’en fiche. Alors que si je supprime tout le code de la sfml en ne laissant le breakpoints devant que le std::cout, il s’arrête bien. Je ne comprend rien.

Un breakpoint permet de stopper le programme, mais tu peux également stopper le programme toi-même et regarder où il en est. Ça te permettra de savoir où tu es bloqué, typiquement si SFML renomme main en une autre fonction et utilise sa propre fonction main.

Il y a donc de fortes chances que ça vienne de là. Les cartes graphiques NVidia c’est pas la joie quand on code des applis graphiques d’après ce que j’ai vu à plusieurs reprises par ci par là sur le web de façon générale.

C’est un peu hatif comme commentaire quand même.

En tout cas avant de tester des solutions au pif, savoir où ça plante t’aidera non seulement à décider quoi faire pour le corriger, mais permettra également de comprendre d’où ça vient.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte