Nirvan Opublikowano 26 Czerwca 2009 Opublikowano 26 Czerwca 2009 Mam taki skrypt (By Psichix , zdołał go zrobić pomimo mojego chorego opisu co miał robić ten skrypt) : GML victim=instance_nearest(x,y,enemyunit) // szuka ofiary if(!victim)return(false) // jeśli żadnej nie znalazł to przerywa while(victim.predator[0] && victim.predator[1]) // wykonuje do póki szukana ofiara jest atakowana przez dwóch innych atakujących { instance_deactivate_object(victim) // deaktywujemy znalezioną ofiarę victim=instance_nearest(x,y,enemyunit) // szuka kolejnej ofiary if(!victim) { instance_activate_object(enemyunit) // aktywuje wszystkie ofiary return(false) // jeśli żadnej nie znalazł to przerywa } } instance_activate_object(enemyunit) // aktywuje wszystkie ofiary if(!victim.predator[0] && !victim.predator[0]) // jesli ofiara nie walczy z żadnym drapieżnikiem, wtedy... { victim.predator[0]=id // mówisz ofierze że atakujesz ją (jesteś jej pierwszym drapieżnikiem) return(true) // kończysz szukanie z sukcesem } else // jeśli zaś walczy z jednym, wtedy... { if(!victim.predator[0]) // jeśli ofiara nie ma pierwszego drapieżnika { victim.predator[0]=id // to mówisz ofierze że jesteś jej pierwszym drapieżnikiem return(true) // kończysz szukanie z sukcesem } else { victim.predator[1]=id // to mówisz ofierze że jesteś jej drugim drapieżnikiem return(true) // kończysz szukanie z sukcesem } } Ma on szukac ofiare , jeśli ją znajdzie to ma sprawdzić czy jest atakowana przez 2 drapieznikow , jak nie albo jak jest atakowany tylko przez 1 to ma być victim=instance_nearest(enemyunit); Ale jest coś chyba źle bo nie chce dzialać gdy robie if distance_to_object(victim) <= np.500 to nic sie nie dzieje ...
Administratorzy gnysek Opublikowano 26 Czerwca 2009 Administratorzy Opublikowano 26 Czerwca 2009 tak oglądam tą pierwsza pętlę i to wyglada tak dopóki obiekt atakują dwaj przeciwnicy dezaktywuj obecny obiekt nowy obiekt to następny najbliższy jeżeli nie znaleziono już nic (nowy obiekt to -1), to wyjdź z pętli aktywuj wszystkie sprawdź czy OSTATNIĄ ofiarę ktoś atakuje (ale skoro z pętli wyszliśmy poprzez break, to id = -1, bo nic nie znaleziono) tak naprawdę gdyby zamiast while napisać victim = -1 to było by to samo. Po prostu poza pętlą masz id ostatniego enemyunit jako -1.
PsichiX Opublikowano 26 Czerwca 2009 Opublikowano 26 Czerwca 2009 Po prostu poza pętlą masz id ostatniego enemyunit jako -1. tylko gdy nie znajdzie zadnego przeciwnika, wiec powinien sie potem zabezpieczac przed tym w kodzie, aby ominal kod ktory wymaga znalezionej ofiary (victim)
Administratorzy gnysek Opublikowano 26 Czerwca 2009 Administratorzy Opublikowano 26 Czerwca 2009 Nie no, wg. mnie zawsze będzie -1, bo skoro dezaktywuje wszystkich po kolei, to na koniec nie znajdzie nikogo, i instance_nearest() zwraca -1, co powoduje wyjście z pętli. Chyba, że natrafi na typka, którego atakują dwie osoby, ale wtedy nie sprawdzi też wszystkich.
PsichiX Opublikowano 26 Czerwca 2009 Opublikowano 26 Czerwca 2009 mylisz sie, bo kod dziala, gdy w petli skonczy przeszukiwac, czyli nie znajdzie zadnego obiektu, to zanim zwroci -1 to aktywuje wszystkich przeciwnikow, w kazdym przypadku zanim wyjdzie z funkcji to aktywuje jesli zacza szukac, aby nie bylo tego bledu ktory masz n mysli. Ja Tytan wiem co nie gra, ale wczoraj chciales sam cos tam zrobic to wolalem poczekac, a moze bys wykombinowal :P i zauwaz, ze -1 jest zwracany tylko i wylacznie gdy nie ma przeciwnikow, badz zaden z przeciwnikow nie ma mozliwosci przyjac dodatkowego drapieznika (czyli wszystcy przeciwnicy maja po 2 drapiezniki)
Administratorzy gnysek Opublikowano 26 Czerwca 2009 Administratorzy Opublikowano 26 Czerwca 2009 GML victim=instance_nearest(x,y,enemyunit) // szuka kolejnej ofiary if(!victim) break; Skoro wychodzisz z pętli, gdy victim = -1, to aktywacja obiektów nic nie da, -1 to -1. I poza pętlą nadal będzie -1.
Nirvan Opublikowano 26 Czerwca 2009 Autor Opublikowano 26 Czerwca 2009 a w debugu mam victim = -4 :jezor: edit : nie dopisalem ze w create jest : predator[0]=-1; predator[1]=-1; victim=-1; ale to chyba nie ma znaczenia
Administratorzy gnysek Opublikowano 26 Czerwca 2009 Administratorzy Opublikowano 26 Czerwca 2009 To i tak false, z tego co pamiętam, w GM x<=0 to false, x>0 to true
Nirvan Opublikowano 26 Czerwca 2009 Autor Opublikowano 26 Czerwca 2009 no tak , ale ciągle i tak nie wiem co mam gdzie zrobić żeby to zadziałało .
Administratorzy gnysek Opublikowano 26 Czerwca 2009 Administratorzy Opublikowano 26 Czerwca 2009 GML victim = instance_nearest(x,y,enemyunit); do { // tutaj sprawdzanie, czy jest atakowany czy nie instance_deactivate_object(victim); victim = instance_nearest(x,y,enemyunit); } wile victim = true;// albo victim > 0</span>
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ę