Skocz do zawartości

Płynny odbicie


Muchaszewski

Rekomendowane odpowiedzi

Ciachałem zrobić obracanie się obiektu po kolizji z innym obiektem który również się obraca. Ale coś lengthdir mi nie działa poprawnie więc nie wiem co robić. Mam taki NIEDZIAŁAJĄCY kod:

GML
if collision_rectangle(lengthdir_x(x,direction),lengthdir_y(y,direction),lengthdir_x(x+32,direction),lengthdir_y(y+32,direction),oBackParent,1,1)

{direction += 1}

if collision_rectangle(lengthdir_x(x,direction),lengthdir_y(y,direction),lengthdir_x(x-32,direction),lengthdir_y(y-32,direction),oBackParent,1,1)

{direction += 1}

if collision_rectangle(lengthdir_x(x,direction),lengthdir_y(y,direction),lengthdir_x(x-32,direction),lengthdir_y(y+32,direction),oBackParent,1,1)

{direction -= 1}

if collision_rectangle(lengthdir_x(x,direction),lengthdir_y(y,direction),lengthdir_x(x+32,direction),lengthdir_y(y-32,direction),oBackParent,1,1)

{direction -= 1}

Według mnie wszystko jest dobrze. Ale draw mi pokazuje że środek tego obiektu x i y są w punkcie (0,0). Żeby nie było nieporozumień w create dodałem:

GML
x = 496

y = 240

 

Czyli wszystko ok. A jednak nie. Proszę o pomoc.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Płynny odbicie na suchego przestwór oceanu.

 

Wiesz, że pierwszy parametr w leghtdir oznacza promień koła z którego liczysz tą pozycję x, a direction kąt pod jakim znajduje się punkt na tym kole?

Z tego kodu wynika, ze sprawdzasz czy następuje kolizja w prostokącie, którego końcami są dwa punkty oddalone o 496px i 240px od gracza pod pewnym kątem, oraz szerokie i wysokie jak odległość pewnych punktów o 496+-32px i 240+-32px pod pewnym kątem względem niego.

 

Całkiem spory obszar, wszystkie 4 warunki są zatem spełniane, a te prostokąty się na siebie nakładają gdzieś w 95%.

 

Najpierw sprawdź czym jest lenghtdir, a potem dopiero go używaj.

 

Zobrazuję to tak: masz zegarek i wskazówkę. Wskazówka ma długość 50cm, i wskazuje godzinę 12 (czyli kąt 90 w GM). Pozycja X grota wskazówki (czyli tej strzałki na końcu), to jest lenghtdir_x(50,90), a pozycja Y to lenghtdir_y(50,90).

 

Skoro sprawdzasz pozycję w prostokącie, to po co lenghtdir? Nie wystarczy np. x-32 ?

Odnośnik do komentarza
Udostępnij na innych stronach

Już używałem lengthdir i działał tak jak chciałem. Zapomniałem że pozycje x i y uzna za promień koła od (0,0) tylko za środek obiektu.

W takim razie wiem gdzie popełniłem błąd. Mój kod powinien chyba wyglądać tak.

GML
if collision_rectangle(x+lengthdir_x(0,direction),y+lengthdir_y(0,direction),x+lengthdir_x(32,direction),y+lengthdir_y(32,direction),oBackParent,1,1)

 

Dlatego go używam bo ten mój prostokąt ma się obracać, a pozycje x i y nie uwzględniają obrotu.

 

Moje wypociny są nadal źle ale to już kwestia czasu :P

 

Dzięki

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Prostokąt zawsze zostanie prostokątem, tzn. linie będą szły dokładnie pionowo i poziomo, w tej funkcji nie da się tego prostokąta obrócić.

To co Ty próbujesz zrobić (ale nieudolnie), to poruszanie jednego z rogów tego prostokąta po okręgu - nie mniej on sam się nie obraca, a zmienia się tylko jego pozycja:

 

prostokat.png

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