Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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_colli­sion.

//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.


 

Všechny články v sekci
GameMaker - Ostatní
Článek pro vás napsal sutr90
Avatar
Uživatelské hodnocení:
1 hlasů
Aktivity