Skocz do zawartości

Rekomendowane odpowiedzi

Opublikowano

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

Opublikowano

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

}

Opublikowano

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.

Opublikowano

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?

Opublikowano

Pokombinowałem i choć nie jestem w pełni zadowolony z efektu, to na razie działa. Używając samej pętli while miałem freeze gry, więc zrobiłem for na 180 razy i dodaje po 2 direction.

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