Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML 3.0.2] Eventy

Ostatnio zmodyfikowano wczoraj o godz. 19:53
Autor Wiadomość
tBane
Temat założony przez niniejszego użytkownika
[SFML 3.0.2] Eventy
» 2025-10-12 09:20:49
Cześć. Próbuję napisać dobrą obsługę eventów. Czy da się jakoś ulepszyć kod zamieszczony poniżej?

fragment Button.cpp
C/C++
void NormalButton::handleEvent( const sf::Event & event ) {
   
if( _sprite.getGlobalBounds().contains( worldMousePosition ) ) {
       
       
if( const auto * mbp = event.getIf < sf::Event::MouseButtonPressed >(); mbp && mbp->button == sf::Mouse::Button::Left ) {
           
ElementGUI_pressed = this;
       
}
       
else if( const auto * mbr = event.getIf < sf::Event::MouseButtonReleased >(); mbr && mbr->button == sf::Mouse::Button::Left ) {
           
if( ElementGUI_pressed == this ) {
               
click();
           
}
        }
       
    }
}

fragment main.cpp
C/C++
int main() {
   
   
// ...
   
    // handle events
   
while( const std::optional ev = window->pollEvent() ) {
       
       
if( ev->is < sf::Event::Closed >() )
           
 window->close();
       
       
if( const auto * mbp = ev->getIf < sf::Event::MouseButtonPressed >() ) {
           
button1->handleEvents( * ev );
           
button2->handleEvents( * ev );
           
button3->handleEvents( * ev );
           
button4->handleEvents( * ev );
       
}
    }
   
   
// ...
   
   
return 0;
}
P-183094
pekfos
» 2025-10-12 13:31:48
Ten kod się zachowa błędnie jeżeli będziesz przeciągać kursor z obszaru _sprite na zewnątrz lub do wewnątrz. Możesz doprowadzić do sytuacji że przycisk jest puszczony, a ElementGUI_pressed jest oznaczone.

C/C++
if( const auto * mbp = ev->getIf < sf::Event::MouseButtonPressed >() ) {
   
button1->handleEvents( * ev );
   
button2->handleEvents( * ev );
   
button3->handleEvents( * ev );
   
button4->handleEvents( * ev );
}
Po pierwsze pętla, po drugie nie filtruj zdarzeń tutaj. Przycisk obsługuje też MouseButtonReleased, którego nie puszczasz.
P-183095
tBane
Temat założony przez niniejszego użytkownika
» 2025-10-12 15:45:35
Wiem, o tym. Dla każdego rodzaju eventu wywołuje odpowiednie funkcje obsługująco zdarzenia. Tylko ten pointer mi sie nie podoba. Da się to inaczej napisać ?

C/C++
// handle events
while( const std::optional event = window->pollEvent() ) {
   
   
if( event->is < sf::Event::Closed >() )
       
 window->close();
   
   
if( event->getIf < sf::Event::MouseButtonPressed >() ) {
       
       
toolbar->handleEvent( * event );
       
main_menu->handleEvent( * event );
       
       
for( auto & dialog: dialogs )
           
 dialog->handleEvent( * event );
       
       
frames_dialog->handleEvent( * event );
       
layers_dialog->handleEvent( * event );
       
       
canvas->handleEvent( * event );
   
}
   
else if( event->getIf < sf::Event::MouseButtonReleased >() ) {
       
       
toolbar->handleEvent( * event );
       
main_menu->handleEvent( * event );
       
       
       
for( auto & dialog: dialogs )
           
 dialog->handleEvent( * event );
       
       
frames_dialog->handleEvent( * event );
       
layers_dialog->handleEvent( * event );
       
       
canvas->handleEvent( * event );
   
}
   
   
// itd. ..
   
P-183101
pekfos
» 2025-10-12 16:07:49
I czemu ma to służyć?
P-183102
tBane
Temat założony przez niniejszego użytkownika
» 2025-10-12 17:05:45
to jak Ty byś to zaprogramował ?
P-183107
pekfos
» 2025-10-12 17:44:49
Po prostu przekaż każdy event do każdego obiektu. Najlepiej w pętli.
P-183111
tBane
Temat założony przez niniejszego użytkownika
» 2025-10-12 18:01:37
ok.. jutro spróbuję to poprawić
P-183113
« 1 »
  Strona 1 z 1