Skocz do zawartości

System Bicia


Radarow

Rekomendowane odpowiedzi

Powoli robię swoją bijatykę 2D, ale im dalej tym coraz więcej problemów i bałaganu w mojej grze. Chcę to teraz ogarnąć i nawet powoli idzie tylko największym problemem jest system walki, mam w głowię grę z masą postaci do grania przez co z każdą następną dochodzą nowe ciosy. Mam to tak wszystko biednie zrobione że gdy bije to zamieniam się w inny obiekt, a przeciwnik ma na mnie kolizje i obrywa, tylko że ten sposób wymaga za dużo pracy i robi się bałagan. Mam jak na razie 6 postaci a każda z nich ma po kilkanaście kolizji na różne ciosy innej postaci. Na pewno jest jakiś lepszy sposób, szukałem ale nie znalazłem nic co by jakoś znacząco pomogło. Macie jakieś pomysły? jakby co to nie jest bijatyka w której liczą się hitboxy, gra przypomina Little Fightera i gracz po prostu obrywa.

Odnośnik do komentarza
Udostępnij na innych stronach

UWAGA, nie wiem czy to najlepszy możliwy sposób!

W CREATE robisz zmienną. Nazywasz ją dla przykładu atak.

Możesz sobie gdzieś w komentarzu (czyli //komentarz) wpisać co szczególne liczby oznaczają. Powinno to wyglądać tak.

GML (create)
atak=0

//1 push, 2 frozen fire, 3 super-duper elo skill</span></span></span>

Przydałoby się mieć jakieś maski ataków. Chodzi o coś takiego:

Jeśli atakujesz w prawo, to nie chcesz żeby atakowało kogoś tyłkiem czy głową. Więc dopasowujesz sobie maskę do postaci, aby kolizja była tylko po prawej stronie.

Przy atakowaniu zmieniasz maskę na tą dobrą oraz zmienną atak.

Na evencie animation end, możesz mieć żeby wszystko wracały do normy (maska kolizji i atak=0).

W przeciwniku sprawdzasz tylko jaki jest atak, żeby dopasować dmg i ewentualne efekty.

GML (collision)
wAtak=other.atak

switch(wAtak)

{

case 0:

//NIC

break;

case 1:

{if alarm[0] = -1 then alarm[0] = 30

zabranyDMG=30} // to żeby nie robić milion alarmów

break;

case 2:

{if alarm[0] = -1 then alarm[0] = 30

zabranyDMG=48}

break;

//I tak dalej

}

Teraz odbieranie HP

GML (alarm0)
zycie-=zabranyDMG

Ale za chwile ktoś pewnie napiszę lepszy kod :)

@OffTopic

Nigdy nie robiłem bijatyk, zawsze w moich nibyGrach się strzelało, mniej zachodu ;>

Odnośnik do komentarza
Udostępnij na innych stronach

najprościej i najelastyczniej byłoby zrobić każdy atak/rodzaj ataku oddzielnym skryptem, który fajterzy gdzieś tam w stepie sobie wykonują przez execute_script, i zrobić jakiś system hitboxów (dla niewymagających gier przy ograniczonej rozróbie nawet niewidzialne obiekty mogłyby wystarczyć)

Odnośnik do komentarza
Udostępnij na innych stronach

ta metoda jest właśnie bardzo "nieograniczona", bo operujesz na zwykłym obiekcie który może robić wszystko to, co inne obiekty, np. może śledzić gracza, który takiego hitboxa stworzył, łatwo zmieniać swoje zmienne, maskę, ma własne alarmy, etc. zwróć uwagę na to, że niewidzialnym instancjom możesz przekazywać parametry, np. w ten sposób

GML
hitbox = instance_create ( x + 6346 , y + 45 , obj_hitbox );

hitbox.matka = id;

hitbox.mask_index = spr_hdfhd;

hitbox.obrazenia = 7;

hitbox.odrzut = 6;

hitbox.niewiem = 476;

właściwie mógłbyś zrobić sobie jeden obiekt hitbox i jechać z tym

Odnośnik do komentarza
Udostępnij na innych stronach

Do bijatyk przydadzą się timelines. Można tam zrobić animacje z określoną jej akcją,
da się zrobić system ataków za pomocą timeline'ów, ale operowanie na nich nie jest tak wygodne jak po prostu napisanie sobie skryptów, które zrobiłby to samo z użyciem jakiejś własnej zmiennej do mierzenia czasu
Odnośnik do komentarza
Udostępnij na innych stronach

da się zrobić system ataków za pomocą timeline'ów, ale operowanie na nich nie jest tak wygodne jak po prostu napisanie sobie skryptów, które zrobiłby to samo z użyciem jakiejś własnej zmiennej do mierzenia czasu

 

To zależy. Mi było wygodnie jak robiłem animację wybuchu od Maze Strategy zadający dmg o odpowiednim obszarze działania i pozycji w poszczególnych klatkach tej animacji.

Odnośnik do komentarza
Udostępnij na innych stronach

To zależy. Mi było wygodnie jak robiłem animację wybuchu od Maze Strategy zadający dmg o odpowiednim obszarze działania i pozycji w poszczególnych klatkach tej animacji.
tak, ale ze względu na interfejs edytora timeline'ów balansowanie takiej gry złożonej z np. 14 postaci po 12 ataków może być ciut bolesne, poza tym kod daje ci możliwość łatwego wykonywania danej czynności przez wiele klatek

 

timeline'y mają swoje zalety (np. to że gm sam dba o ich wykonywanie i funkcja shift w edytorze), ale należy zdecydować, czy w danym przypadku przy danej ilości elementów ich użycie jest dobrym rozwiązaniem

Odnośnik do komentarza
Udostępnij na innych stronach

MUGEN-y stosują system 'stanów' i 'flag'. Każda kombinacja klawiszy zmienia stan postaci. Każdy stan posiada kod inicjujący, w nim można np. napisać, żeby przy zmianie stanu atakowało wroga przed postacią. Istnieje kilka globalnych stanów (mają przypisane ujemne liczby) oznaczające np. bezczynność, bycie martwym itp.

Flagi pozwalają jednemu stanowi przystosowanie się do zachowania postaci (np. stan 150 odpali tylko, gdy flaga 'AIR' jest włączona). Stany również mogą być flagami.

System jest bardzo złożony i nie ogranicza się jedynie do zmiany stanów (można też tworzyć nowe obiekty, klony, pociski), ale dzięki niemu można stworzyć dowolną postać z każdej istniejącej bijatyki.

Odnośnik do komentarza
Udostępnij na innych stronach

Racja kiedyś się bawiłem toolami do Mugena, niezła zabawa tam dało się zrobić wszystko. Mugen to potężny silnik do bijatyk 2D. Tutaj jest wiki http://elecbyte.com/wiki/index.php/Main_Page można się wzorować na paru świetnych rozwiązaniach.

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