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

[SFML] sf::Event, dostęp poza pętlą

Ostatnio zmodyfikowano 2011-08-25 03:46
Autor Wiadomość
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.

C/C++
while( oknoAplikacji.GetEvent( zdarzenie ) )
{
    //tu obsługa zdarzeń
}

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?
P-39895
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"
P-39896
akwes
Temat założony przez niniejszego użytkownika
» 2011-08-25 02:29:59
Rejestrować? Są przechowywane w jakieś liście?
P-39897
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:
C/C++
e_active ** active;
ushort amount;

P-39898
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?

C/C++
class EventHandler
    : public std::list < ClickAble >
{ // ClickAble to moja klasa, której przedstawiciele reagują na Eventy
public:
    void SendEvents( sf::Event & );
};

C/C++
void EventHandler::SendEvents( sf::Event & zdarzenie )
{
    /* wywołanie na każdym obiekcie
               który jest na liście funkcji
               GetEvent(sf::Event &) */
   
    // nie mam pojecia jak ma wygladac ten kod...
    // ale cos w stylu
   
    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.

C/C++
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:
C/C++
EventList < ClickAble *> EventHandler;
Button but1( 100, 100 );
ClickAble * wsk = & but1;
EventHandler.push_back( wsk );

/* some standard code */
while( okno.GetEvent( zdarzenie ) )
{
    EventHandler.SendEvents( zdarzenie );
}
P-39900
« 1 »
  Strona 1 z 1