Skocz do zawartości

bomberman, wybuch bomby


Rekomendowane odpowiedzi

Witam, poradziłem sobie ze zrobieniem animacji wybuchu bomby, ale teraz chcę żeby eksplozja się zatrzymywała np. na ścianach.

Probowałem to rozwiązać tak:

1. zmienne : gora, dol,prawo,lewo - wszystkie są =1

2. w pętli ktora robila wybuch w 4 kierunkach zrobilem sprawdzenie if (instance_place(....)) // czy na pewno ta funkcja do tego sluzy??

a nastepnie jesli tam byla sciana to zmienna danego kierunku =0 np. lewo=0

3. Przy tworzeniu sprawdzam czy dany kierunek =0 , jesli 0 to przerywam, bo tam sie nie rozprzestrzenia.

 

Nie działało, ok, nie poddajemy się :D

 

no to moze tak: z użyciem place_free() // dobry pomysł??

 

GML
prawo=1; //0 - ściana, ogien sie nie rozprzestrzenia, 1 - idzie dalej

lewo=1;

gora=1;

dol=1;

for (i=1;i<global.zasieg;i+=1){

 

if (place_free(x-i*32,y) && lewo==1){instance_create(x-i*32,y,obj_bomba_po);}

else{lewo=0;}

 

if (place_free(x+i*32,y) && prawo==1){instance_create(x+i*32,y,obj_bomba_po);}

else{prawo=0;}

 

if (place_free(x,y-i*32) && gora==1) {instance_create(x,y-i*32,obj_bomba_pi);}

else{gora=0;}

 

if (place_free(x,y+i*32) && dol==1) {instance_create(x,y+i*32,obj_bomba_pi);}

else{dol=0;}

}

if (place_free(x-i*32,y) && lewo==1) {instance_create(x-i*32,y,obj_bomba_l);}

if (place_free(x+i*32,y) && prawo==1) {instance_create(x+i*32,y,obj_bomba_p);}

if (place_free(x,y-i*32) && gora==1) {instance_create(x,y-i*32,obj_bomba_g);}

if (place_free(x,y+i*32) && dol==1) {instance_create(x,y+i*32,obj_bomba_d);}

Wszystkie x i y są dobrze zrobione, to wiem, jest jak jest bo działam na polu zrobionym z kwadratów 32x32, w pętli tworzą się kolejne kratki gdzie rozprzestrzenia się ta eksplozja, a poza pętlą jest po prostu zakończenie, ostatnie kratki jakich dosięga wybuch.

 

1.Czy waszym zdaniem lepiej użyć place_free czy instance_place? (biorąc pod uwagę, że później będę musiał rozróżnić, czy na drodze stoi ściana, graczm przeciwnik, itp.)

2. Jak to zrobić żeby działało? :)

Z góry bardzo dziękuję za pomoc.

 

Używam Game Maker 8.0 Pro

Odnośnik do komentarza
Udostępnij na innych stronach

Używaj position_meeting() jest alternatywą dla instance_place(). Różnią się tym że pierwszy zwraca true/false, a drugi id instance.

 

place_free() i place_meeting() sprawdzają kolizję z użyciem maski aktualnego obiektu. position_meeting() i instance_place() sprawdzają czy instance jest na danej pozycji x/y.

 

Ogółem wydaje mi się że to co pokazałeś powinno działać. W czym jest błąd? W tych zakończeniach? Wartość "i" może być inna niż oczekujesz poza pętlą. I na pewno jest.

Odnośnik do komentarza
Udostępnij na innych stronach

Z tym co juz mam, to problem jest taki że ta eksplozja sie nie zatrzymuje na ścianach itp, tylko przechodzi dalej, mam ustawione : blok;pusto;blok;pusto;blok..

bomba wybucha przed blokiem i jeszcze za tym blokiem i za nastepnymi (tyle ile jest zasieg) jest widac eksplozję, same te bloki są widoczne cały czas chyba tylko z tego powodu ze animacja eksplozji jest "pod" blokami, ktore to zasłaniają.

