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.