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.
Partager