[SFML] sf::Event, dostęp poza pętlą
Ostatnio zmodyfikowano 2011-08-25 03:46
akwes Temat założony przez niniejszego użytkownika |
[SFML] sf::Event, dostęp poza pętlą » 2011-08-25 01:04:44 Witam. W SFML proponuje się obsługę zdarzeń przez zagnieżdżenie pętli while w nieskończonej pętli programu. while( oknoAplikacji.GetEvent( zdarzenie ) ) { }
Poza pętlą zdarzenie nie przestawia faktycznego stanu rzeczy. Co jeżeli w wielu klasach potrzebuje szczegółowy dostęp do zdarzeń? Czyli bardziej rozbudowany niż ten z sf::Input, a odbieranie z sf::Event poza pętlą nie ma sensu. Macie jakieś rozwiązania? Czy rozwiązaniem będzie stworzyć własną klasę, która w pętli zapamięta wszystkie zdarzenia, a przed kolejnym obiegiem je zresetuje? |
|
kamillo121 |
» 2011-08-25 02:00:46 Ja to rozwiązałem w ten sposób, że każdy obiekt w programie(dla przykładu gra, obiekt gracz, przeciwnik, dźwignia, kamera) może być aktywne bądź statyczne(dziedziczy klasę active albo static). Obiekt active charakteryzuje się tym, że posiada metodę catch event, która przyjmuje obiekt zdarzenie(i w razie potrzeby wsk obiektu wchodzącego w interakcję). Mając taką podstawę utworzyłem klasę do zarządzania zdarzeniami, do której można "rejestrować" aktywne obiekty. Taki zarządca w pętli ze zdarzeniami po prostu je rozsyła do każdych zarejestrowanych obiektów.
// oczywiście dziedziczy sam interface, który potem uzupełniam o ciało w klasach "właściwych" |
|
akwes Temat założony przez niniejszego użytkownika |
» 2011-08-25 02:29:59 Rejestrować? Są przechowywane w jakieś liście? |
|
kamillo121 |
» 2011-08-25 02:49:29 Rejestrowane czyli wskaźnik na obiekt aktywny jest dodawany do listy oczekujących na zdarzenia(takie rozwiązanie jest bardzo przydatne bo można rozwiniętą interakcję stworzyć). Ja je przechowuje moim ulubionym sposobem czyli: e_active ** active; ushort amount;
|
|
akwes Temat założony przez niniejszego użytkownika |
» 2011-08-25 03:46:22 Hm... Lista rozsyła Event do wszystkich? Chciałbym rozszerzyć std::list o własną funkcję, idzie to zrobić w ten sposób? class EventHandler : public std::list < ClickAble > { public: void SendEvents( sf::Event & ); };
void EventHandler::SendEvents( sf::Event & zdarzenie ) { ClickAble * obiekt = glowa; while( obiekt ) { obiekt->GetEvent( zdarzenie ); obiekt = obiekt->next; } }
Strasznie mi się gryzą typy... Muszę to jako szablon zrobić? edit. Dobra, jako szablon przeszło edit2: Sam nie mogłem tego za... za nic znaleźć w sieci :P Może źle szukałem. Jak rozszerzyć funkcjonalność klasy pojemnikowej std::list o własne funkcje składowe, oraz jak w tej funkcji wykonać jakąś funkcję składową na rzecz tych obiektów. template < class T > class EventList : public std::list < T > { public: EventList(); void SendEvents( sf::Event & ); };
template < class T > EventList < T >::EventList() { }
template < class T > void EventList < T >::SendEvents( sf::Event & zdarzenie ) { std::list < T >::iterator itr = this->begin(); while( itr != this->end() ) { ( * itr )->GetEvent( zdarzenie ); itr++; } }
Dzięki temu lista z wskaźnikami na obiekt ClickAble, wykona funkcję GetEvent(sf::Event&) dla każdego na liście. Czyli u mnie: EventList < ClickAble *> EventHandler; Button but1( 100, 100 ); ClickAble * wsk = & but1; EventHandler.push_back( wsk );
while( okno.GetEvent( zdarzenie ) ) { EventHandler.SendEvents( zdarzenie ); }
|
|
« 1 » |