Skocz do zawartości

Zmiana image_angle, a kolizje


Sutikku

Rekomendowane odpowiedzi

Nigdy do gier nie dodawałem pojazdów, ale nadszedł taki moment i cóż, jest problem.

Do jeżdżenia korzystam z direction, speed i tam image_angle=direction.

Jakąś tam prostą kolizję mam, ale problem się zaczyna kiedy przy ścianach skręcam pojazdem, nie poruszając się. Tył bądź przód pojazdu wchodzi w ścianę, a jedyną deską ratunku wtedy jest kręcenie w lewo, w prawo, aż w końcu maska pojazdu wyjdzie z bloczków. Nie mam nawet za bardzo pojęcia jak się za to zabrać.

Odnośnik do komentarza
Udostępnij na innych stronach

Rozwiązanie tego problemu jest proste, ale zaraz natrafisz na inne.

 

Ogółem są 2 szkoły rozwiązywania kolizji.

Pierwsza mówi o tym aby pierw sprawdzać czy doszło podczas ruchu dojdzie do kolizji i wtedy zabraniać ruchu.

Druga mówi o tym aby korygować błędy powstałe podczas ruchu.

Czasami uda się połączyć oba sposoby.

 

To dobrze sprawdzi się drugi. Musisz znać aktualną i przyszłą pozycję. Najnormalniej dokonujesz rotacji jak teraz ale zaraz potem robisz warunek który sprawdza czy był ten ruch ok, i jak nie to cofasz akcję.

GML (Obrt w lewo)
direction-=1

if(!place_free(x,y))

{

direction+=1

}

Odnośnik do komentarza
Udostępnij na innych stronach

Nie mam pojęcia co się dzieje, chyba gdzieś jest jakiś kruczek w kodzie którego nie widzę, ale przy takim czymś:

GML
if(keyboard_check(ord("A")))

{

if!(speed==0)

direction+=1;

if!(place_free(x, y))

direction-=1;

}

if(keyboard_check(ord("D")))

{

if!(speed==0)

direction-=1;

if!(place_free(x, y))

direction+=1;

}

Pojazd czasem wejdzie w ścianę, a wtedy rozpoczyna się magia. Zaczyna się sam kręcić, aż wyjdzie z tego bloczka.

edit:

Zgubiłem gdzieś klamrę, ale już naprawiłem. Ale pojazd nadal wchodzi czasem w bloczki.

Odnośnik do komentarza
Udostępnij na innych stronach

No to musisz zdiagnozować kiedy to się dzieje. bo może musisz nie tylko odjąć direction ale także speed?

 

Edit:

Moje nie dopatrzenie. W tym wypadku wszystko było ok. Wciąż masz ten sam problem, ale jakby ktoś szukał innego rozwiązania:

GML
while(!place_free(x, y))

{

direction+=1;

}

 

Dodatkowo, można robić interpolację liniową. Dzięki temu będziesz mieć dokładniejsze kolizje. Bo co w przypadkach gdy obrót o 1 to za dużo, ale możesz śmiało się obrócić o 0.25?

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