Skocz do zawartości

Rozpadające się obiekty


Rekomendowane odpowiedzi

Hej,

 

poszukuję wskazówki jak rozwiązać następującą kwestię.

Mam jakiś obiekt ze spritem (dajmy na to, że sprite to tort).

Po kliknięciu go chcę aby rozpadł się na kawałki (o losowych kształtach).

 

Mój pomysł jest taki, żeby zrobić w destroy oTort kilka obiektów oKawalek, którym w create cać sprite_index = ...

No i właśnie co? Jak zrobić coś takiego, żeby mi zwrócił część sprite'a o losowych kształtach?

draw_sprite_part pozwala wziąc kawałek sprite ale prostokątny. Można jakoś na przykład podzielić go na dajmy na to trójkąty?

Odnośnik do komentarza
Udostępnij na innych stronach

Stwórz sobie jakiegokolwiek sprita, który kształtem będzie przypominał odłamek, potem stwórz jeszcze kilka takich, ale jako kolejne klatki sprita.

Potem stwórz sobie obiekt Odłamek i kod do niego z przykładu gnyska (sterowanie_padem)

GML (Create)
direction=round(random(360));

speed=2+round(random(10));

alpha=1.3;

 

img=round(random(ilość_klatek-1));

GML (Step)
if speed>0 then speed-=0.5 else speed=0;

 

if alpha>0 then alpha-=0.01 else instance_destroy();

GML (Draw)
draw_sprite_ext(spr_odlamek,img,x,y,1,1,direction,c_white,alpha);
Odnośnik do komentarza
Udostępnij na innych stronach

Zamiast:

GML
if speed>0 then speed-=0.5 else speed=0;

można:

GML
speed = max(0,speed-0.5)

 

draw_sprite_part pozwala pobrać prostokątny kawałek sprite'a, ale można użyć trójkątnych masek, surface'ów, primitive'ów...

Ale dla niezbyt zaawansowanych (a podejrzewam, że Ty należysz do tej grupy : ) ) rozwiązanie Magnusa powinno wystarczyć.

 

@Magnus: myślałem, że pochodzisz z Szarogórza ;)

Odnośnik do komentarza
Udostępnij na innych stronach

Chyba mam pomysł. Nie wiem jeszcze czy dobry bo nie mam jak chwilowo sprawdzić ale o opinie mogę już zapytać.

 

1. Zrobię maskę maskSprite (wymiarach np. 16x16 całe czarne z białym np. trójkątem)

2. Obiekt oFragment tworzony skryptem, który nada nowemu obiektowi sprite a następnie przykryje mu przeźroczystość tą maską:

 

create_oFragment(x, y, spriteIndex)

GML
var tmp;

tmp = instance_create_(x, y, oFragment);

 

sprite_assign (tmp.sprite_index, spriteIndex);

sprite_set_alpha_from_sprite(tmp.sprite_index, maskSprite)

 

tmp.direction = random(360);

tmp.speed = 2 + random(2);

 

A w draw oFragment:

GML
alpha -= 0.05;

speed -= 0.05;

 

if(alpha < 0)

{

sprite_delete(sprite_index);

instance_destroy();

}

else

{

draw_self();

}

Moje wątpliwości:

  • Czy pamięć po tak utworzonym sprite się zwolni? Czy muszę to zrobić ręcznie [Nie zwolni się :) - sprite_delete(sprite_index) - thx Tymon]
  • Tego teraz nie sprawdzę, ale co się stanie z obszarem poza maską [np. sprite do zakrycia 32x32, maska 16x16 - obszar poza będzie zakryty / odkryty?], najwyżej będę kombinował z tworzeniem kopii maski i jej przeskalowaniem
Odnośnik do komentarza
Udostępnij na innych stronach

Czy pamięć po tak utworzonym sprite się zwolni? Czy muszę to zrobić ręcznie [Wydaje mi się, że zwolni się wraz ze śmiercią uchwytu sprite_index]
Nie ma tak dobrze. Jedziesz ręcznie. :)
Odnośnik do komentarza
Udostępnij na innych stronach

  • 2 tygodnie później...

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