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