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

Langage C++ Discussion :

Problème : variable non modifiée dans mon BSP-TREE!


Sujet :

Langage C++

  1. #1
    Invité
    Invité(e)
    Par défaut Problème : variable non modifiée dans mon BSP-TREE!
    Salut!

    J'essaye de modifier une variable d'un BSP-TREE via une autre classe, je retourner donc un pointeur sur le BSP-TREE comme ceci :

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    Action* Command::getAction() {
        return action.get();
    }

    Dans un thread je passe des événements, et, si ce sont des événements de type keyreleased alors je remet une variable à "false" pour indique que la touche correspondant à l'action a été relâchée et que donc l'action peut à nouveau se répéter une fois. (pour les actions de type KEY_PRESSED_ONCE par exemple)

    Code cpp : 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
     
     void pushEvent(sf::Event event) {
             std::lock_guard<std::recursive_mutex> locker(rec_mutex);
             std::map<std::string, Command>::iterator it;
             for (it = commands.begin(); it != commands.end(); it++) {
                if(it->second.containsBufferEvent(event) && !it->second.containsEvent(event)) {
                    Command::pushEvent(event);
                }
                if(it->second.getAction() != nullptr) {
                    Action* action = it->second.getAction();
                    std::vector<sf::Event> events;
                    action->getEvents(events);
                    for (unsigned int i = 0; i < events.size(); i++) {
                        if ((event.type == sf::Event::KeyReleased && events[i].type == sf::Event::KeyPressed && event.key.code == events[i].key.code) ||
                             (event.type == sf::Event::MouseButtonReleased && events[i].type == sf::Event::MouseButtonPressed && event.mouseButton.button == events[i].mouseButton.button)) {
                              it->second.getAction()->setPressed(events[i]);
                        }
                    }
                }
     
             }
         }

    Hors je ne sais pour quelle raison, ici ma variable booléenne est bien modifiée :

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void Action::setPressed(sf::Event event) {
        if (!leaf) {
            leftChild->setPressed(event);
            rightChild->setPressed(event);
        } else {
            if ((type == KEY_PRESSED_ONCE && event.key.code == startEvent.key.code) ||
                (type == MOUSE_BUTTON_PRESSED_ONCE && event.mouseButton.button == startEvent.mouseButton.button)) {
                 pressed = false;
                 std::cout<<"released : "<<pressed<<" "<<event.key.code<<" "<<startEvent.key.code<<std::endl;
            }
        }
    }

    Et ça marche bien si mon BSP-TREE ne contient qu'un événement, par contre, si mon BSP-TREE contient plusieurs événements (et donc des fuilles) alors la, la variable booléenn pressed n'est plus modifiée en dehors de la fonction pushEvent du thread, donc ici, elle reste toujours à true pour les feuilles du BSP-TREE :

    Code cpp : 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
     
    bool Action::isTriggered () {
     
        if (leaf) {
            vector<sf::Event> events = Command::getEvents();
            if (type == KEY_HELD_DOWN && !is_not) {
                return sf::Keyboard::isKeyPressed(startEvent.key.code);
            }
            if (type == KEY_HELD_DOWN && is_not) {
                return !sf::Keyboard::isKeyPressed(startEvent.key.code);
            }
            if (type == MOUSE_BUTTON_HELD_DOWN && !is_not) {
                return sf::Mouse::isButtonPressed(startEvent.mouseButton.button);
            }
            if (type == MOUSE_BUTTON_HELD_DOWN && is_not) {
                return !sf::Mouse::isButtonPressed(startEvent.mouseButton.button);
            }
            /*else if (type == JOYSTICK_BUTTON_HELD_DOWN)
                return sf::Joystick::isButtonPressed(startEvent.joystickButton.button);*/
            for (unsigned int i = 0; i < events.size(); i++) {
                /*if (type == KEY_HELD_DOWN || type == MOUSE_BUTTON_HELD_DOWN) {
                    if (!is_not)
                        return Command::equalEvent(events[i], startEvent);
                    else
                        return !Command::equalEvent(events[i], startEvent);
                } else {*/
                    std::cout<<"pressed : "<<pressed<<" "<<events[i].key.code<<" "<<startEvent.key.code<<std::endl;
                    if (!is_not && !pressed && Command::equalEvent(events[i], startEvent)) {
                        pressed = true;
                        return true;
                    } else if (is_not && !pressed && !Command::equalEvent(events[i], startEvent)) {
                        pressed = true;
                        return true;
                    }
               // }
            }
            return false;
     
        } else {
            return comparator(*leftChild, *rightChild);
        }
    }

    Bref, je ne sais plus quoi faire pour résoudre ce problème.

    Merci d'avance pour votre aide.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Re,
    bon après une journée de recherche j'ai résolu mon problème.

    J'avais simplement oublier le std::ref ici :

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    } else {
            return comparator(std::ref(*leftChild), std::ref(*rightChild));
        }

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

Discussions similaires

  1. Problème de variables de session dans mon serveur
    Par mano2003 dans le forum Langage
    Réponses: 5
    Dernier message: 08/10/2012, 13h32
  2. variable non reconnue dans une requête sql
    Par sanatou dans le forum C++
    Réponses: 3
    Dernier message: 13/12/2006, 17h43
  3. Réponses: 2
    Dernier message: 10/07/2006, 10h07
  4. Visualiser un fichier xls dans Excel (et non pas dans mon navigateur)
    Par n@n¤u dans le forum Général Conception Web
    Réponses: 10
    Dernier message: 10/07/2006, 08h43
  5. Réponses: 1
    Dernier message: 07/10/2005, 10h44

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