IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SFML Discussion :

Tentative d'affichage "temps réel" carré de sélection


Sujet :

SFML

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 27
    Points : 13
    Points
    13
    Par défaut Tentative d'affichage "temps réel" carré de sélection
    Bonjour,
    j'essaie depuis ce soir de faire un petit système qui permet de faire une sélection ( comme window ) en sfml sauf que il se trouve que mon carré ne s'affiche uniquement quand je lâche la souris, alors que je voudrais qu'il l'affiche quand je bouge la souris en maintenant le clique gauche enfoncé. En espérant que vous pourrez m'aider :

    main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
     
    #include <cstdlib>
    #include <iostream>
    #include <SFML/Graphics.hpp>
    #include <unistd.h>
    #include <list>
     
     
    using namespace sf;
    using namespace std;
    #include <SFML/Graphics.hpp>
     
     
    int main()
    {
        sf::RenderWindow window(sf::VideoMode(500, 500), "Test 1 ");
        sf::RectangleShape rectangle;
     
        int posOriginelSelectX = 0, posOriginelSelectY = 0, postempX =-1, postempY = -1, firstClick = 1;
     
     
     
        while (window.isOpen())
        {
     
     
            window.clear(sf::Color::Black);
            sf::Event event;
     
     
            while (window.pollEvent(event))
            {
     
                Mouse::Button button = event.mouseButton.button;
     
     
     
                if (event.type == sf::Event::Closed)
                {
                    window.close();
                }
     
     
     
     
     
                int coordSourisX(event.mouseButton.x);
                int coordSourisY(event.mouseButton.y);
     
     
                if (event.type == sf::Event::MouseButtonPressed)
                {
     
                    if (button == Mouse::Left)
                    {
     
                        posOriginelSelectX = coordSourisX;
                        posOriginelSelectY = coordSourisY;
                        rectangle.setSize(sf::Vector2f(0, 0));
     
     
     
                    }
                }
     
                if (event.type == sf::Event::MouseButtonReleased)
                {
     
                    if (button == Mouse::Left)
                    {
     
                        postempX = coordSourisX;
                        postempY = coordSourisY;
     
                    }
                }
     
     
     
     
            }
     
     
     
     
     
            rectangle.setSize(sf::Vector2f(10, 10));
            rectangle.setFillColor(sf::Color::Blue);
            rectangle.setPosition(posOriginelSelectX, posOriginelSelectY);
            rectangle.setSize(sf::Vector2f(postempX-posOriginelSelectX, postempY-posOriginelSelectY));
     
            window.draw(rectangle);
     
     
            window.display();
     
     
     
            window.setFramerateLimit(50);
     
     
     
        }
     
     
     
        return 0;
    }
    En espérant que vous pourrez m'aider, cordialement Spiritus44.

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Bonjour,
    Pour un tel cas, je n'utilise pas de PollEvent, ni même une boucle, car en effet, la boucle va casser l'affichage "temps réel".
    J'utiliserai plus des fonction asynchrone, dans le sens, non liés directement aux événements, comme : sf::Mouse::getPosition() et sf::Mouse::isButtonPressed().
    Précisément, à chaque update, je vérifie si :
    • un bouton a été appuyé
      • Si c'est la première fois, j'initialise mon carré (position haut gauche)
      • Sinon, je mets à jour la position bas droite
    • si aucune bouton n'est appuyé, je valide la sélection par le carré, ou sinon, je ne fait rien
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 27
    Points : 13
    Points
    13
    Par défaut
    Merci bien, il se trouve que votre technique correspond parfaitement à mes besoins. Merci beaucoup.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 27
    Points : 13
    Points
    13
    Par défaut
    J'ai éssayé d'appliqué votre technique mais sans succès, pouvez vous encore m'aidez ? Qu'ais-je fais de mal dans ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    #include <cstdlib>
    #include <iostream>
    #include <SFML/Graphics.hpp>
    #include <unistd.h>
    #include <list>
     
     
    using namespace sf;
    using namespace std;
    #include <SFML/Graphics.hpp>
     
     
    int main()
    {
        sf::RenderWindow window(sf::VideoMode(500, 500), "Test 1 ");
        sf::RectangleShape rectangle;
     
        int posOriginelSelectX = 0, posOriginelSelectY = 0, postempX =-1, postempY = -1, firstClick = 1;
     
     
     
        while (window.isOpen())
        {
     
     
            window.clear(sf::Color::Black);
            sf::Event event;
     
     
            while (window.pollEvent(event))
            {
     
     
                if (event.type == sf::Event::Closed)
                {
                    window.close();
                }
     
            }
     
     
                Mouse::Button button = event.mouseButton.button;
                int coordSourisX(event.mouseButton.x);
                int coordSourisY(event.mouseButton.y);
     
     
                if (event.type == sf::Event::MouseButtonPressed)
                {
     
                    if (button == Mouse::Left && firstClick==1)
                    {
     
                        posOriginelSelectX = coordSourisX;
                        posOriginelSelectY = coordSourisY;
                        rectangle.setSize(sf::Vector2f(0, 0));
                        firstClick=0;
     
     
                    }
                    else
                    {
                        postempX = coordSourisX;
                        postempY = coordSourisY;
     
                    }
                }
     
                if (event.type == sf::Event::MouseButtonReleased)
                {
     
                    if (button == Mouse::Left)
                    {
     
                        firstClick=0;
                    }
                }
     
            rectangle.setSize(sf::Vector2f(10, 10));
            rectangle.setFillColor(sf::Color::Blue);
            rectangle.setPosition(posOriginelSelectX, posOriginelSelectY);
            rectangle.setSize(sf::Vector2f(postempX-posOriginelSelectX, postempY-posOriginelSelectY));
     
            window.draw(rectangle);
     
     
            window.display();
     
     
     
            window.setFramerateLimit(50);
     
     
     
        }
     
     
     
        return 0;
    }

  5. #5
    Membre émérite Avatar de Cirrus Minor
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2014
    Messages
    953
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2014
    Messages : 953
    Points : 2 612
    Points
    2 612
    Par défaut
    Bonjour, tu peux faire un truc comme ça (voir code).
    J'ai changé un peu ton programme, j'ai commenté les modifications.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    #include <SFML/Graphics.hpp>
     
    int main()
    {
      sf::RenderWindow window(sf::VideoMode(500, 500), "Test 1 ");
      sf::RectangleShape rectangle;
     
      // On va créer un rectangle bleu transparent avec un bord plus net
      rectangle.setOutlineThickness(1);
      rectangle.setOutlineColor(sf::Color::Blue);
      rectangle.setFillColor(sf::Color(0, 0, 255, 64));
     
      // On ne précise le framerate qu'une fois, après la création de la fenêtre
      window.setFramerateLimit(50);
     
      int posOriginelSelectX = 0;
      int posOriginelSelectY = 0;
      bool isDragging = false;  // Un flag qui passera à "vrai" lors d'un appui
     
      while (window.isOpen())
      {
        window.clear(sf::Color::Black);
     
        // Ici je stocke la position actuelle de la souris
        sf::Vector2i localPosition = sf::Mouse::getPosition(window);
        sf::Event event;
     
        while (window.pollEvent(event))
        {
          if (event.type == sf::Event::Closed)
          {
            window.close();
          }
     
          if (event.type == sf::Event::MouseButtonPressed)
          {
            // Lors d'un appui, je positionne la position du rectangle
            posOriginelSelectX = localPosition.x;
            posOriginelSelectY = localPosition.y;
            rectangle.setPosition(posOriginelSelectX, posOriginelSelectY);
     
            isDragging = true;
          }
     
          if (event.type == sf::Event::MouseButtonReleased)
          {
            isDragging = false;
            // Ici je traiterai la sélection :
            // appel d'une méthode, création d'un évenement, etc...
          }
        }
     
        if (isDragging)
        {
          // Ici, je calcule simplement la nouvelle taille du rectangle
          rectangle.setSize(sf::Vector2f(localPosition.x - posOriginelSelectX,
                                         localPosition.y - posOriginelSelectY));
          window.draw(rectangle);
        }
        window.display();
      }
      return 0;
    }

  6. #6
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 27
    Points : 13
    Points
    13
    Par défaut
    Et bien merci beaucoup, je ne sais pas se qui ne marchais pas, avec mon code plus haut, mais franchement merci ( à toi aussi LittleWhite ). Des fois je me demande pourquoi je suis aussi incapable.

  7. #7
    Membre émérite Avatar de Cirrus Minor
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2014
    Messages
    953
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2014
    Messages : 953
    Points : 2 612
    Points
    2 612
    Par défaut
    Citation Envoyé par Spiritus44 Voir le message
    je ne sais pas se qui ne marchais pas, avec mon code plus haut
    Et bien, tu ne mettais à jour la position de la souris que lors d'un appui sur un bouton qui n'est pas le bouton de gauche (tu t'es un peu emmêlé avec les events).
    Et tes tests sur les événements souris n'étaient pas dans la boucle de traitement des événements.
    Et tu mettais à jour la position de la souris à l'aide d'un événement sans savoir quel est cet événement (c'est ce que j'ai remplacé par le sf::Mouse::getPosition comme conseillé par LittleWhite !

    Je te conseille de bien revoir ton code et le mien, et de bien comprendre ce qu'il se passe - il n'y a pas tant de ligne de code que ça- et de ne pas hésiter à poser des questions. Ce sont des choses que tu feras très souvent en programmation graphique / jeux, la gestion des entrées !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Affichage en temps réel ??
    Par haffouff dans le forum Langage
    Réponses: 2
    Dernier message: 11/05/2006, 21h57
  2. Affichage en temps réel du résultat d'un thread
    Par bradley vier dans le forum MFC
    Réponses: 14
    Dernier message: 28/03/2006, 15h56
  3. Affichage en temps réel...
    Par beral dans le forum C++Builder
    Réponses: 6
    Dernier message: 09/02/2006, 12h05
  4. [WD9] Affichage en temps réel
    Par oz80 dans le forum WinDev
    Réponses: 4
    Dernier message: 11/01/2006, 14h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo