Skocz do zawartości

Problemy z fizyką w top down shooter


Paindemonium

Rekomendowane odpowiedzi

Witam, to mój pierwszy post tutaj. Od dwóch dni próbuje rozgryźć fizykę w tym programie. Technicznie ona działa na wersji standard bo z takiej korzystam na przykładzie tego tutoriala:

przyjemny prosty i można się pobawić fizyką. Problem polega na tym ze nadaje się to tylko na platformówki. Ja staram sie zrobić prostego shootera na miarę Alien Shooter ale chce zaimplementować fizykę. Próbowałem działać krok po kroku jak w tym oto tutorialu:
(pierwsza część też). Jak widać facio sobie chodzi, wiele w kodzie nie musiał dodawać by boxy i pozostałe obiekty się ładnie zderzały i śmigały po powierzchni niczym po lodzie. Fizyka tu działa. U mnie jest problem na poziomie komend i kolizji obiektów. O tyle o ile stworzyłem bez fizyki pierwszy szablon gry gdzie niczym w crimsonland chodzimy pixel gościem i strzelamy do pixel potwororków to próba dodania fizyki kończy się na braku reakcji. Mam zaimplementowany całkiem inny system sterowania niż ten w tutorialu ale to głównie dla tego że ten powyżej wykorzystuje poruszanie się związane z fizyką. U mnie nie działa bo wywala mi pierwszą linijke przy poruszaniu się z przedrostkiem "phy_" jako że gdzieś tu jest błąd. Spisałem wszystko dokładnie i jest jak na filmiku a program potwierdza ze komenda jest właściwa. Próba odpalenia gry na tym kodzie kończy się wykrzaczeniem z errorem, który rzekomo gdzieś tutaj się znajduje. Druga sprawa tyczy się fizyki obiektów. W przypadku pierwszego tutoriala, fizyka u mnie działa... klocki ładnie opadają i się zderzają. Miodzio, ale wyklucza to możliwość poruszania się postaci mowa o właczeniu mapy jako obszaru fizycznego. Próba zrobienia tego jak w tutorialu nr 2 kończy się brakiem reakcji ze strony obiektów... nie ma kolizji, nie ma fizyki. Zero. Natomiast w przypadku mapy jako obszaru fizycznego mimo pworowadzania innych wartości grawitacji itp, one automatycznie wracają do standardowych.

 

Pytanie brzmi. Czy wersja standard jest na tyle okrojona ze nie moge zrobic tego tak jak na tym filmiku czy wina leży gdzie indziej? Chciałbym wiedzieć bo nie chcę w razie problemu wywalić w błoto kasy gdy się okaże że standard wersja mi całkowicie by wystarczyła. Zależy mi na prostej fizyce, która by urozmaiciła grę. Pozdro.

Odnośnik do komentarza
Udostępnij na innych stronach

No to fajnie. To pytanie zmienia się ale nadal dotyczy problemu fizyki. CO ROBIĘ ŹLE? Wykonuje wsyzstko jak na tutorialu nr2 ale niestety kończy się to na tym ze boxy sobie stoją w miejscu a postać przez nie przenika. Poleci ktoś dobry pomysł na zaimplementowanie prostej fizyki obiektów? Myślę że jak uda się zrobic pierwszy krok, dalej powinienem sobie poradzić. Wystarczy ze uda mi się popchnąć innym obiektem, drugi tak jak na filmiku. Pozdrawiam.

Odnośnik do komentarza
Udostępnij na innych stronach

Nie powiedziałeś w czym problem. Dopiero teraz wspomniałeś o tym ze nie ma kolizji pomiędzy obiektami. Domyślam się już co może Ci pomóc, ale wciąż strzelam na ślepo. W jednym z obiektów pomiędzy którymi ma zachodzić kolizja musisz stworzyć event kolizji tych dwóch obiektów. Wewnątrz tego eventu mysi być jednak jakaś akcja bo inaczej event się usunie. Dodaj tam kod z jakimś komentarzem, ale klocek komentarza (żółty znak z wykrzyknikiem). Musisz tak zrobić dla każdego obiektu dla jakiego chcesz aby zaszły kolizje.

Odnośnik do komentarza
Udostępnij na innych stronach

Dawno o tym wiedziałem ale dzięki za info. Pobrałem projekt tego Pana i działa on wyśmienicie. Jutro będę dochodził gdzie leży błąd, albo na podstawie tego projektu zacznę się bawić. Już widzę system fizyki działa na zasadzie 'Albo wszystko, albo nic" czyli nie ma mowy o normalnym poruszaniu się postaci w swiecie fizycznym a normalne poruszanie się niczym w Hotline Miami jest możliwe ale bez fizyki. Tu leży teraz pies pogrzebany. Postać ślizga się jak na lodzie :) Przydało by się zredukować ten element do zera, bo na tym efekcie zależy mi tylko na elementach otoczenia czyli pudła itp. Dzięki za pomoc bo juz jest jakiś progres.

Odnośnik do komentarza
Udostępnij na innych stronach

Mam pada ale wolę by to było pierwotnie sterowanie na WSAD. Aktualnie problem przy tym projekcie jest taki że z fizyką, nie można się normalnie poruszać bo postać stoi jak wryta i jedyny model poruszania się to siła fizyki i postać ślizga się jak szalona. Gdyby tylko udało się ją jakoś przymocować do podłoża, to była by połowa sukcesu. Mam wrażenie że włączenie fizyki wyklucza normalne sterowanie postacią więc mam do wyboru... albo to albo grę bez fizyki, co bardzo bym nie chciał bo to jakieś urozmaicenie. Wprowadzone mam sterowanie 8 kierunkowe, promowane przez wielu użytkowników programu za pomocą kodu. Z fizyką muszę uzywać tego z tutoriala ale jak mówię... ta ślizgawka to nie to.

Odnośnik do komentarza
Udostępnij na innych stronach

Zamiast poczytać wszystko w dokumentacji to problemy robisz. :D

Zamiast zwykłego x w Box2D używasz phy_position_x, zamiast direction używasz phy_rotation i ustawiasz phy_fixed_rotation = true.

Odnośnik do komentarza
Udostępnij na innych stronach

Jak tylko siądę do projektu to przedstawie wam dwa sposoby poruszania się jakie wykorzystałem i na czym polega problem w tej kwestii. Reszta problemów została rozwiązana dzięki waszej interwencji i pomocy. Dzięki. Nie mniej ten jeden jeszcze mi ciąży na wątrobie :).

 

Edit: Ok To wygląda jakoś tak.

 

Movement przedstawiony na tutorialu opiera się na fizyce, działa gdy jest włączona fizyka na mapie.

 

mouse_dir = -point_direction(phy_position_x, phy_position_y, mouse_x, mouse_y);

phy_rotation = mouse_dir;

image_speed = lerp(image_speed, 0, 0.1);;

 

move_speed = 160;

 

if(keyboard_check(ord('W'))){

image_speed = phy_speed_y / 1;

physics_apply_force(x,y,0,-move_speed);

}

if(keyboard_check(ord('S'))){

image_speed = phy_speed_y / 1;

physics_apply_force(x,y,0,+move_speed);

}

if(keyboard_check(ord('A'))){

image_speed = phy_speed_x / 1;

physics_apply_force(x,y,-move_speed,0);

}

if(keyboard_check(ord('D'))){

image_speed = phy_speed_x / 1;

physics_apply_force(x,y,+move_speed,0);

}

 

Natomiast jeżeli chodzi o movement bez fizyki, czyli typowy, normalny dla tego typu gier, to obrobiłem skrypcik na takie coś:

 

if (keyboard_check(ord("W"))){

y-=10;

}

else if(keyboard_check(ord("S"))){

y+=10;

}

if(keyboard_check(ord("A"))){

x-=10;

}

else if(keyboard_check(ord("D"))){

x+=10;

}

 

 

Oba działają ale mają następujące minusy. Pierwszy opiera się na sile fizyki w programie. Wprawia obiekt w ruch a potem po prostu się ślizga jak po lodzie. Nie wiem jak zminimalizowac albo usunąć ten efekt dla poszczególnych obiektów, czyli postaci gracza, wtedy by nie było problemu. Chciałem więc wprowadzić ten drugi kod, ale on nie działa podczas włączonej fizyki, postać jest nieruchoma. Przy wyłączeniu fizycznego świata, działa świetnie ale już obiekty fizyczne nie działają... coś za coś. Nie chce mi się trochę w to wierzyć. Liczę ze ktoś mnie nakieruje i podpowie jak zrobic to tak by działało jak w Hotline Miami gdzie niektóre obiekty spokojnie działały na fizyce a postać chodziła bez problemu niczym w serii GTA. jakieś sugestie?

Odnośnik do komentarza
Udostępnij na innych stronach

GML
mouse_dir = -point_direction(phy_position_x, phy_position_y, mouse_x, mouse_y);

phy_rotation = mouse_dir;

image_speed = lerp(image_speed, 0, 0.1);;

 

move_speed = 160;

 

if(keyboard_check(ord('W'))){

image_speed = phy_speed_y / 1;

physics_apply_force(x,y,0,-move_speed);

}

else

if(keyboard_check(ord('S'))){

image_speed = phy_speed_y / 1;

physics_apply_force(x,y,0,+move_speed);

}

else

physics_apply_force(x,y,0,0)

 

if(keyboard_check(ord('A'))){

image_speed = phy_speed_x / 1;

physics_apply_force(x,y,-move_speed,0);

}

else

if(keyboard_check(ord('D'))){

image_speed = phy_speed_x / 1;

physics_apply_force(x,y,+move_speed,0);

}

else

physics_apply_force(x,y,0,0)

spróbuj tak. W ogóle to masz jakiś tutek do tej całej fizyki bo to wydaje się być fajna sprawa tylko obiektu nie umiem ustawić tak żeby nie spadał w dół za każdym razem jak włączę fizykę.

Odnośnik do komentarza
Udostępnij na innych stronach

W moim poprzednim poście napisałem:

Jeżeli chcesz robić poruszanie bazujące na zmianie x i y, to zamiast x i y musisz używać phy_position_x i phy_position_y. To wszystko.

 

Edit: A twoje ślizganie jest przez to że masz źle dobrane właściwości fizyczne. Density etc.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeżeli chcesz robić poruszanie bazujące na zmianie x i y, to zamiast x i y musisz używać phy_position_x i phy_position_y. To wszystko.

Bullshit. W Box2D NIE ZALECA się operowania bezpośrednio na XY obiektu - do tego służą aplikacje sił.

Odnośnik do komentarza
Udostępnij na innych stronach

No spoko. Skoro nie da się zrobić tak by sterowanie postaci podczas włączonej fizyki było z nią niepowiązane, tylko jak jest fizyka to po całosci (liczyłem wprowadzic fizykę tylko konkretnych obiektów), to skoro postac ślizga się jak szalona po podłodze, to który parametr i w jaki sposób należy ustawić? Robiłem różne kombinacje i albo poruszałem się za wolno albo jak sie rozpędziłem to wyhamować ciężko. Potrzebne mi maksymalne "tarcie" obiektu z powierzchnia o ile coś takiego istnieje by postać byął wprawiana w ruch siłą wtedy i tylko wtedy gdy wciskamy klawisz. A potem by nie jeździła jak na lodzie. Dzieki z góry za pomoc ludziska :).

Odnośnik do komentarza
Udostępnij na innych stronach

Możesz odrzucić całkowicie fizykę Box2D i napisać własną. Box2D nie uznaje kompromisów i wszystko musi zachowywać się zgodnie z zasadami dynamiki Newtona. Nie ma czegoś takiego jak "całkowite zatrzymanie obiektu w jednym momencie", chyba że to sobie dokładnie wyliczysz.

 

Możesz też bawić się z siłami i impulsami czy też ograniczeniami (constraints), jeżeli chcesz koniecznie zostać przy Box2D, za wiele ci tu nie pomogę.

Odnośnik do komentarza
Udostępnij na innych stronach

Możesz odrzucić całkowicie fizykę Box2D i napisać własną. Box2D nie uznaje kompromisów i wszystko musi zachowywać się zgodnie z zasadami dynamiki Newtona. Nie ma czegoś takiego jak "całkowite zatrzymanie obiektu w jednym momencie", chyba że to sobie dokładnie wyliczysz.

 

Możesz też bawić się z siłami i impulsami czy też ograniczeniami (constraints), jeżeli chcesz koniecznie zostać przy Box2D, za wiele ci tu nie pomogę.

 

Wiesz, przy fizyce chodzi mi o to ze przydała by się do urozmaicenia gry by działa tylko na okreslone obiekty jak resztki ciała czy pudła. Do reszty mi nie jest to potrzebne. Przy okazji jedyny efekt, który ma jakieś elementy fizyki i mi działa mimo wszystko zaczerpnąłem tutaj

doskonale i proste przedstawienie jak zrobić niegłupią krew. Próbowałem zamiast tych partykli podstawić własne obiekty ale nie wychodziło. Może ktoś ma pomysł jak? Wtedy właściwie to mi to wystarczy do zabawy.
Odnośnik do komentarza
Udostępnij na innych stronach

Particles mają coś związanego z fizyką? Btw. robienie tej krwi za pomocą obiektów nie jest zbyt dobrym pomysłem.

 

Nie nie nie... źle mnie zrozumiałeś. Krew mi pasi ale chcę ten pseudofizyczny efekt wykorzystać przy tworzeniu dodatkowych elementów jak mięso i kości odpadające po rozwaleniu przeciwnika :). Między innymi krew zostaje w tej formie, chyba ze uda mi się ją z kumplem podrasować. Zależy mi na tym by w ten sam sposób stworzone obiekty gore też wylatywały od środka niszczonego obiektu czyli przeciwnika. Co do poprzedniego wpisu odnośnie Gravity itp... czy mi starczy. Wiesz... to gravity nie działa przy wyłączonej fizyce na mapie więc wiele mi to nie daje. Dla tego jedyny element fizyki, a przynajmniej tworzace takie wrażenie przy normalnym sterowaniu WSAD postaci bez wprawiania jej w ruch siłą fizyki pasuje jak ulał z tego tutoriala metoda tworzenia krwi. Chciałbym ją wykorzystać do tworzenia zamiast partykli, własne obiekty. Dało by to ukierunkowany efekt np pod stworzenie wylatujących łusek z karabinu. Kwestia leży jednak, jak to zmodyfikowac by zamiast kropeczek pojawiały się w tym miejscu własne obiekty.

Odnośnik do komentarza
Udostępnij na innych stronach

Za bardzo nie korzystam z particle, ale to chyba rozwiązuje kwestie łusek itd. part_type_sprite(ind, sprite, animate, stretch, random);

Zamiast za każdym razem tworzyć obiektu (co przy takim minigunie, nie będzie ciekawe), ogarniasz particle które mają sprite łuski. Bo o ile się nie mylę tak to działa.

Odnośnik do komentarza
Udostępnij na innych stronach

Mniej tutoriali, więcej własnej inwencji :) Tak jak pisał Threef - nie musisz stosować fizyki do jakichś wyszukanych rozbryzgów. Użyj friction, czyli tarcia, oraz random, czyli losowości. Dodaj rotacje obiektu (flaków) i masz całkiem ciekawy efekt. Pamiętaj, im bardziej ograniczony GM tym bardziej musisz się wysilić, aby coś sensownego zkiminić. Nie zmienia to faktu, że się da!

Odnośnik do komentarza
Udostępnij na innych stronach

  • 2 tygodnie później...
Mniej tutoriali, więcej własnej inwencji :) Tak jak pisał Threef - nie musisz stosować fizyki do jakichś wyszukanych rozbryzgów. Użyj friction, czyli tarcia, oraz random, czyli losowości. Dodaj rotacje obiektu (flaków) i masz całkiem ciekawy efekt. Pamiętaj, im bardziej ograniczony GM tym bardziej musisz się wysilić, aby coś sensownego zkiminić. Nie zmienia to faktu, że się da!

 

A jak można zrobić by obiekt się obracał? Pomijając fakt zrobienia gifa czyli 5-6 tych samych spritów tylko w innych pozycjach ale wolałbym by było to bardziej losowe. To samo tyczy się tworzenia obiektów np krew, w różnych pozycjach a nie jak zawsze ustawioną w jednym kierunku. Oczywiście można to zrobić napaćkając w diabły elementów ale zastanawiam się czy istnieje skrypt, który pozwoli ustawic obiekt zawsze w losowej pozycji, tak jak losowo można dla obiektów ustawić kierunek lotu podczas ich pojawienia się. :)

Odnośnik do komentarza
Udostępnij na innych stronach

W obiektach jest to image_angle. Jeśli korzystasz z direction to wystarczy image_angle=direction. A w particle jestem prawie na 100% pewien, że też jest zabawa z angle.

 

No Ok czyli ten konkretny kodzik obraca mi sprita/obiekt. Pytanie brzmi jak trzeba go spisać by obiekt się obracał np podczas ruchu w lewo lub w prawo albo by respawnował się zawsze w innej pozycji. losowej. Pozdro.

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