[SFML 3.0.2] Eventy
Ostatnio zmodyfikowano wczoraj o godz. 19:53
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.cppvoid 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
int main() { 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; }
|
|
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. 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. |
|
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ć ? 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 ); } |
|
pekfos |
» 2025-10-12 16:07:49 I czemu ma to służyć? |
|
tBane Temat założony przez niniejszego użytkownika |
» 2025-10-12 17:05:45 to jak Ty byś to zaprogramował ? |
|
pekfos |
» 2025-10-12 17:44:49 Po prostu przekaż każdy event do każdego obiektu. Najlepiej w pętli. |
|
tBane Temat założony przez niniejszego użytkownika |
» 2025-10-12 18:01:37 ok.. jutro spróbuję to poprawić |
|
« 1 » |