Skocz do zawartości

Gra RPG - cienie, kolizje


Kirian

Rekomendowane odpowiedzi

Witam wszystkich - to jest mój pierwszy post na forum.

Tworze grę action RPG - hack and slash dokładniej rzecz ujmując. Poniżej dostępne są screeny z aktualnego etapu. Postacie tworzę (modyfikuję, bo w większości przypadków są to darmowe modele) w 3DS MAX. następnie renderuje i tworze gify w GM`ie. Z tego powodu natknąłem się na kilka problemów i nie bardzo widzę ich rozwiązanie, metoda prób i błędów nie przynosi rezultatów :P

1. GM słabo wycina tło, przez co nie mogę renderować z antyaliasingiem. A to także pozbawia mnie możliwości renderowania efektów specjalnych. Czy są jakieś dokładne metody wycinania tła? Nie wstawiam sprite`ów do GM, tylko wczytuję z zewnątrz, więc proszę o ew. propozycje przykładów w kodzie. Po włożeniu wszystkich grafik do GM`a plik .exe zajmowałby 140MB i ładowałby się kosmicznie długo...

2. Cienie - jest problem z renderowaniem postaci z cieniami, choć może się to uda, ale chciałbym spróbować to jakoś obejść. Na jednym ze screen`ów widać pseudo-cień jaki wstawiłem pod postacią jako oddzielny obiekt. Może można jakoś zduplikować sprite`a i przekształcić go, zaciemnić i zrobić taki Photoshop`owy efeket cienia?

3. To jest największy problem i na ile pozostałe jeszcze strawię, na tyle ten bardzo chciałbym jakoś rozwiązać. Chodzi o kolizje (screen z kowalem). Próbowałem już różnych funkcji odpowiedzialnych za kolizje i zawsze problem wygląda podobnie. Sterowanie w mojej grze wygląda następująco:

W Global Mouse Button:

if((abs(gracz.x-mouse_x))<=30 && (abs(gracz.y-mouse_y)<=30)) {speed=0;}
else {mp_potential_step(mouse_x, mouse_y, 3, false); speed=3;}

I tak jeśli podejdę do kowala, to postać w pewnym sensie się od niego odbija lub zatrzymuje, ale jest możliwość "zaplątania" się w niego. Jak zrobić aby postać podeszła do kowala na pewną odległość i nie poszła ani kawałek dalej. Próbowałem dołożyć maskę do kowala i na jej podstawie rozpatrywać kolizje, lecz nic to nie dało.

 

Z góry dziękuję za odpowiedzi i przepraszam, jeśli gdzieś są rozwiązania tych problemów, a ja ich nie znalazłem. Pozdrawiam każdego komu się chciało to wszystko przeczytać ;)

 

screen1.jpg

screen2.jpg

screen4.jpg

Odnośnik do komentarza
Udostępnij na innych stronach

Ad. 2)

Rysowanie tego samego sprite na innych pozycjach... Niby cień...

GML
Draw Event:

 

draw_sprite_ext(sprite_index,image_index,x+pozycja_cienia,y+pozycja_cienia,image_xscale,image_yscale,image_angle,c_black,prześwit_cienia(od0do1);

draw_sprite(sprite_index,image_index,x,y);

Odnośnik do komentarza
Udostępnij na innych stronach

  • 4 tygodnie później...

Jeśli chodzi o kolizje to działają one już akceptowalnie... Kolidują bounding boxy i gracz odbija się od obiektów, nie mogłem dać speed=0 w przypadku kolizji, ponieważ postać nadal zaplątywała się w inny obiekt i ciężko nią było ruszyć w jakimkolwiek kierunku :/

 

Natomiast cienie działają całkiem ładnie, dzięki CuB3. Nie są one idealne, ponieważ nie zawsze nadążają za obiektem - efekt a`la Lucky Luke ;)

Zastosowany kod w STEP EVENT to:

x=gracz.x; 
y=gracz.y; 
draw_sprite_ext(gracz.sprite_index,-1,x+3,y-3,-1,-1,150,c_black,0.3);

Odnośnik do komentarza
Udostępnij na innych stronach

Nie bardzo rozumiem to pytanie Yoda, ale jesli chodzi tu o cienie, to na początku zrobiłem obiekt oddzielny, natomiast aktualnie wszystko znajduje się w DRAW obiektu gracz.

 

W STEP przeciwnika mam taki kod:

sprite_index=szkielet_stoi_1; if (image_index==16) {atak=1;} walka=0;

 

Gdy atak=1 zadawane są obrażenia.

Po przeniesieniu tego kodu do DRAW i odpowiednich zmianach, nie działa część:

 

if(image_index==16)

 

Jak sprawdzić czy jest określona klatka animacji, jeśli do wyświetlania sprite`a używa się:

 

draw_sprite(szkielet_stoi_1,-1,x,y);

Odnośnik do komentarza
Udostępnij na innych stronach

może draw_sprite(sprite,image_index,x,y)?

o to chodzi?

 

Nie bardzo rozumiem to pytanie Yoda, ale jesli chodzi tu o cienie, to na początku zrobiłem obiekt oddzielny, natomiast aktualnie wszystko znajduje się w DRAW

Tak chodziło mi o cienie - jak dla mnie to był bezsens robić niepotrzebne obiekty.

 

PS używaj znaczników [ gml ] [ /gml ]

Odnośnik do komentarza
Udostępnij na innych stronach

Zazwyczaj do wyświetlenia sprite`a używa się:

 

GML
sprite_index=szkielet_stoi_1;

 

W takim wypadku, aby przypisać do konkretnej klatki animacji jakieś wydarzenie, wystarczy użyć:

 

GML
if(image_index==16)

 

Natomiast, jeśli do wyświetlania sprite`a używa się:

 

GML
draw_sprite(szkielet_stoi_1,-1,x,y);

 

To jak napisać powyższy warunek? Bo z tego co widziałem, to po przeniesieniu kodu właśnie ten fragment nie działa, wyskakuje błąd "unknown variable image_index", czy coś podobnego...

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