Collision triangle - GameMaker

Ostatní jazyky GameMaker Ostatní 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.


 

  Aktivity (1)

Článek pro vás napsal sutr90
Avatar

Jak se ti líbí článek?
Celkem (1 hlasů) :
333 33


 


Miniatura
Všechny články v sekci
GameMaker - Ostatní

 

 

Komentáře
Zobrazit starší komentáře (2)

Avatar
Theodor Johnson
Redaktor
Avatar
Theodor Johnson:

takže pokud bych přidal více argumentů šla by kolize nastavit i jako mnohoůhelník?

Odpovědět 30.4.2012 8:46
Přecházím na "Cross-Platform Development"
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Theodor Johnson
David Čápka:

Neznám ten matematický algoritmus, ale myslím, že to tak jednoduché nebude.

Odpovědět  +1 30.4.2012 8:51
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Kit:

Bylo by to mnohem jednodušší, pokud by GM podporoval práci s komplexními čísly. Uvedený algoritmus je vlastně jen přepsán z komplexních do reálných čísel.

Odpovědět 30.4.2012 9:18
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Theodor Johnson
Redaktor
Avatar
Odpovídá na David Čápka
Theodor Johnson:

Potřeboval bych poradit, pracoval jsem na tý kolizi mnohouhelníku, vypadá to že funguje ale kolize se s každým snímkem zapíná a vypíná a někdy zůstává zapnutá i když už je daný objekt vzdálen i desítky pixelů. Ale výkon CPU je furt 100%, tak nevim.Jestli byste se mi na to nemohl někdo podívat? http://www.uloz.to/…k-kolize-gmk

Odpovědět 30.4.2012 9:53
Přecházím na "Cross-Platform Development"
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Theodor Johnson
David Čápka:

Říkám, že to nebude tak jednoduché, jestli tě to zajímá, koukni třeba sem: http://en.wikipedia.org/…t_in_polygon

Odpovědět 30.4.2012 12:56
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Theodor Johnson
Redaktor
Avatar
Odpovídá na David Čápka
Theodor Johnson:

No tak dobře, myslím že jsem to pochopil, ale mám ještě jednu poslední otázku k tomuto tématu.
Dalo by se to využít na objekty bez spritu, které využívají pouze funkce Draw?

Odpovědět 30.4.2012 20:41
Přecházím na "Cross-Platform Development"
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Theodor Johnson
David Čápka:

Teď nevím, jak to myslíš.

Odpovědět 30.4.2012 20:47
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Theodor Johnson
Redaktor
Avatar
Odpovídá na David Čápka
Theodor Johnson:

Pokud se u objektu nenastaví sprite tak má v roomu jen otazník, tak jestli by se to takhle dalo využít, protože když dam takhle objekt beze spritu a vykresluju ho způsobem draw, třeba poskládáním z čar, tak nemá kolizi, tak jestli by se tam dal využít tenhle způsob nastavení kolize u trojuhelníku?

Odpovědět 30.4.2012 21:09
Přecházím na "Cross-Platform Development"
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovědět 30.4.2012 22:27
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na Theodor Johnson
Zdeněk Pavlátka:

Samozřejmě. Je to jako náhrada kolizní masky.

Odpovědět 26.7.2012 20:28
Kolik jazyků umíš, tolikrát jsi programátor.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 12. Zobrazit vše