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.