Collision triangle - game maker
Potrebovali ste niekedy Kontrolovať kolízie u trojuholníkov? GM ponúka len elipsu / kruh a štvorec. S mojím riešením dosiahnete vynikajúce výsledky aj u trojuholníkov.
Takže najprv čo budeme potrebovať. Najvhodnejšie bude pripraviť si nasledujúci kód do skriptu a ten potom volať v priebehu hry. Bohužiaľ kód neumožňuje kontrolovať kolízii s kompletným skriptom, ale iba s bodom. Začneme vytvorením nového skriptu pomenujeme 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šimnite si použitie kľúčového slova var, to zabezpečí, že premenné budú iba lokálne v rámci skriptu a potom bude uvoľnená pamäť, ktorú zaberajú.
Ďalej musíme previesť jednotlivé body na vektory, ktoré reprezentujú strany trojuholníka a tiež vektor spájajúcej vrchol uhla a kolízne bod:
//vektory
v0x=x3-x1;
v0y=y3-y1;
v1x=x2-x1;
v1y=y2-y1;
v2x=xp-x1;
v2y=yp-y1;
Ďalej musíme spočítať skalárne súčiny a barycentrický súradnice:
//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 nakoniec overíme pozíciu bodu:
if((u > 0) && (v > 0) && (u + v < 1)) return true;//bod lezi uvnitr else return false//bod lezi venku
Na použitie skriptu použite nasledujúci kód kdekoľvek bude treba:
if(scr_tri_collision(0,0,10,15,36,35,mouse_x, mouse_y)){ room_caption = "uvnitř"; } else { room_caption = "venku";
Na záver by som chcel podotknúť, že sa nejedná o teórii z mojej hlavy, takže bohužiaľ nemôžem vysvetliť princíp fungovania kódu. Pravdou je, že kód je funkčná a to tak ako je.
Veľa šťastia pri práci s GM.