Adriann Opublikowano 29 Kwietnia 2018 Udostępnij Opublikowano 29 Kwietnia 2018 Witam serdecznie Czy znacie może jakiś prosty sposób na wykrycie punktu, ewentualnie kierunku w którym dochodzi do kolizji dwóch obiektów?(bez rysowania linii) Z góry dziękuję za odpowiedź;) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
I am vader Opublikowano 29 Kwietnia 2018 Udostępnij Opublikowano 29 Kwietnia 2018 Edit: Dopiero przeczytalem że nie miało być z lini... no trudno na darmo się rozpisałem. I tak zostawię tutaj dla potomnych. Edit2: Chyba że konkretnie chodzi Ci o nie RYSOWANIE lini oraz nie używanie wbudowanych funkcji kolizyjnych, wtedy poniższe jest dla Ciebie. Edit3: Dobra koniec tych editów Nie wiem czy licencja którą wybrałem jest dobra, chodzi o to żeby było za darmo do użycie również komercyjnego bez potrzeby podawania autora w creditsach czy jakichkolwiek plikach. Edit4: Walić napisałem własną licencję. Daj Lajka bo się napracowałem kiedyś Sam tego potrzebowałem do rayguna do mojego projektu, więc zaadoptowałem takie coś, licencja kodu powiedzmy GNU General Public License, więc rób co chcesz z tym. ///lines_intersect(ax1,ay1,ax2,ay2,bx1,by1,bx2,by2) // 90% of code adapted from C script by Gavin @ stackoverflow, //uses algorithm from "Tricks of the Windows Game Programming Gurus" //by Andre LaMothe // License: Free to view, modify and redistribute, both commercially // and for free without need to acknowledge original creator, as long // as original creator is credited within this code. It is therefore // not permitted to remove this comment attributing original creator. // This script is provided as-is with no warranty. Neither creator, // nor any person modifying this script takes any responsibility for // any damage caused by this script. // Original version by Przemek "LeD" Liedtke var ax1=argument0,ay1=argument1,ax2=argument2,ay2=argument3, bx1=argument4,by1=argument5,bx2=argument6,by2=argument7; var _ret; //Returned array _ret[0] = 0;//1 for found _ret[1] = 0;//x (if [0]=1) _ret[2] = 0;//y (if [0]=1) var s1_x,s1_y,s2_x,s2_y; s1_x = ax2 - ax1; s1_y = ay2 - ay1; s2_x = bx2 - bx1; s2_y = by2 - by1; var s,t,sp; sp = (-s2_x * s1_y) + (s1_x * s2_y); if sp=0 return _ret; s = ((-s1_y * (ax1 - bx1)) + (s1_x * (ay1 - by1))) / sp; t = (( s2_x * (ay1 - by1)) - (s2_y * (ax1 - bx1))) / sp; if (s >= 0 && s <= 1 && t >= 0 && t <= 1){ // Collision detected _ret[0] = 1; _ret[1] = ax1 + (t * s1_x); _ret[2] = ay1 + (t * s1_y); } return _ret; Zwraca: Tablicę jednowymiarową z trzeba pozycjami: [0]: Czy znalazło punkt styczności [1]: X [2]: Y Smacznego. A i zastosowanie: Użyc lines_intersect na każdym boku, np. tak: //_col to id obiektu ktory sprawdzamy. x1 = _col.bbox_left-1; x2 = _col.bbox_right+1; y1 = _col.bbox_top-1; y2 = _col.bbox_bottom+1; w1 = lines_intersect(x,y,xx,yy,x1,y1,x1,y2); //Left w2 = lines_intersect(x,y,xx,yy,x2,y1,x2,y2);; //Right w3 = lines_intersect(x,y,xx,yy,x1,y2,x2,y2); //Bottom w4 = lines_intersect(x,y,xx,yy,x1,y1,x2,y1); //Top Musisz każdy bok powiększyć o 1 pixel bo inaczej na IDEALNEJ styczności z rogiem nie wykryje go. Nie do końca rozumiem czemu. Uzjel 1 Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Administratorzy gnysek Opublikowano 30 Kwietnia 2018 Administratorzy Udostępnij Opublikowano 30 Kwietnia 2018 Kierunek nie zależy tutaj od origina sprita? Bo inaczej wygląda kierunek jak masz origin kwadrata na 0/0, a inaczej jak na 50%/50%. Poniższy kod zadziała tylko dla prostokątnych masek i tylko z ustawieniem manual/automatic. Pixel perfekt i okrągłe maski na to nie zadziałają. var xcol = x - sprite_xoffset(sprite_index), ycol = y - sprite_yoffset(sprite_index); if (other.x < x) { xcol += bbox_left; } else { xcol += bbox_right; } if (other.y < y) { ycol += bbox_top; } else { ycol += bbox_bottom; } /// GMS 2.0, alternatywna wersja: /// var xcol = x - sprite_xoffset(sprite_index), ycol = y - sprite_yoffset(sprite_index); /// xcol += (other.x < x) bbox_left : bbox_right; /// ycol += (other.y < y) bbox_top : bbox_bottom; // kolizja wystepuje w punkcie xcol, ycol, kod wstawiasz do kwadrata ze swojego rysunku Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
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ę