Jak vykreslit trajektorii pohybujícího se objektu ?
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):
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.
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)
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.
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:
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.
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.
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č.