Pravidla Ucet
Nepřihlášen

Článek

Menu

Kreslení trajektorie (GML)
Napsal: D-Sheep
Přidáno: 21.08. 2011

Jak vykreslit trajektorii pohybujícího se objektu ?

Trajektorie

V mém prvním článku bych vám chtěl popsat, jak se celkem elegantním způsobem dá kreslit trajektorie pohybujícího se objektu. Budu používat Game Maker Language (GML), protože s ikonkama to nejde, ty jsou pro začátečníky. Hlavní myšlenka je zapamatovat si cestu objektu a pak jí s odstupem času vykreslit. Uvedený příklad bude vykreslovat čáru za objektem po dobu 10 vteřin. Tak tedy:

Na začátku hry (Create event) musíme zprovoznit náš zapisovací systém - array (pole):

for (a = 1; a <= 10 * room_speed; a += 1)
{
  tx[a] = -100
  ty[a] = -100
}
tx[0] = x;
ty[0] = y;

Cyklus for nám na každé místo v poli napíše hodnotu -100, vysvětlení níže. A dva poslední příkazy nám zaznamenají aktuální pozici objektu.

Dále se podíváme do Step event. Toto je hlavní část systému, kde se každý krok hry zapisují nové pozice objektu.

for (a = 10 * room_speed; a > 0; a -= 1)
{
  tx[a] = tx[a-1];
  ty[a] = ty[a-1];
}
tx[0] = x;
ty[0] = y;

Cyklus for, který jede v opačném pořadí, než v Create event, zde předává hodnoty vždy o jedno místo v poli dál. Tím se zapisují do "paměti" a poslední dva příkazy opět zaznamenají aktuální pozici.

Tím bychom měli připravené hodnoty k vykreslení, podíváme se tedy na to, jak: (Draw event)

draw_set_color(c_lime);
for(a = 0; a < 10 * room_speed; a += 1)
{
  if (tx[a] != -100 and tx[a+1] != -100)
   draw_line_width(tx[a], ty[a], tx[a+1], ty[a+1], 3);
}

Příkaz draw_line_width nyní nakreslí 3 pixely tlustou zelenou čáru mezi každou zaznamenanou pozicí v proměnných tx a ty POKUD však hodnota není -100. V tom případě se v trajektorii nechá mezera. Proč ? Takto můžeme bez problémů obracet obrazovku, když objekt vyjede pryč z místnosti (move_wrap), nebo používat teleporty. Toto musíme udělat, protože cestou mezi teleporty/stranami obrazovky objekt vlastně neprošel, ale čára by se tam stejně zobrazila. Výsledkem je křivka, která znázorňuje cestu objektu za posledních 10 vteřin.

Vytvoření mezery

Pokud chcete, aby se z jakéhokoli důvodu udělala v trajektorii mezera (třeba při vyjetí ven z obrazovky), stačí v příslušné události napsat:

tx[0] = -100;

Ano, stačí pouze proměnná tx, protože tu jako jedinnou kontroluje kód v Draw event. Bohužel to nefunguje v událostech, které se vyhodnocují před událostí Step. Konkrétně události pro myš a klávesnici. Pro plnou funkčnost musíte Step event nahradit za Begin Step.


Klíčová slova: trajektorie cesta draha D-Sheep
 

Komentáře:

Napsal: D-Sheep
Přidáno: 01.01. 2012

Ano, samozřejmě že můžu použít další proměnnou, která by zaznamenávala jak dlouho se objekt pohybuje a array by se tak zkrátil na minimum, ale účinnější by to bylo spíše kdybychom chtěli vykreslovat trajektorii za delší dobu než je 10 vteřin. Ale co by opravdu pomohlo: místo Step eventu použít alarm, takhle má trajektorie 100% rozlišení, to znamená že se zaznamenává pokaždé, když se objekt pohne. Pomocí alarmu by bylo možné zapisovat pozici jen párkrát za vteřinu, čímž by se znatelně zvýšila rychlost hry.

Trvalý odkaz

Napsal: iwitrag
Přidáno: 06.12. 2011

Jednoduché a výstižné, ovšem dá se to udělat ještě malinko jednodušeji pomoci zavedení další proměnné, která bude zapisovat aktuální vykreslovanou část trajektorie a podle toho bude omezovat i cyklus for... tím je méně zatěžován počítač.

Trvalý odkaz

Napsal: NicharCZ
Přidáno: 22.08. 2011

Pěkný Dave, jdu to zkusit :)

Trvalý odkaz

Velkej Chytrák
Copyright (c) 2001-2010