Skocz do zawartości

Rekomendowane odpowiedzi

Opublikowano

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ł?

Opublikowano

*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?

Opublikowano

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

Tez nad tym myslalem, i jedyne co mi przyszlo do glowy to sprawdzanie pixel po pixelu czy ma kolizje, w moim przypadku moglo by sie to sprawdzic gdy zapisuje sie plik z mapa w edytorze, ale nie wiem jak u ciebie.

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