Skocz do zawartości
  • 0
Adriann

Miejsce kolizji

Pytanie

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ź;)
Bez_tytu_u44773.png
 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

2 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

  • 1

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.

 

 

  • Super (+1) 1

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 1

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

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

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

Zaloguj się tutaj

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników, przeglądających tę stronę.

×