-
Postów
3 205 -
Dołączył
-
Ostatnia wizyta
-
Wygrane w rankingu
4
Typ zawartości
Profile
Forum
Wydarzenia
Treść opublikowana przez Ranmus
-
Ten skrypt nie działa w obrębie surface, sprawdziłem i nic nie maluje, a rysowanie zwykłego kwadrata nie działa. Może lepiej przygotuj gotowy sprite od razu, bo pamiętaj, że na surface nie można rysować dodatkowej przezroczytości czyli jeżeli narysujesz 1 piksel o alpha 0.5, a potem 1 piksel w tym samym miejscu o alpha 0.1, to to miejsce będzie miało alpha 0.1, a nie sumę 0.1 i 0.5 Taka już niedogoność game makera.
-
Nie czytało się dokładnie helpa? :] Nie można używać funkcji do manipulacji surface'ami w evencie draw.
-
Sorry, ale co mnie to obchodzi? Dla mnie to może robić i święty mikołaj, byle by dobrze.
-
surface_set_target( id surface); drawy surface_reset_target(); a potem draw_surface
-
System delegacji
Ranmus odpowiedział(a) na Ranmus temat w Gotowe Skrypty, przykłady, dodatki, silniki 3D dla GM
Marmot, akurat to nienajlepszy cytat, bo GM nie jest środowiskiem wieloprocesowym, więc te delegacje co zrobiłem są synchronicznie wywołane (zresztą tak jak domyślnie i C#, ale tam można też właśnie asynchronicznie wywoływać). -
System delegacji
Ranmus odpowiedział(a) na Ranmus temat w Gotowe Skrypty, przykłady, dodatki, silniki 3D dla GM
Ja tylko jeszcze dodam: Dlatego trzeba czekać na GM7 i zobaczyć jaką formę będą miały rozszerzenia. -
System delegacji
Ranmus odpowiedział(a) na Ranmus temat w Gotowe Skrypty, przykłady, dodatki, silniki 3D dla GM
Szczerze mówiąc to ja jeszcze tego nie widzę, bo nie rozmyślałem nad tym. Jakiś przykład? :) Nie wiem czy dobrze zrozumiałem, ale typy tylko i wyłącznie tak się obsługuje:eLeftPressed = DelegateCreate(); DelegateAddEvent( eLeftPressed, 3, Lampa ); DelegateDeleteAll( Lampa ); lub: eLeftPressed = DelegateCreate(); DelegateAddEvent( eLeftPressed, 3, 100001 ); DelegateDeleteAll( 100001 ); Chyba, że chodzi Ci o ten fragment manuala: I to działa także na odwrót czyli nie odrejestrujesz zdarzenia, którego właścicielem jest konkretny obiekt (id), za pomocą odrejestrowania typu tego obiektu. O takie coś chodzi? Swoją drogą chyba wprowadzę tą poprawkę sprawdzającą czy obiekt właściciel zdarzenia istneje (w DelegateCall) i jeśli nie, to usuwa wszystkie jego delegaty za pomoca funkcji DelegateDeleteAll. -
System delegacji
Ranmus odpowiedział(a) na Ranmus temat w Gotowe Skrypty, przykłady, dodatki, silniki 3D dla GM
Skrypta, którego będziesz musiał nadzorować i edytować przy każdej zmianie struktury obiektów w grze. A co do wpakowania paru zmiennych do jednej. Musisz pisać specjalne skrypty, operacje na stringach do najszybszyc nie naleza i musisz wprowadzic porzadna obsluge seperatora by skrypt byl uniwersalny. Tablicy też nie możesz dac, bo GM nie obsluguje czegos takiego. Podpowiem tylko ze delegacja przeze mnie stworzona to specjalna lista list by wlasnie uniknac stringow... A teraz zobacz ile alternatywnych rozwiazan juz podales (juz nie liczac, ze ja drugie podalem ;P ): - with z if'ami - obiekt parent - lista z petla i zserializowanymi zmiennymi - specjalny, osobny skrypt do zarzadzania A ja mam na to prosta odpowiedz: - delegacje Popatrz uwaznie i zastanow sie czy warto zaprzatac sobie glowe tymi pierwszymi technikami, ktore trzeba na nowo dostosowywac do kazdego projektu i skakac z kodu na kod czy ... po prostu zaoszczedzic sobie klopotow uzywajac delegacji. Wybor nalezy do Ciebie. :] EDIT: Znam rysunek, ale wbrew pozorom taka dyskusja ma sens, bo ma na celu pokazać w czym delegacje pomagają*. :) Nawet jest odpowiedni temat poświęcony metodologii obsługi zdarzeń (której jednym z wcieleń sa delegacje). http://pl.wikipedia.org/wiki/Programowanie...ane_zdarzeniami *A pomagaja w szczegolnosci tam gdzie nie uswiadczysz with'y czy event_performow. -
System delegacji
Ranmus odpowiedział(a) na Ranmus temat w Gotowe Skrypty, przykłady, dodatki, silniki 3D dla GM
Ale to już jest rozwiązanie ściśle powiązane z określonym problemem i nie wszędzie zda egzamin. Delegacje są uniwersalne. :] Poza tym w liście trzymasz tylko jedną zmienną, a nie np. parę kluczy, czyli możesz trzymać tylko id tych obiektów. I w ten sposób znowu musisz sobie coś ustalić: "Aha, dla dostosowywania obiektów do zimy, będę wykorzystywał zawsze event_user0 w tych obiektach". No i widzisz co narobiłeś? Znowu z góry ustaliłeś jakiś przymus tymże obiektom od strony pętli w innym kodzie. Ubezwłasnowolniłeś je miast dać im swobodę wyboru tegoż event_usera. Próbuj dalej. :] -
System delegacji
Ranmus odpowiedział(a) na Ranmus temat w Gotowe Skrypty, przykłady, dodatki, silniki 3D dla GM
No właśnie! Kwestia dopisania linijki. Tworzysz nowy rodzaj obiektu - dopisujesz linijkę Tworzysz nowy rodzaj obiektu - dopisujesz linijkę Tworzysz nowy rodzaj obiektu - dopisujesz linijkę Usuwasz drugi obiekt, bo jednak niepotrzebny - usuwasz linijkę Obiekt 1 i 3 jednak mogą być jednym typem obiektu - usuwasz linijkę, usuwasz linijkę, dodajesz linijkę. Tworzysz nowy rodzaj obiektu - dopisujesz linijkę Tworzysz nowy rodzaj obiektu - dopisujesz linijkę Tworzysz nowy rodzaj obiektu - dopisujesz linijkę Wyskakuje ci piękna drabina z ifami sprawdzającymi obiekty. I zawsze tworząc obiekt, musisz wracać do tej pętli. Musisz otworzć skrypt, dopisać, zamknąć skrypt. Skaczesz po skryptach, tracąc niepotrzebnie czas na takie prozaiczne, rutynowe działania. Używając delegacji masz to w tyłku. Nie skaczesz po skryptach i już jesteś 10 linijek powrotu do kodu pętli wprzód (nie licząc otwierania i zamykania kolejnych okien), bo tylko nowo tworzonym obiektem się zajmujesz, a nie petlą w jakimś skrypcie! I nie musisz pamiętać czy już to zrobiłeś, czy tamto zaktualizowałeś, itd., gdyż tak jak pętla jest jawnie zależna od obiektów, tak delegacja nie. Problem dostosowania się nowego obiektu rozwiązujesz od strony tegoż obiektu a nie pętli w innym skrypcie. To już lepiej jakbyś dawał wszystkim "zainteresowanym obiektom" jakis parent, ktory wywolujesz tak: width ( obiekt_parent ) { event_user( 0 ); } Tylko, ze to wywazanie okna zamiast wchodzenie przez drzwi, bo masz juz niepotrzebny nowy obiekt i zaleznosci typu parent - child oraz przymus stosowania event_user0 na starcie (a chyba wogdniej jest wskazac event_user lub skrypt, ktory chcemy wywolac?). :] -
System delegacji
Ranmus odpowiedział(a) na Ranmus temat w Gotowe Skrypty, przykłady, dodatki, silniki 3D dla GM
Oczywiście, że można użyć with, ale zauważ jedno. Jeżeli dodasz jakiś nowy rodzaj obiektu, to musisz powrócić do tego kawałka skryptu, który te with'e wywołuje i dopisać kod. A w delegacjach obsługę za dostosowanie do zimy zrzucasz na ten nowy obiekt, bo on się sam rejestruje w delegacji trzymanej w zmiennej globalnej. A jak okaże się, że już nie jest potrzebny ten obiekt, to co? Usuniesz with? Zaczniesz sprawdzać czy obiekt istnieje? Będziesz trzymał obiekty na liście? W delegacjach nie musisz, bo usuwając obiekt, usuwasz rejestrację delegata / zdarzenia (jak zwał tak zwał). :] To jest właśnie elastyczność programowania, nie wracasz do jakiegoś kodu by nanieść poprawki. :] -
System delegacji
Ranmus odpowiedział(a) na Ranmus temat w Gotowe Skrypty, przykłady, dodatki, silniki 3D dla GM
Do czego użyć? Ano taki przykład: W Harvest Moonie są pory roku, które w czasie gry się zmieniają. Każda pora roku charakteryzuje się innym trybem wegetacji roślin, inną długością dnia no i krajobrazem! global.ZmienPoreRoku = DelegateCreate(); Obiekty typu skaly, domki itd. w czasie zimy sa zasniezone. Trzeba im dostosowywac wyglad. Tworzymy tym obiektom event_user0, ktory dostosowuje np image_index. Rejestrujemy zdarzenia: DelegateAddEvent( global.ZmienPoreRoku, 0, Domy ); DelegateAddEvent( global.ZmienPoreRoku, 0, Skaly ); DelegateAddEvent( global.ZmienPoreRoku, 0, Drzewa ); Jako ze temperatura w zimie jest inna, to trzeba losowac stopnie z innego przedzialu niz w lecie. Obiektowi Termometr zmieniamy ten przedzial w event_user0. Rejestrujemy zdarzenia: DelegateAddEvent( global.ZmienPoreRoku, 0, Termometr ); Co by tu jeszcze... A! Czas! Dni w zimie sa znacznie krotsze, wiec powinnismy zmodyfikowac lekko czas wschodu i zachodu slonca. Robimy to w ... event_user0 obiektu SilnikDnia. Rejestrujemy zdarzenie: DelegateAddEvent( global.ZmienPoreRoku, 0, SilnikDnia ); Dodatkowo mozna wprowadzac zmiany do systemu wegetacji roslin, generowania zwierzat w lesie itd. Zalozmy ze juz wszystko zrobilismy. Teraz wielki final! Zmieniamy pore roku na zime! DelegateCall( global.ZmienPoreRoku, "zima" ); //dodajemy opcjonalny parametr. Włala! Wszystkie obiekty, które w jakikolwiek sposób związane są z porami roku zostaną dostosowane do trybu zimowego! We wszystkich powyzszych event_user0 mozemy np. sprawdzac parametr (argument) zerowy przy pomocy switch: switch( DL_Params[0] ) { case "zima": ... break; case "wiosna": ... break; ... } Widzisz? Proste i przyjemne do użycia. :) -
System delegacji
Ranmus odpowiedział(a) na Ranmus temat w Gotowe Skrypty, przykłady, dodatki, silniki 3D dla GM
Prawdę mówiąc tak się zastanawiałem, kto z gmclanowiczów uzna to za przydatne. :] -
if ( string_pos( zmienna_z_tekstem, "http://" ) ) { ... } Jeżeli chcesz wyszukać wieloktrotnie daną frazę, to warto zrobić kopię zmiennej z tekstem i przy znalezieniu frazy ucinać cały ciąg znaków od początku tekstu do frazy włącznie, a potem znowu wyszukać frazę i tak w kółko.
-
System delegacji
Ranmus odpowiedział(a) na Ranmus temat w Gotowe Skrypty, przykłady, dodatki, silniki 3D dla GM
Tymon: Miałem wolne popołudnie, to napisałem. Większej liczby czasu nie zużyłem. :] Ogólnie jest to dodatek typu ułatwiacz coś jak te uniwersalne listy w "projekcie", którymi łatwiej manipulować. System delegacji wbrew pozorom jest ciekawym dodatkiem, gdyż ułatwia w znacznym stopniu zaprojektować logikę gry / programu. Przykładowo mamy huda, który składa się z wielu elementów: paska energii, liczby żyć, licznika punktów, ekwipunku itd. Po zmianie rozdzielczości autor może zapragnąć zmieniać kontrolkom huda design na lepszy dla niskiej rozdzielczości. I teraz jak powiązać te kontrolki odpowiednim zdarzeniem z jakimś guzikiem? Można kontrolkom np. dać sprawdzanie jakiejś zmiennej globalnej czy sprawdzanie rozdzielczości lub dać im jako parent obiekt uniwersalny, potem wywoływać event_user obiektowi uniwersalnemu, który wywołuje inny event_user obiektom podrzędnym. itd., itp. Możliwości jest wiele, ale jest jedna tego wada. To są wiązania jawne i projektujesz je za każdym razem tworząc nowę grę, ponadto musisz dokładnie znać stan dwóch stron. System delegacji pozwala właśnie na elastyczne niejawne łączenie zdarzeń, bo możemy rejestrować zdarzenia od stron ywywołującego zdarzenie (np. guzik) czy też obiektu, któremu wywołane zdarzenie chcemy wywołać. Pełna wygoda. Ba, system delegacji nie jest wybredny i dopuszcza każdy typ obiektu czy skrypt. Musisz tylko dwóch rzeczy przestrzegać: delegat typu skrypt - skrypt musi istniec oraz wlasciciel delegata tez musi istniec, a jak jest niszczony to DelegateDeleteAll i gotowe. :) Tak więc rozwiążanie powyższego problemu jest proste, stworzyć nową delegację i przypisać tą delegację do zmiennej globalnej, następnie przy klikaniu na jakiś guzik ją wywoływać. Natomiast w create kontrolek huda dajemy skrypt dodawania własnego zdarzenia np. event_user0 do wczesniej wymienionej delegacji przy pomocy DelegateAddEvent, no i w event_user0 dajemy skrypt dostosowujacy wyglada, ktory jest unikatowy dla kazdej kontrolki, bo one sie roznia. Po prostu Mark Overmars nie pomyślał o implementacji systemu ala delegat, więc zrobiłem to za niego. ;) A np. takie wzorce projektowe? Nie po to zostały wymyślone, by mieć czego się dodatkowego uczyć, ale głównie mają służyć odciążeniu pracy i dostarczać odpowiedzi na powszechnie napotykane problemy. :) EDIT: A sam se dopisz sprawdzanie. Mi się już nie chce. :P Tak trudno w event destroy dac DelegateDeleteAll( id ); ? -
System delegacji
Ranmus opublikował(a) temat w Gotowe Skrypty, przykłady, dodatki, silniki 3D dla GM
Jako, że każdy ostatnio zakłada temat dla własnego przykładu, to ja tez nie będę sobie żałował. :) https://gmclan.org/index.php?plik=107 Jest to system delegacji dla GM'a. Czegoś takiego mi zawsze brakowało, a już zwłaszcza po obcowaniu z C#, więc się sprężyłem i stworzyłem DODATEK. Tak jest, to nie przykład lecz dodatek. Przetestowałem wszystkie funkcje na różne sposby i błędów nie stwierdziłem, więc jeśli ktoś takowy znajdzie, to proszę poinformować. Kawalek pliku czytajto.txt, bo nie mam zamiaru się powtarzać. :) Opis: System delegacji dla GM, to system niejawnego wywolywania skryptow i zdarzen obiektow trzecich. Wbudowany system wywolywania zdarzen niestety pozwala wywolac tylko jedno zdarzenie na raz. Ten dodatek eliminuje ta niedogonosc, a ponadto pozwala na niejawne wiazanie relacji miedzy roznymi obiektami, a takze przekazywanie parametrow podczas wywolywania zdarzen oraz pozwala na identyfikacje obiektu wywolujacego. Skrypty: DelegateCreate() Tworzy nowa delegacje (kontener / zasobnik dla zdarzen zwanych delegatami). Zwraca id delegacji. DelegateAddScript( id delegacji, id skryptu, id obiektu wlasciciela ) Do delegacji podanej jako pierwszy argument zostaje dodane nowe zdarzenie (delegat). Jest nim okreslony skrypt (argument 2). Skrypt ten bedzie wywolywany przez obiekt podany w argumencie trzecim. Zamiast id obiektu mozna dodawac typy obiektow, wtedy takie zdarzenie wiaze ze soba wszystkie obiektu danego typu. Funkcja zwraca false gdy danej delegacji nie ma lub unikatowe ID zdarzenia (delegata). DelegateAddEvent( id delegacji, numer eventa event_user, id obiektu ) Procz skryptow mozna rejestrowac takze eventy typu event_user (Game Maker oferuje ich 15). Funkcja dziala analogicznie jak poprzednia. Rejestrujemy okreslony event_user obiektu z trzeciego argumentu. DelegateSize( id delegacji ) Zwraca liczbe zdarzen (delegatow) zarejestrowanych w delegacji. DelegateCall( id delegacji, argument1, argument2 ... ) Wywoluje wszystkie zdarzenia (delegaty), ktore sa zarejestrowane w danej delegacji. Jesli okreslony delegat to skrypt, zostana mu przekazane wszystkie parametry procz pierwszego (id delegacji) Ponadto wywolywane zdarzenie (event_user lub skrypt) moze odwolac sie do 2 zmiennych globalnych: global.DL_Sender - id obiektu, ktory wywolal delegacje global.DL_Params - tablica parametrow przekazana podczas wywolywania delegacji Uwaga! Nie modyfikuj tych zmiennych, traktuj je jako tylko do odczytu, gdyz ustawianie sa one tylko raz przed wywolaniem zdarzen danej delegacji. Po ich wywolaniu zmienne te sa resetowane! DelegateDelete( ID delegata ) Funkcja, ktora usuwa delegata o ID, ktora zwrocila wczesniej funkcja DelegateAddEvent / DelegateAddScript Nie trzeba podawac ID delegacji, gdyz funkcja jest inteligenta i wie w jakiej delegacji siedzi delegat. :) Zwraca false, gdy nie znaleziono delegata o podanym ID DelegateDeleteAll( ID obiektu ) Funkcja usuwa wszystkie zdarzenia (delegaty) ze wszystkich delegacji w systemie, ktorych wlascicielem jest obiekt podany w argumencie pierwszym lub typ obiektu. Uwaga! Gdy odrejestrujemy okreslony obiekt, to i tak beda mu wywolywane zdarzenia, ktore zostaly zarejestrowane ogolnie dla typu obiektu! Uwaga: Funkcja ta przydatna gdy niszczymy obiekt, ktory mial zarejestrowane zdarzenia w jakichs delegacjach, gdyz system nie obserwuje czy dany obiekt jeszcze istnieje! DelegateClear( ID delegacji ) Funkcja usuwa z delegacji wszystkie zdarzenia (delegatow). Zwraca false gdy nie ma zadanej delegacji. DelegateDestroy( ID delegacji ) Funkcja czysci dana delegacje z delegatow, a nastepnie calkowicie usuwa delegacje, ktora zostala utworzona przy pomocy DelegateCreate. Uwaga: Zawsze usuwaj delegacje gdy juz jej nie uzywasz (Game Maker nie ma "Garbage Collectora"). DelegateDrawDebugger() Rysuje prosty debugger calego systemu delegacji. Najwazniejsza jest ostatnia struktura. :P Szybki sposob uzycia: 1) Tworzymy nowa delegacje: D = DelegateCreate(); 2) Rejestrujemy zdarzenie event_user_3 oraz skrypt Testowy obiektowi Test. DelegateAddEvent( D, 3, Test ); DelegateAddScript( D, Testowy, Test ); 3) Wywolujemy delegacje (i powyzsze zdarzenia) razem z 3 testowymi parametrami: DelegateCall( D, "a", "b", "c" ); 4) I to wszystko! :D Obiektowi Test zostanie wywolany event_user_3 oraz skrypt Testowy. Aby system delegacji dzialal bezkolizyjnie, nie uzywaj ponizszych nazw: global.DL_Initiated, global.DL_EventId, global.DL_EventDelegate, global.DL_ObjectDelegates, global.DL_Delegates, global.DL_ID, global.DL_VID, global.DL_Sender, global.DL_Params W skryptach sa uzywane zmienne tymczasowe, ktore sa nazywane konwencja: _nazwa_zmiennej Poprzedzaj zmienne tymczasowe podkreslnikiem. To dobry zwyczaj, ktory powoduje bezkolizyjnosc skryptow. -
Dawidsu: A żebyś się nie zdziwił. :] Ra3l: No właśnie część osób z gmclanu pisze właśnie inną grę. Tylko tego nie widać, ponieważ mamy ukryte podforum projektu, tak żeby było wygodnie nam pracować. Jak skończymy to pokażemy grę. :) A co do autobusu, to ktoś już robił taką grę (chyba). Zapytaj Damianoz'a na strefatg.pl
-
Xmenu
Ranmus odpowiedział(a) na PsichiX temat w Gotowe Skrypty, przykłady, dodatki, silniki 3D dla GM
Wkurza tylko jedno. W Windows jak klikniesz lewym klawiszem myszy poza menu, to ono znika. A u Ciebie tylko znika za pomocą prawego klawisza myszy. To trochę niewygodne. A tak to całkiem nieźle. :) -
http://forums.gamemaker.nl/index.php?showt...126717&st=0 DLL to to samo co program, tylko, że to jest taki jakby kontener funkcji czy aplikacja, która sam się nie uruchamia. Na twoim miejscu nie pisałbym jednak własnego dll'a, bo i po co? Do GM'a jest już parę naprawdę dobrych dlli sieciowych, więc to nie ma sensu.
-
A ja się nie zgadzam. Dobry silnik zawsze jest dużym wyzwaniem, bez względu na temat.
-
Zmienianie pędzli nie działa (raz tylko zmieniło).
-
Uzywanie po podejsciu
Ranmus odpowiedział(a) na Kychu temat w Gotowe Skrypty, przykłady, dodatki, silniki 3D dla GM
@Blackmaul: Mnie też się na gg pytał o różne rzeczy nie zdradzając swojej ksywki, ale wytropiłem go potem. ;) -
Uzywanie po podejsciu
Ranmus odpowiedział(a) na Kychu temat w Gotowe Skrypty, przykłady, dodatki, silniki 3D dla GM
Wpisz nazwę tej funkcji w wyszukiwarce forum. -
A czemu nie? Wyjdzie GM7 z nowym systemem rozszerzeń, który oferuje zabezpieczenia dodatków, to można dla największych desperatów robić gotowe silniki płatne sms'em. :]
-
Dobra, zamykam temat. Bruce, nie chcesz, nie przychodź, problemu nie widzę. Modów nie będę zmieniać.