Skocz do zawartości

Skrypt z szukaniem ofiary


Nirvan

Rekomendowane odpowiedzi

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 ...

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

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.

Odnośnik do komentarza
Udostępnij na innych stronach

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)

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

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.

Odnośnik do komentarza
Udostępnij na innych stronach

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)

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

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.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

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>

Odnośnik do komentarza
Udostępnij na innych stronach

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ę
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...