Autor Wątek: Wybór systemu zdarzeń GUI  (Przeczytany 1585 razy)

Offline PsichiX (ΨΧΞ)

  • Użytkownik
    • PsichiX Website

# Sierpień 24, 2010, 11:29:35
Witam, chcę zmienić system zarządzania zdarzeniami interfejsu bo obecny nie spełnia moich wymagań, a jest nim system oparty na komunikatach (może źle skonstruowany albo już ma taką wadę ten system). Głównie chodzi mi o to że robiąc nowe GUI potrzebuję zrobić animowane okna oraz drag & drop i przesuwanie okien a komunikaty nie mogą łączyć się by sprawdzić jednocześnie czy kliknąłem i trzymam przycisk myszy na oknie i poruszam myszką.
Nasuwa się pytanie: jak to jest zrobione w lepszych systemach takich jak np. Qt czy wxWidgets? czy to działa na zasadzie że konkretne zdarzenia wywołują konkretne metody wirtualnej klasy kontrolki? wtedy to wychodzi na to samo co z komunikatami, tyle że logiczniej to wygląda. czy może zdarzenia zmieniają stany kontrolki a co klatke wywoływana jest metoda Update() kontrolki która dostosowuje siędo tych stanów? ale wtedy przetwarzanie każdej kontrolki, jeśli ich będzie sporo, może dużo czasu kosztować.
Byłbym rad wiedząc jakich rozwiązań Wy użyliście :)

BTW. widziałem kiedyś super gui, strony nie pamiętam ale były wypisane gry które z niego korzystały, w tym: far cry 2, crysis 1 - wie ktoś z Was jak się to gui nazywało albo zna ktoś z Was stronę www? bardzo tego poszukuję już od wczoraj. kojarzy mi sięz tym jakieś "Ultimate GUI" ale nic konkretnego pod tym hasłem google nie pokazuje.
« Ostatnia zmiana: Sierpień 24, 2010, 11:39:33 wysłana przez PsichiX »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Struś

  • Użytkownik
    • Grupa o charakterze paramilitarnym FIA

# Sierpień 24, 2010, 12:20:21
Co do "super GUI":
http://www.scaleform.com/

Ale FC2 z tego co widzę tego nie używał, Crysis owszem :P I jeszcze kilka "dużych" gier.

Offline PsichiX (ΨΧΞ)

  • Użytkownik
    • PsichiX Website

# Sierpień 24, 2010, 12:49:03
a to jednak fc1 byl nie 2 ;p
dziekuje za adres strony :)
bylbym jeszcze wdzieczny za odpowiedz na pytanie :D

st3tc

  • Gość
# Sierpień 24, 2010, 13:21:18
Pomyśl o obserwatorach (wzorzec obserwator). Bardzo fajny przykład gdzie to jest masz w gtkmm (niestety nie mogę jej polecić z czystym sumieniem, ale nie ze względu na samo gtkmm a na swajczone gtk+ i beznadziejny support developerow gtk+ ;)). Gtkmm używa bardzo wygodnej biblioteczki do tego: libsigc++. Relatywnie lekka, można używać też do innych rzeczy (np zdarzenia z z różnych modułów gry/silnika itp). Na obserwatorach są też zbudowane zdarzenia w formsach .NET-owych.

IMHO duży plastyczniejszy i wygodniejszy mechanizm niż funkcje wirtualne, komunikaciki itp itd.

Offline PsichiX (ΨΧΞ)

  • Użytkownik
    • PsichiX Website

# Sierpień 24, 2010, 14:28:14
Dzieki, ten wzorzec obserwatora to niezly motyw, w sam raz do tego co potrzebuje :)

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Sierpień 24, 2010, 18:56:30
Jakiś główny Update wywoływany co "klatkę" to jest raczej rozwiązanie typowo growe i niespotykane w systemach GUI. Natomiast rozdzielanie zdarzeń na wywołania poszczególnych metod klasy robione jest za pomocą dziwnych haków, makr, templatów albo nawet własnego preprocesora (Qt) z powodu braku w C++ mechanizmu wskaźników na metody takiego, jaki ma C#, Delphi i każdy inny cywilizowany język. Dlatego własne rozwiązanie tego rodzaju jest podstawą każdego systemu GUI. Można je zrobić samemu albo skorzystać z gotowej biblioteki, jak np. FastDelegate. Więcej o tym:
http://wiki.warsztat.gd/Warsztat_FAQ#Jak_zrobi.C4.87_w_C.2B.2B_wska.C5.BAnik_do_metody_w_klasie.3F

Inne rozwiązanie to jakaś kolejka komunikatów, które byłyby dynamicznie alokowanymi obiektami polimorficznej klasy dziedziącej z bazowej Message. Wysłanie komunikatu polegałoby na dodaniu go do kolejki i potem pętla komunikatów przetwarzałaby te komunikaty w każdym oknie/kontrolce. Ale to nie wydaje mi się fajne rozwiązanie. Nawet WinAPI nie do końca tak działa, bo o ile PostMessage faktycznie dodaje komunikat do kolejki, o tyle SendMessage natychmiast i blokująco wywołuje procedurę obsługi komunikatu okna dla danego komunikatu. Dzięki temu może też odebrać zwróconą wartość.

Offline Avaj

  • Użytkownik

# Sierpień 24, 2010, 19:01:19
Ja używam combo Boost::Function/Boost::Bind (jest już w std::tr1) i nie narzekam :)

Offline PsichiX (ΨΧΞ)

  • Użytkownik
    • PsichiX Website

# Sierpień 24, 2010, 19:26:21
póki co używam systemu kolejki komunikató ale w niej działają same bazowe komunikaty jak nacisniecie klawisza/przycisku myszy, odczyt wprowadzonego stringu w aktywnej kontrolce, ale teraz robic do kazdego przypadku jak sprawdzanie przesuwania myszki nad kontrolka + trzymania mychy mi sie odechciewa i uroslo by to w duuzy rozmiar, wiec stawiam tutaj na maszyne stanow gdzie gui sprawdza akcje na kontrolkach i zmienia im odpowiednie stany wywolujac przy tym przeciazona przez usera metode update danej kontrolki zeby mogl po swojemu obsluzyc aktualizacje bazujac na danych stanach. ewentualnie zostawic kolejke ale zeby komunikaty byly buforowane w jednej klatce i mozna bylo sprawdzac ich wspolny stan zebym mogl tym updatem kompleksowe wlasne reakcje na zdarzenia robic. i chyba to zrobie, taki mix wzorca obserwatora z kolejka komunikatow :)