Filar Społeczności Ranmus Opublikowano 22 Października 2006 Autor Filar Społeczności Udostępnij Opublikowano 22 Października 2006 Wytłumaczę inaczej. Masz 4 TYPY (a nie egzemplarze tego samego typu) Obiektów w GM: A, B, C, D I chcesz, że jeżeli coś się stanie z obiektem A, to obiekty B, C, D zostały o tym powiadomione. Teraz wyobraź sobie szkołę, która składa się z dyrektora oraz 3 klas. Każde zarządzenie dyrektora wpływa na klasę, np. dyrektor ogłasza, że kolejny piątek jest wolnym od zajęć. Ale jak ma przekazać tą informację? Otóż zwołuje zebranie gospodarzy klas. Z każdej z trzech klas oddelegowany jest 1 uczeń pełniący rolę gospodarza klasowego. Po zebraniu, każdy z tych uczniów wraca do swojej klasy i przekazuje wiadomość innym, że piątek jest dniem wolnym od pracy. Teraz jak to przełożyć na GM. Obiekty: A - dyrektor B - klasa 1a C - klasa 1b D - klasa 1c Teraz żeby powiadomić wszystkich uczniów tych klas, że piątek jest wolny. W obiekcie A zrobiłbyś tak: jakiś event, np. klawisza Enter: with ( B ) { tutaj kod informujacy, ze piatek jest wolny event_user( 1 ); // zalozmy, ze to event ze skryptem zadowolonych uczniow } with ( C ) { tutaj kod informujacy, ze piatek jest wolny event_user( 1 ); // zalozmy, ze to event ze skryptem zadowolonych uczniow } with ( D ) { tutaj kod informujacy, ze piatek jest wolny event_user( 1 ); // zalozmy, ze to event ze skryptem zadowolonych uczniow } Tylko widzisz, masz 3x with, każda klasa może inaczej reagować na wiadomość, więc ciało with może się różnić. A co sie stanie jak w szkole dyrektor zechce utworzyc nowa klase? Klase 1d (E)? Musisz dopisać kod... W tym celu właśnie przychodzą delegacje, które ułatwiają przekazywanie jakiegoś zdarzenia do innych zainteresowanych obiektów, tak, że to nie ten przykładowy dyrektor będzie chodził po klasach jak w powyższym skrypcie, ale to klasy do niego oddelegują gospodarza klasowego. Twórzysz delegację w obiekcie A (u dyrektora): d_gosp_klasowych = DelegateCreate(); Teraz musimy oddelegować gospodarzy klasowych. Załóżmy, że za przekazywanie nowej wieści będzie służył nie skrypt typu NowaWiadomosc czy o innej nazwie, ale, że każda klasa ma w event_user_0 (w other events) odpowiedni skrypt, który zajmie się manipulacją obiektu zależnie od zdarzenia (czyli gospodarz klasowy powie co tam dyrektor kazał) Rejestrujemy gospodarzy klasowych (event_user0): DelegateAddEvent( d_gosp_klasowych, 0, B ); //drugi argument to numer event_user, argument trzeci to obiekt, ktorego jest ten event_user DelegateAddEvent( d_gosp_klasowych, 0, C ); DelegateAddEvent( d_gosp_klasowych, 0, D ); Teraz dyrektor musi przekazac wiadomość (uruchomić event_user0 obiektu B, C, D zamiast uzywania with'y): DelegateCall( d_gosp_klasowych, "piatek jest wolny!!!" ); //argument drugi i kolejne to argumenty opcjonalne przekazywane zdarzeniom poprzez tablice global.DL_Params. I to wszystko. Właśnie za pomocą jednej funkcji uruchomiłeś event_user0 obiektu B, event_user0 obiektu C i event_user0 obiektu D. Teraz w każdym z tych obiektów, w tych event_userach mozesz dac np. show_message( global.DL_Params[0] ); i pojawi sie okienko z napisem "piatek jest wolny" I to wszystko. .................. A jeszcze prostszy przyklad, to kubelek. Masz skrypty: aaaa(); bbbb(); cccc(); I chcialbys je czesto wykonywac razem. Moglbys je wywolywac tak jak wyzej, lub zrobic nowa funkcje dddd ktora ma w ciele powyzszy skrypt i bys tylko wywolywal: dddd(); Teraz wyobraz sobie, ze delegacja, to taki kubelek na skrypty. I jak potrzasniesz kubelkiem, to wszystkie wlozone doń skrypty się wykonają. Tworzymy kubelek: kubelek = DelegateCreate(); Wrzucamy skrypty do kubelka: DelegateAddScript( kubelek, aaaa, id ); // drugi parametr to id skryptu. Podajac nazwe skryptu, podajesz automatycznie jego id. Trzeci parametr to id obiektu, ktory wykona ten skrypt (wlasciciel skryptu). DelegateAddScript( kubelek, bbbb, id ); DelegateAddScript( kubelek, cccc, id ); I teraz odpalamy wszystkie skrypty na raz z 3 opcjonalnymi argumentami: DelegateCall( kubelek, ":D", ":)", ":P" ); Te argumenty sa bezposrednio dostepne w skryptach poprzez global.DL_Params. Jednak jezeli do delegacji dajesz skrypt zamiast eventa typu event_user, to automatycznie argumenty sa przekazywane jako argumenty skryptow). Po prostu delegacja, to taki kubełek, do którego możesz wrzucić skrypty oraz eventy typu event_user konkretnych obiektów, a potem wywoływać je wszystkie na raz, za pomocą DelegateCall( id delegacji ); ............ Prościej już chyba się nie da. Tylko nie pytaj się po co takie coś, skoro możesz używać with, lub event_perform( numer eventa); czy tez odwolywac sie do globalnych, albo (obiekt).jego_zmienna, bo to już wałkowałem z Tymonem parę postów temu. Tu chodzi tylko o elastyczność i wiedzę, kiedy delegacje warto stosować i kiedy ułatwią nam życie. Jeżeli nie czujesz potrzeby ich używania, to nie używaj na siłę. To wszystko. :) No i proszę. Z Ranmusa zrobił się już programista :D Co Ty właściwie jeszcze robisz w GMProzaiczna przyczyna - bo mam coś do udowodnienia. Otóż nie zrobiłem żadnej pełnoprawnej gry w GM (co jest potrzebne do zamknięcia tego rozdziału programisty samozwańca :D), a że wyczułem ostatnią szansę zrobienia takowej (mimo, że czas jest już tak napięty, że szkoda gadać), ale z pomocą innych osób, bo sam nie dałbym rady, to pomyślałem, że może warto spróbować, ten ostatni raz. Nawet jak gra będzie crapem. ;) Potem to już żegnaj GM i witaj C# na dobre. No i dlatego te delegacje się tu zrodziły - jestem świeżo po książkach o C# i zaaferowany możliwościami nowego języka zrobiłem ułatwiacza do projektu, ale postanowiłem się nim podzielić. :] Ciekawe czy to się zmieni w nowej wersji GM. A wysyłałeś to na główne forum (nie zaglądam tam często)?Myślałem, ale ostatecznie zaniechałem, ponieważ mój angielski nie jest zbyt piękny. ;) Musiałby ktoś to przetłumaczyć, bo sam łamanym angielskim bym się raczej nie chciał chwalić. :] A Mark Overmars raczej takiego czegoś nie doda, bo równie dobrze mógłbyś go prosić o tworzenie funkcji, struktur i klas z poziomu kodu. A Mark Overmars się ciągle upiera by nie robić z GM'a super kombajnu. Jak już kiedyś będę bogaty, to zajmę się tworzeniem edytora gier (marzenia). ;P (a tak serio to w takim języku jak C# (czyli wpełni obiektowym) delegacje to podstawy na takim poziomie jak np. umiejętność tworzenia klas i obiektów :P) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
pablo1517 Opublikowano 20 Sierpnia 2007 Udostępnij Opublikowano 20 Sierpnia 2007 ja miałem już problem, który ranmus opisał (pełno withów i ciągle dopisywać nowe) i uważam, że należą się brawa dla ranmusa ^^ jedną linijką kodu mogę wywołać masowo w wielu obiektach naraz pewne zdarzenia :) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Shylios Opublikowano 31 Sierpnia 2007 Udostępnij Opublikowano 31 Sierpnia 2007 O co chodzi?? Ranmus jakimś szyfrem mówi (przynajmniej dla mnie) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Marmot Opublikowano 1 Września 2007 Udostępnij Opublikowano 1 Września 2007 To najlepszy znak, że trzeba zasiąść do lektury o programowaniu :] . Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się