Přidej si svou IT školu do profilu a najdi spolužáky zde na síti :)

Collision triangle - GameMaker

Ostatní jazyky GameMaker Ostatní Collision triangle - GameMaker

ONEbit hosting Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

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.


 

 

Článek pro vás napsal sutr90
Avatar
Jak se ti líbí článek?
1 hlasů
Miniatura
Všechny články v sekci
GameMaker - Ostatní
Aktivity (1)

 

 

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

Avatar
Theodor Johnson
Redaktor
Avatar
Theodor Johnson:30.4.2012 8:46

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:30.4.2012 8:51

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:30.4.2012 9:18

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:30.4.2012 9:53

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:30.4.2012 12:56

Ří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:30.4.2012 20:41

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:30.4.2012 20:47

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:30.4.2012 21:09

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á na Theodor Johnson
David Čápka:30.4.2012 22:27

Jo, určitě dal :)

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:26.7.2012 20:28

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