Skocz do zawartości

Zablokowane Kolizja II


Rekomendowane odpowiedzi

Witam, ten temat wiąże się trochę z moim poprzednim.

Mam problem znowu z kolizją.

 

GML
// zapisanie informacji o kącie zderzenia

var dir;

dir = point_direction(x, y, other.x, other.y);

 

// podział na poszczególne reakcje

if ((dir >= 45 && dir <= 135) || (dir >= 225 && dir <= 315))

y += abs(vspeed)*sin(degtorad(dir));

if ((dir >= 135 && dir <= 225) || (dir >= 315 || dir <= 45))

x -= abs(hspeed)*cos(degtorad(dir));

 

Użyłem tego kodu Rudego. Ale nie działa on jak powinien. Próbowałem zmieniać go na różne sposoby, jedne bardziej pomagały, drugie nie.

Kod działa przez chwilę, a następnie postać przesuwa się do przodu o jeden pixel i się blokuje. Jakieś pomysły? Problem być może jest dlatego, że moja ściana, składa się z kilku bloków. Więc nie jest to jeden obiekt z którym postać koliduje, ale po koleji kilka.

 

Proszę o pomoc ;)

Odnośnik do komentarza
Udostępnij na innych stronach

GML
y += abs(vspeed)*sin(degtorad(dir));

czy to nie to samo co

y+=lengthdir_y(dir,vspeed) ?

Nie do końca, dokładniej cos takiego:

y -= lengthdir_y(dir,abs(vspeed));

znak minus, bo y się zmniejsza w górę. No i abs, bo tak do działania wejdą nam dwa minusy, a nam potrzebny tylko jeden (z sin, lub lengthdir).

 

 

Co do tematu:

Hmmm... najcudowniej by było dostać twój projekt. Wtedy wszystko byłoby jasno i wyraźnie pokazane.

Na chwilę obecną mogę ci powiedzieć tak:

- o ile te bloki nie nachodzą na siebie wszystko jest ok.

- originy sprite'ów muszą być na środku i obiekt (a właściwie maska) powinien mieć kształt kwadratu.

 

Jeśli originy nie masz na miejscu, a przestawianie to kupa roboty (np ze względu na gotową mapę) dodaj za other.x i other.y tyle pikseli (x i y) ile powinien mieć origin, wyjdzie na 0. (czyli ...x, y, other.x+16, other.y+16...)

Jeśli maska nie ma kształtu kwadratu (np z powodu zaokrąglonych rogów sprite'a) trzeba ją ustawić:

- jeśli ogólnie ściana ma kształt kwadratu (dokładniej, Bounding Box tworzy kwadrat), usuń ticka z Precise Collision Checking w opcjach sprite'a ściany

- jeśli ściana ma kształt prostokąta: umieść tutaj wygląd tej ściany, zmieni sie wtedy kąty sprawdzania kierunku.

Odnośnik do komentarza
Udostępnij na innych stronach

Wielkie dzięki, tylko nie umiem za bardzo naprawić tego wchodzenia na chama w ścianę. Niby mnożę razy 1.05, ale postać może wejść przez róg ściany do środka. Jak zrobić, że gdy np. jest w rogu to się po prostu zatrzymuje? (x=xprevious itd.)

 

Ps. Viewa nie ma w roomie, bo usunąłem kontrolera z przykładu i ogóle wszystko wyciąłem :D

Odnośnik do komentarza
Udostępnij na innych stronach

Temat chyba nie skończony... w każdym razie nie dla mnie :D

 

Przebudowałem trochę kod, teraz działa na innej zasadzie, ale działa prawie idealnie, sprawdź:

Przebudowana wersja

 

Stara wersja niestety nie pozwalała na naprawę tych przeskoków. Może lepiej, teraz masz lepszy kod :) . Koniecznie przeczytaj komentarze, jak twoja gra wygląda inaczej.

Odnośnik do komentarza
Udostępnij na innych stronach

Wielkie dzięki!

Brak mi słów, wszystko działa perfekcyjnie.

 

To się do przykładów nadaje, brawo. Jeśli gra powstanie to oczywiście masz creditsy (choć nie wiem czy to nie wstyd mieć credisty w takiej grze) :D

Trochę obawiam się tego while, ale jakby co to zmienię na if i jakoś pokombinuję.

Wielkie dzięki

Odnośnik do komentarza
Udostępnij na innych stronach

Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...