Skocz do zawartości

Sprawdzanie kolizji 15 pixeli przed objektem


Anubarak

Rekomendowane odpowiedzi

Mam obj_player który wygląda tak (oczywiście ta różowa linia to nie jest wygląd rakiety):nowyobrazmapabitowazki.png.

No i chce żeby kolizje z obiektami sprawdzała funkcja colision_line (linia ma być rozciągnięta 15 pixeli przed obiektem tak jak wskazuje ta różowa linia). No i bym mógł sobie sam obliczyć współrzędne x1,x2,y1,y1 pomiędzy którymi ma być rozciągnięta colision_line ale w tym problem że ta rakieta to jeden z co najmniej 20 modeli dostępnych. No więc pytanie brzmi: czy można jakoś automatycznie policzyć kierunek oraz długość lenghdirow w tej sytuacji (uwzględniając to że te 20 modeli rakiety jest różnej wielkości oraz rakieta może się poruszac w 36 (360/10) kierunkach?

Odnośnik do komentarza
Udostępnij na innych stronach

linia ma być rozciągnięta 15 pixeli przed obiektem

GML
xx=lengthdir_x(x+15+image_width/2,direction);

yy=lengthdir_y(y+15+image_width/2,direction);

xx1=lengthdir_x(xx+image_height/2,direction+90);

yy1=lengthdir_y(yy+image_height/2,direction+90);

xx2=lengthdir_x(xx+image_height/2,direction-90);

yy2=lengthdir_y(yy+image_height/2,direction-90);

if(collision_line(xx1,yy1,xx2,yy2,costam))

{

//kod

}

coś takiego, pisałem z pamięci, ale powinno działać. Origin sprite'a musi być na środku.

Odnośnik do komentarza
Udostępnij na innych stronach

ZeroXbot twój kod wydaje się dobry ale żeby zobaczyć gdzie będzie rysować linię zmodyfikowałem trochę kod i pozmieniałem niektóre rzeczy:

GML
xx=lengthdir_x(15+sprite_width,direction)

yy=lengthdir_y(15+sprite_width/2,direction)

xx1=lengthdir_x(xx+sprite_height/2,direction+90)

yy1=lengthdir_y(yy+sprite_height/2,direction+90)

xx2=lengthdir_x(xx+sprite_height/2,direction-90)

yy2=lengthdir_y(yy+sprite_height/2,direction-90)

draw_line(x+xx1,y+yy1,x+xx2,y+yy2)

Ale nie wiem dlaczego linia jest rysowana w złym miejscu i zawsze przechodzi przez środek obiektu.

Odnośnik do komentarza
Udostępnij na innych stronach

ZeroXbot twój kod wydaje się dobry ale żeby zobaczyć gdzie będzie rysować linię zmodyfikowałem trochę kod i pozmieniałem niektóre rzeczy:

GML
xx=lengthdir_x(15+sprite_width,direction)

yy=lengthdir_y(15+sprite_width/2,direction)

xx1=lengthdir_x(xx+sprite_height/2,direction+90)

yy1=lengthdir_y(yy+sprite_height/2,direction+90)

xx2=lengthdir_x(xx+sprite_height/2,direction-90)

yy2=lengthdir_y(yy+sprite_height/2,direction-90)

draw_line(x+xx1,y+yy1,x+xx2,y+yy2)

Ale nie wiem dlaczego linia jest rysowana w złym miejscu i zawsze przechodzi przez środek obiektu.

O kurde, źle napisałem tamten kod :P Współrzędne x,y,xx,yy powinny byc dodawane oddzielnie. Teraz spróbuj.

GML
xx=x+lengthdir_x(15+sprite_width,direction)

yy=y+lengthdir_y(15+sprite_width/2,direction)

xx1=xx+lengthdir_x(sprite_height/2,direction+90)

yy1=yy+lengthdir_y(sprite_height/2,direction+90)

xx2=xx+lengthdir_x(sprite_height/2,direction-90)

yy2=yy+lengthdir_y(sprite_height/2,direction-90)

draw_line(xx1,yy1,xx2,yy2)

Odnośnik do komentarza
Udostępnij na innych stronach

Dzięki ZeroXbot problem rozwiązany tyle że narodził się nowy i żeby nie robić nowego tematu napisze go tu. No to tak mam taki inny model rakiety (brzydki ale się poprawi):beztytuuice.png no i jak widać ma ona odgałęzienie które jest boczną kabiną no i chcę żeby ta czerwona linia była tylko przed rakietą a nie przed i trochę w prawo jak to widać na obrazku. Przestawianie orgina tu nie wchodzi w grę ponieważ muszę mieć jakiś punkt wokół którego będę się obracać (mówiłem ruch w 36 kierunkach).

Odnośnik do komentarza
Udostępnij na innych stronach

Czyli jeden kod ma dopasowywać się do każdej rakiety?

Hmm... każda rakieta jest oddzielnym obiektem? Skoro tak to możesz zrobić w niej zmienną (albo nawet dwie) z "odchyleniem" długości linii. Wyglądałoby to tak:

GML
//w create zrobisles zmienna modyfikator[0]=0 i modyfikator[1]=10np.

xx=x+lengthdir_x(15+sprite_width,direction)

yy=y+lengthdir_y(15+sprite_width/2,direction)

xx1=xx+lengthdir_x(sprite_height/2-modyfikator[0],direction+90)

yy1=yy+lengthdir_y(sprite_height/2-modyfikator[0],direction+90)

xx2=xx+lengthdir_x(sprite_height/2-modyfikator[1],direction-90)

yy2=yy+lengthdir_y(sprite_height/2-modyfikator[1],direction-90)

draw_line(xx1,yy1,xx2,yy2)

Może to pomoze.

Odnośnik do komentarza
Udostępnij na innych stronach

Hmm... każda rakieta jest oddzielnym obiektem? Skoro tak to możesz zrobić w niej zmienną (albo nawet dwie) z "odchyleniem" długości linii.

Niestety (albo stety) obiekt jest jeden i w zależności jaki model się wybierze tak będzie wyglądać. Może twój kod by się sprawdził ale niema jakiegoś innego sposobu bez zmiennych?

 

EDIT: Może by coś zrobić jakoś tak żeby znalazło sprite_width/2 i sprite_height/2 tam gdzie znajduje się obiekt a nie w lewy górnym rogu pokoju bo ja nie mam pomysłu jak to zrobić ;(

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