feedthezombie Opublikowano 26 Czerwca 2015 Udostępnij Opublikowano 26 Czerwca 2015 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 Więcej opcji udostępniania...
Threef Opublikowano 26 Czerwca 2015 Udostępnij Opublikowano 26 Czerwca 2015 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 Więcej opcji udostępniania...
feedthezombie Opublikowano 26 Czerwca 2015 Autor Udostępnij Opublikowano 26 Czerwca 2015 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 Więcej opcji udostępniania...
Threef Opublikowano 26 Czerwca 2015 Udostępnij Opublikowano 26 Czerwca 2015 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 Więcej opcji udostępniania...
feedthezombie Opublikowano 26 Czerwca 2015 Autor Udostępnij Opublikowano 26 Czerwca 2015 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 Więcej opcji udostępniania...
Threef Opublikowano 26 Czerwca 2015 Udostępnij Opublikowano 26 Czerwca 2015 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 Więcej opcji udostępniania...
feedthezombie Opublikowano 26 Czerwca 2015 Autor Udostępnij Opublikowano 26 Czerwca 2015 dobry pomysł z tym breakiem, heh, do tego naszczescie niewiele gm potrzebne :) Masz rację, zrobię chyba tak ze na początku bede robil jeden kierunek do konca, potem pozostale, moze tak bedzie git, dzieki za pomoc :) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
I am Lord Opublikowano 26 Czerwca 2015 Udostępnij Opublikowano 26 Czerwca 2015 I przerzuć się na darmowy GMS bo ten posiada więcej możliwości niż pro GM8.1 Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
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ę