Skocz do zawartości

[Skrypt] instance_nearest_ext


Rekomendowane odpowiedzi

Ostatnio ktoś dawał na forum jakiś skrypt - instance_nearest_ext, ale nie był on wydajny - wręcz przeciwnie, toteż postanowiłem zrobić swój, bardziej wydajny no i zrobiłem :P Najpierw powiem dla początkujących w ogóle do czego ta funkcja sluzy: instance_nearest(x,y,obj) (ktory jest wbudowany do gm-a) zwraca id najblizszego danego obiektu z danego x i y. Ja zrobiłem taki sam skrypt, z tym że mozna wybrac np drugi najblizszy obiekt albo trzeci, czwarty, piąty itd.

 

instance_nearest_ext

GML
/*

Argument 0 - Obiekt

Argument 1 - Ktory

Arguemnt 2 - Z ktorego x

Argument 3 - Z ktorego y

*/

var tab,obj,kth,nxt,xn,yn;

xn=argument2

yn=argument3

nxt=1

tab=0

obj=argument0

kth=argument1

if kth<=0 or kth>instance_number(obj)

{

nxt=0

}

if nxt

{

for(i=0; i<kth; i+=1)

{

tab=instance_nearest(xn,yn,obj)

if i!=kth instance_deactivate_object(tab)

}

instance_activate_object(obj)

return tab;

}

else

{

return false;

}

 

 

Enjoy :P

Odnośnik do komentarza
Udostępnij na innych stronach

Pokazałem Ci kod na szukanie n-tej instancji, w jednym z Twoich tematów - kredki się należą :P

Odnośnik do komentarza
Udostępnij na innych stronach

tak w ogóle to w razie błędu czy nie udanego wyniku funkcja ma zwracać noone a nie false ;/

Odnośnik do komentarza
Udostępnij na innych stronach

PsichiX nie przypominam sobie zebys mi cos podawal związanego z tym. Poprostu sobie usiadlem i od zera zrobilem, do niczego nie patrząc.

A wade chciałem naprawic ale cos nie wyszlo .. why?

GML
/*

Argument 0 - Obiekt

Argument 1 - Ktory

Arguemnt 2 - Z ktorego x

Argument 3 - Z ktorego y

*/

var tab,obj,kth,nxt,xn,yn,dea,dei;

dei=0

dea=0

xn=argument2

yn=argument3

nxt=1

tab=0

obj=argument0

kth=argument1

if kth<=0 or kth>instance_number(obj)

{

nxt=0

}

if nxt

{

for(i=0; i<kth; i+=1)

{

if i=kth

{

tab=instance_nearest(xn,yn,obj)

}

else

{

dea=instance_nearest(xn,yn,obj)

instance_deactivate_object(dea)

dei+=1

}

}

for(i=0; i<dei; i+=1)

{

instance_activate_object(dea)

}

return tab;

}

else

{

return noone;

}

 

P.S. -

A po 2. To nie szpań tak - jedynie przepisałeś to, co powiedział PsichiX na pętlę :3

Tak jak wyzej - niczego nie przepisywałem

Odnośnik do komentarza
Udostępnij na innych stronach

Wyniki szybkiego testu:

Czas wykonania 2500 razy funkcji na listach z losowymi parametrami (przy dwudziestu interesujących mnie obiektach): ~950ms

To co wyżej, tyle, że na deaktywacji: ~300ms

 

Czyli jednak różnica jest.

 

Już teraz nie mam czasu, ale jeszcze dzisiaj chciałbym to sprawdzić - która funkcja zyskuje a która traci na zwiększonej liczbie instancji.

 

Ed:

Tak jak wyzej - niczego nie przepisywałem
Dobrze wiesz, o co mi chodzi.

To PsichiX podsunął Ci na sposób, a Ty jedynie przerobiłeś go na funkcję.

Odnośnik do komentarza
Udostępnij na innych stronach

tak jasne, kurde zawsze jak coś zrobie to gadacie ze od kazdego spisywałem, ściągałem i Bóg wie co jeszcze. przeciez jakbym od kogos spisywał to bym cholera jasna powiedział! nie jestem taki.
https://forum.gmclan.org/index.php?showtopi...st&p=240958

I nie udawaj, bo obaj dobrze wiemy, że Twój skrypt działa dokładnie tak, jak PsichiX napisał - ty użyłeś jego pomysłu i na jego podstawie napisałeś swój skrypt.

 

O, inaczej - sam nie wpadłeś na pomysł z dezaktywacją instancji.

 

Ale dobra, niczego sobie wzajemnie nie udowodnimy, także sprzeczka nie ma sensu :P

Odnośnik do komentarza
Udostępnij na innych stronach

@Kofel - Nie był on wydajny, wręcz przeciwnie - mulił na maksa. Jakiś błąd?

 

Dawidds, ale ameryki to YXE nie odkrył, no ale w sumie to jego pomysł ;P . Ten co podałeś w tym temacie to napisanie tej funkcji od zera no i powiększenie jej możliwości. Jest tam jeden głupi błąd - tworzenie dwóch map. To najgorsze co być może. 4000 map tworzonym co stepa i kasowanych to katastrofa :o .

Odnośnik do komentarza
Udostępnij na innych stronach

Generalnie nie jest źle, ale:

  • brak zabezpieczenia przed podaniem n większego niż liczba istniejących instancji
  • aktywowanie wszystkich instancji danego typu po zakończeniu obliczeń (a nie tylko tych, które poprzednio dezaktywowaliśmy)
Moja wersja algorytmu:

 

GML
//=================================

// Instance_Nearest( x, y, obj, n )

//=================================

X = argument0;

Y = argument1;

Obj = argument2;

n = argument3;

 

if ( n > instance_number( Obj )) return noone;

Ids = ds_list_create();

for (i = 0; i < n; i += 1)

{

Id = instance_nearest( X, Y, Obj );

instance_deactivate_object( Id );

ds_list_add( Ids, Id );

}

for (i = 0; i < ds_list_size( Ids ); i += 1) instance_activate_object( ds_list_find_value( Ids, i ) );

ds_list_destroy( Ids );

return Id;

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