Vianoce v ITnetwork sú tu! Dobí si teraz kredity a získaj až 80 % extra kreditov na e-learningové kurzy ZADARMO. Zisti viac.
Hľadáme nové posily do ITnetwork tímu. Pozri sa na voľné pozície a pridaj sa k najagilnejšej firme na trhu - Viac informácií.

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_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š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.


 

Všetky články v sekcii
Game maker - Ostatné
Článok pre vás napísal sutr90
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Aktivity