Events vom OS abfragen, Verzögerung?! (SFML)
-
Guten Tag,
ich bin mir bewusst das dies hier kein SFML Forum ist aber ich weiß nicht ob es an SFML oder C++ liegt und versuche trozdem mal mein Glück
Ich schreibe ein GUI welches ich modular für andere Programm verwenden kann.
Die Abfrage, ob ein zB. Button gedrückt wurde soll von einem zweitem Thread erledigt werden, welcher nur diese Funkton hat.Ich unterscheide zischen "Press" und "Release" damit man später zb. Objekte verschieben kann oder länder anwählen usw. ...
An sich funktioniert dies auch, aber wenn man die Taste runter drückt löst
das Programm nicht direkt "press" aus sonder es bönötigt ein weiteres Event (von pollEvent() ) bevor es registriert wird, gleiches gild auch für die Maustaste wieder los zu lassen um "release" auszulösen.Das Resultat ist wenn ich ein normlen Klick mache, also runter und hoch, wird nur "press" registriert und "release" nicht.
Wenn man nur runter drückt passiert also nichts, es sei denn man bewegt die Maus, dann bekommt das System ein neues Event und es bekommt auch die Nachricht das die Maus gedrückt wurde.
Gleiches gilt für das lösen der Taste für "release".bool game::run() { while (Window1.pollEvent(newEvent)) { EventList.push_back(newEvent); } CurrentGameState->update(*this); CurrentGameState->calculate(*this); Window1.clear(); CurrentGameState->render(*this); Window1.display(); return running; }
Die Schleife läuft immer und schiebt die Events in eine Liste.
Der nun folgede Code läuft im anderen Thread und verarbeitet die Events.void handleGUI(game* input) { sf::Vector2i v2iMousePosition; while (true) { v2iMousePosition = sf::Mouse::getPosition(); v2iMousePosition.x += -input->Window1.getPosition().x -8; v2iMousePosition.y += -input->Window1.getPosition().y -30; for (int i = 0; i < input->GUIManager.LayerGUIObjetList.size(); i++) //gucken ob die maus über einem objekt ist { for (int j = 0; j < input->GUIManager.LayerGUIObjetList[i].size(); j++) { input->GUIManager.LayerGUIObjetList[i][j]->setHoverOver(v2iMousePosition); } } int EventListSize = input->EventList.size() - 1; for (int i = 0; i < EventListSize; i++) //events durcharbeiten { for (int j = 0; j < input->GUIManager.LayerGUIObjetList.size(); j++) //die objectlayer durcharbeiten { for (int l = 0; l < input->GUIManager.LayerGUIObjetList[j].size(); l++) //objecter durcharbeiten { if (input->EventList[i].type == sf::Event::MouseButtonPressed ) //hier passt was nicht { input->GUIManager.LayerGUIObjetList[j][l]->setPressed(); } if (input->EventList[i].type == sf::Event::MouseButtonReleased) { input->GUIManager.LayerGUIObjetList[j][l]->setReleased(); } } } } for (int i = 0; i < EventListSize; i++) { input->EventList.erase(input->EventList.begin()); } input->GUIManager.UpdateGUI(); //farbe der objekte einstellen bei klick zb } }
Falls einer eine Idee hat danke ich schon mal im Vorraus.
MfG,
Rarebit.
-
Voraus wird mit einem r geschrieben, und warum setzt du EventListSize = input->EventList.size() - 1?
-
Ok, dies ist mir nicht aufgefallen, stundenlang...
Es war ein Artefakt aus der Struktur davor,
was ich mit der Variable vor hatte kann ich jetzt auch nicht mehr sagen.
Wahrscheinlich wollte ich da irgendein Element ansteuern... oder sowas.
Auf jeden Fall danke ich dir, es läuft wie es soll!Rarebit
Ps: Ok merke ich mir, danke Rechtschreibung vergesse ich immer wieder O.o