Ja chcę oczywiście żeby to się zatrzymywało na bloku. I TU jest problem... :)

 

Zakonczenia są dobrze.

Odnośnik do komentarza
Udostępnij na innych stronach

No to:

GML
in=noone;

prawo=1;

lewo=1;

gora=1;

dol=1;

for (i=1;i<global.zasieg;i+=1){

 

if (position_meeting(x-i*32,y) && lewo==1)

{

in=instance_create(x-i*32,y,obj_bomba_po);//Stwórz nowy obj_bomba_po i zapisz jego id do zmiennej

}

else

{//Gdy napotkałeś ścianę

lewo=0;

if(instance_exists(in)){with(in){instance_destroy()}}//Usuń już istniejący obiekt. Ten zapisany w zmiennej, czyli ostatni utworzony

instance_create(x-i*32,y,obj_bomba_l);//W jego miejsce wstaw obiekt kończący

}

 

(...)

}

 

Przy okazji patrząc na twoje obiekty pozwolę sobie zapytać: Używasz dziedziczenia (parent/child)?

Odnośnik do komentarza
Udostępnij na innych stronach

nie używam dzieciczenia i szczerze mówiąc to nawet nic o tym nie wiem. Prawie wszystko co robię tutaj, odkrywam na bieżąco, opierając się jedynie na tym co umiem z c++ :)

czym jest in=noone ?

przeanalizuję to (moze mi to troche zająć) i dam znać jak działa :)

Dziękuję

 

@edit

w kodzie, który wkleiłeś jest if (position_meeting(x-i*32,y) && lewo==1) -- program mi pokazuje ze brakuje argumentu (chce zebym podal obiekt) ale to ma byc prawdziwe wtedy kiedy jest puste pole, a nie obiekt. Czy mam zrobić to z negacją i wpisać wszystkie możliwosci tych obiektów czy cos innego?

Jak na razie to dostaje tu błąd: brakuje arg.

Odnośnik do komentarza
Udostępnij na innych stronach

in=noone czyli tak na prawdę in=-4, to przypisanie do zmiennej wartości która na pewno odpowiada za "brak instance". Dzięki temu potem funkcja instance_exists(in) może działać bez błędów. Bo gdyby bomba wybuchła w miejscu tuż obok ściany to od razu chciałoby wykonywać kod w else i wywaliło by błąd.

 

Ogółem ten kod co podałem już widzę że jest źle właśnie z tego powodu. Bo jeżeli wybuch był pod ścianą to usunie ostatni element z innego kierunku.

Radzę zrobić 4 osobne for dla każdego z kierunków i przerywać je break.

 

Dziedziczenie jest tutaj dla Ciebie niezwykle ważne. Wystarczy że zrobisz jeden "wspólny" obiekt wybuchu a każdy inny który ma inną grafikę ustawisz jako jego dziecko. Tylko ten jeden obiekt rodzic powinien zawierać jakikolwiek kod, dzieci będą zachowywać się tak samo. Więc jeżeli w rodzicu ustawisz event "Animation end" to nie musisz tego ustawiać w dzieciach, a nawet nie powinieneś. Dzieci same przejmą event po rodzicu. (Ale właśnie w wypadku gdy dziecko też będzie miało ten sam event to dziecko nie będzie dziedziczyć tego po rodzicu). Akurat z tego nie skorzystasz za bardzo, ale warto o tym pamiętać.

 

Za to skorzystasz z tego że nie musisz teraz sprawdzać kolizji z każdym obiektem eksplozji, a masz ich kilka. Teraz wystarczy że będziesz sprawdzać kolizję z rodzicem. Twoich eksplozji masz chyba 7 różnych obiektów. Jeżeli chciałbyś sprawdzać kolizję bez dziedziczenia to musiałbyś robić 7 różnych eventów kolizji.

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