Skocz do zawartości

Usuwanie zasłoniętych obiektów.


Threef

Rekomendowane odpowiedzi

W PentaSphere świat jest zbudowany z izometrycznych bloków. Dziś wpadłem na pomysł że mogę usunąć/dezaktywować bloki których nie widać/są przykryte innymi blokami.

Próbowałem sprawdzać wszystkie bloki o tym samym x i y, i usuwać wszystkie poza tym o najmniejszym depth.

GML
///Usuwanie zbędnych (nie widocznych) klocków

a_x=ds_list_create()

a_y=ds_list_create()

for (n=0; n<instance_number(o_block); n+=1)

{

i=instance_find(o_block,n)

if(!ds_list_find_index(a_x,i.x)){ds_list_add(a_x,i.x)}

if(!ds_list_find_index(a_y,i.y)){ds_list_add(a_y,i.y)}

}

 

for(yy=0;yy<=ds_list_size(a_y);yy+=1)

for(xx=0;xx<=ds_list_size(a_x);xx+=1)

{

a[xx,yy]=ds_list_create()

}

 

for (n=0; n<instance_number(o_block); n+=1)

{

i=instance_find(o_block,n)

ds_list_add(a[i.x,i.y],i)

}

 

for(yy=0;yy<=ds_list_size(a_y);yy+=1)

for(xx=0;xx<=ds_list_size(a_x);xx+=1)

{

q1=ds_list_find_value(a[xx,yy],0)

for(i=1;i<ds_list_size(a[xx,yy]);i+=1)

{

q2=ds_list_find_value(a[xx,yy],i)

if(q1>10000 and q2>10000)

if(q1.depth<q2.depth)

{

with(q1){instance_destroy()}

q1=q2

}

else

{with(q2){instance_destroy()}}

}

}

 

for(yy=0;yy<=ds_list_size(a_y);yy+=1)

for(xx=0;xx<=ds_list_size(a_x);xx+=1)

{

ds_list_destroy(a[xx,yy])

}

Niestety to nie jest dobre rozwiązanie. Ogółem cała mapa jest przechowywana w ten sposób:
GML
ds_grid_get(h[zz],xx,yy)
Więc tak też mogę się odnosić do istniejących bloków.

 

Ktoś ma jakiś pomysł?

Odnośnik do komentarza
Udostępnij na innych stronach

*Uwaga, pisze z kompa bez polskiej klawiatury, wiec z gory przepraszam za ten post*

Pomysl jest dobry, sam o tym myslalem w DP, mozna to zrobic tak: jesli kolidujesz z jakims obiektem sprawdzasz czy jest nad czy pod toba(wedlug depth(jesli taki sam to wedlug id w roomie)) nastepnie sprawdzasz czy zakrywasz go calego(other.x<x itd) (i tu jest problem ze nie wszystkie obiekty sa prostokatami )jesli tak to go usuwasz.

BTW: Dlaczego nie jest to dobre rozwiazanie?

Odnośnik do komentarza
Udostępnij na innych stronach

Chodzi mi o to że pomysł jest dobry ale złe wykonanie. Teraz nad tym siedzę i prawie udało mi się to rozgryźć. Mam tylko problemy z rozróżnieniem przezroczystych bloków (Okna etc.).

Ogółem zredukowało to liczbę obiektów o prawie 50% :)

 

Edit:

GML
ds_grid_get(h[zz+1],xx-1,yy-1)
Tak sprawdzam czy w strukturze jest jakiś blok ponad aktualnym.
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ę...