Collision triangle - GameMaker
Potřebovali jste někdy kotrolovat kolize u trojúhelníků? GM nabízí pouze elipsu/kruh a čtverec. S mým řešením dosáhnete vynikajících výsledků i u trojúhelníků.
Takže nejprve co budeme potřebovat. Nejvhodnější bude připravit si následující kód do skriptu a ten poté volat v průběhu hry. Bohužel kód neumožňuje kontrolovat kolizi s kompletním skriptem, ale pouze s bodem. Začneme vytvořením nového skriptu pojmenujeme ho scr_tri_collision.
//deklarace promennych var x1, x2, x3, y1, y2, y3, xp, yp, v0x, v0y, v1x, v1y, v2x, v2y, dot00, dot01, dot02, dot11, dot12, invDenom, u, v; //body trojuhelniku x1 = argument0; y1 = argument1; x2 = argument2; y2 = argument3; x3 = argument4; y3 = argument5; //bod pro kontrolu xp = argument6; yp = argument7;
Všimněte si použití klíčového slova var, to zajistí, že proměnné budou pouze lokální v rámci skriptu a poté bude uvolněna paměť, kterou zabírají.
Dále musíme převést jednotlivé body na vektory, které reprezentují strany trojúhelníku a také vektor spojující vrchol úhlu a kolizní bod:
//vektory
v0x=x3-x1;
v0y=y3-y1;
v1x=x2-x1;
v1y=y2-y1;
v2x=xp-x1;
v2y=yp-y1;
Dále musíme spočítat skalární součiny a barycentrické souřadnice:
//skalarni souciny dot00 = v0x*v0x+v0y*v0y dot01 = v0x*v1x+v0y*v1y dot02 = v0x*v2x+v0y*v2y dot11 = v1x*v1x+v1y*v1y dot12 = v1x*v2x+v1y*v2y //barycentricky souradnice invDenom = 1 / (dot00 * dot11 - dot01 * dot01) u = (dot11 * dot02 - dot01 * dot12) * invDenom v = (dot00 * dot12 - dot01 * dot02) * invDenom
A nakonec ověříme pozici bodu:
if((u > 0) && (v > 0) && (u + v < 1)) return true;//bod lezi uvnitr else return false//bod lezi venku
Pro použití skriptu použijte následující kód kdekoliv bude třeba:
if(scr_tri_collision(0,0,10,15,36,35,mouse_x, mouse_y)){ room_caption = "uvnitř"; } else { room_caption = "venku";
Na závěr bych chtěl podotknout, že se nejedná o teorii z mojí hlavy, takže bohužel nemůžu vysvětlit princip fungování kódu. Pravdou je, že kód je funkční a to tak jak je.
Hodně štěstí při práci s GM.