Skocz do zawartości

Niszczenie jak w grach typu worms


Rekomendowane odpowiedzi

Głowię się nad tym jak zrobić niszczenie takie jak w grach typu worms - pocisk czy coś spada i sie takie wgniecenie w ziemi robi, albo kawał ziemi wyżera od wybuchu.

To trzeba jakoś zrobić, że ten kawałek sprita który jest w dystansie mniejszym niz np 100 ma sie uciąć, ale jak to zrobić :( ?

 

Z gory thx

Odnośnik do komentarza
Udostępnij na innych stronach

Na surface'ach, o ile wiesz, co to jest.

 

PO prostu rysujesz odpowiednie kółka na surface'sie, który jest terenem.

 

Tylko nie rób takiego idiotycznego błędu jak kilku userów, aby zamieniać surface'a na sprite'a - w GMie jest to niewydajne, a w skrajnych przypadkach pojawiają się bugi.

Licz kolizje bezpośrednio na surface'sie.

Odnośnik do komentarza
Udostępnij na innych stronach

Masz na stronie co najmniej jeden przykład. Luknij.

 

Tyle że tam akurat jest chyba zamienianie na sprita.

 

Licz kolizje bezpośrednio na surface'sie.

Nie sądzisz ze za dużo od niego wymagasz? To jest misiek :)

Odnośnik do komentarza
Udostępnij na innych stronach

Normalnie :D

A powiedz mi, wolisz co Stepa (bądź w momencie niszczenia ściany) robić nowego sprite'a :P ?

Sposobów na to jest kilka. Najbardziej na chama to po prostu używając surface_getpixel() [oczywiście nie dla każdego pixelu sprite'a]. Metoda i tak nieporównywalnie wydajniejsza od tworzenia nowego sprite'a.

 

ja tego surfaces w ogole nie pojmuje.. nie da sie tego innaczej zrobic?
Nie.

 

Ale czekaj... czego można w surface'ach nie pojmować ;/ ?

GML
Create

surf = surface_create(80, 60);

 

Draw

surface_set_target(surf);

//Od teraz wszystko, co malujemy nie maluje się na roomie, tylko na surface'sie

draw_text(5, 5, "lol");

 

surface_reset_target();

//Koniec malowania na surface'sie. Od teraz malujemy normalnie, "na roomie".

draw_surface(0, 0, surf); //nie jestem pewny kolejności argumentów.

//

Surface'sy mają to do siebie, iż jeśli namalujemy coś na nich RAz, w czasie jednego stepa, to nawet po pół godziny gry to, co namalowaliśmy ciągle będzie na surface'sie.

Surface to na Twój rozum taki Paint... :P

 

Ale zaraz zaraz. Coś się pieprzy. Niby lekko widać tekst, ale wokół niego powstają różne dziwne rzeczy ;/ (surface'sy są przechowywane w pamięci karty graficznej, więc w pustej powierzchni surface'a poijawiają się różne obrazy właśnie z karty graficznej. Jeśli będziemy malować gdzieś w GMie linię - mogą się na surface'sie pojawiać linie. Kiedy kiedyś miałem na laptopie GDATĘ, to nawet widziałem na surface'ach jej logo... :P)

 

GML
surface_set_target(surf);

draw_clear_alpha(c_white, 0); //Ta funkcja zamaluje całą powierzchnię surface'a białym kolorem, o pełnej przeźroczystości. Wiem, że to dziwne, no ale tak jest... :P

surface_reset_target();

 

I drobna uwaga - lepiej nie uzależniać swojej gry od surface'ów. Otóż surface'y są przechowywane w pamięci karty graficznej. A więc, jeśli chcieli byśmy stworzyć surface'a o rozmiarach 10k^2, niewiele komputerów by takie coś udźwignęło.

Czy udało się utworzyć surface'a można sprawdzić w prosty sposób:

GML
if(!surface_exists(surf)){ show_message("Za malo pamieci"); game_end }
(zaraz po utworzeniu surface'a)
Odnośnik do komentarza
Udostępnij na innych stronach

Metoda i tak nieporównywalnie wydajniejsza od tworzenia nowego sprite'a.

metodę tworzenia nowego sprite'a można uwydajnić dzieląc większy teren na kawałki. Takie rozwiązanie zastosowane jest w moim JWorms i za bardzonie tnie.

Odnośnik do komentarza
Udostępnij na innych stronach

coś mi się nie widzi sprawdzanie get_pixel :P

 

i nie który z tych "idiotów" pomyśleli o optymalizacji i nie tworzą sprita "co Stepa",ale tylko i wyłącznie w chwili niszczenia terenu (patrz mój przykład :D). Jeszcze robiąc tak jak mówi Jaklub - dzieląc teren na kilka mniejszych części, można stworzyć na prawdę optymalny system :P

Odnośnik do komentarza
Udostępnij na innych stronach

Sposobów na to jest kilka. Najbardziej na chama to po prostu używając surface_getpixel() [oczywiście nie dla każdego pixelu sprite'a]. Metoda i tak nieporównywalnie wydajniejsza od tworzenia nowego sprite'a.

Kompletne bzdura. Draw_getpixel (które działa na tej samej zasadzie co surface_getpixel) jest jedną z NAJWOLNIEJ działających funkcji GMa. Jeśli chcemy sprawdzić kolizję z surface, siłą rzeczy musimy przekonwertować cały surface lub jego część w sprite'a. Nie ma na to "kilku sposobów".

 

Poza tym, naczelna zasada odnośnie korzystanie z surfaces - nigdy nie edytuj surface'a w evencie Draw. Umieszczasz tam jedynie instrukcję rysującą surface na ekranie:

 

GML
draw_surface(x,y,surf);

Właśnie przez ten błąd na surface powstają, jak Ty to ująłeś, "różne dziwne rzeczy". Wycinek z helpa:

 

You should never change the drawing target while you are actually drawing on the screen, that is, never use it in drawing events. This will cause serious problems with the projection and viewport.

Następnym razem sprawdź, zanim coś napiszesz, bo niepotrzebnie wprowadzasz ludzi w błąd.

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