Skocz do zawartości

Rekomendowane odpowiedzi

Opublikowano

Trochę w to nie wierzę, ale muszę napisać temat w tym dziale.

 

Potrzebuję wiedzieć co jest wewnątrz funkcji move_bounce_solid(). Starałem się przeszukać internet, ale bez większego sukcesu.

 

Zazwyczaj używałem czegoś takiego, ale tym razem się nie sprawdza.

GML
if(abs(vspeed)<abs(hspeed))

{

hspeed*=-1

}

else

{

vspeed*=-1

}

Opublikowano

A co to nie działa tak jak napisałeś? Mi się zawsze wydawało że dokładnie tak.

 

 

Chyba że coś takiego:

GML
if ( !place_free(x+hspeed, y) ) hspeed *= -1;

if ( !place_free(x, y+vspeed) ) vspeed *= -1;

albo z while

Opublikowano

Cóż, ten kod na pewno nie pokrywa zachowania w kątach podzielnych przez 45 i niepodzielnych przez 90, gdzie abs(hspeed) = abs(vspeed).

 

Pod kątem 45 stopni zderzenie z obiektem nad obiektem odbijającym zmniejszy kąt o 90 stopni, podczas gdy zderzenie następuje z obiektem po prawej kąt zwiększa się o 90 stopni.

Innymi słowy w pierwszym przykładzie zmienia sie vspeed, a w drugim przykladzie zmienia sie hspeed, chociaz w obu przypadkach jest ten sam kąt (45) i te same hspeed,vspeed.

 

To co podales moze sie przydac na wszystkie wartosci rozne od 45,135, 225 i 315. Dla tych 4 kątów spróbuj ręcznie napisać zachowanie (niby na wpół z dupą ale powinno działać).

Opublikowano

Wydaje sie dzialac w stepie...

 

GML
var o = instance_place(x+(hspeed*2),y+(vspeed*2),SolidParent);

if o

{

if y > o.y+o.sprite_height

|| y+sprite_height < o.y // Vertical change

{

vspeed*=-1;

}

else

{

hspeed*=-1;

}

}

Opublikowano

Okazuje się że najbliższym rozwiązaniem jest:

GML
if(!place_free(x+hspeed,y))

{

hspeed*=-1

}

if(!place_free(x,y+vspeed))

{

vspeed*=-1

}

:huh: Doszedłem do tego po jakiś 16 godzinach dłubania.

 

Teraz zauważyłem że Huder podał to rozwiązanie. To tylko potwierdza te rozwiązanie.

Opublikowano

Ma i jest to argument tej funkcji. Wymaga on oczywiście aby obydwa sprite miały też PCC.

 

Ale mi chodzi o najprostsze rozwiązanie dotyczące AABB, bo zauważyłem że ta funkcja zachowywała się inaczej (lepiej) niż spodziewałem się. Dlatego drążę i próbuję zrozumieć.

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