Jak na efekty - "měniče" podruhé
Posted: October 12, 2013, 11:26 am
Zdravím, rád bych se zas jednou podělil o menší výtvor.
Sice v GM už téměř vůbec nic nedělám, ale občas když potřebuji honem rychle něco vyzkoušet, používám GM, jelikož vykreslování v něm je daleko jednodušší, než třeba v Javě, C#... Experimentoval jsem s bézierovou křivkou a přechody, jak jsou v CSS3 (viz. http://cubic-bezier.com/).
No a protože to je jako dělané pro měniče, co jsem zde kdysi posílal (ačkoliv ohlas měly asi u 2 lidí... viz. http://www.forum.velkejchytrak.cz/viewt ... =16&t=1504), tak jsem to s nimi propojil. Vlastně udělal úplně novou, lepší verzi. Navíc si myslím, že tato verze by mohla zaujmout mnohem více lidí. Na první verzi někteří brblali, jak je to k ničemu (zřejmě nepochopili použití a praktičnost toho celého), tady už to ale nejsou obyčejné lineární čáry. Tady to jsou všelijaké křivky a opravdu dají efektům další rozměr.
Popis funkcí:Jako u staré verze, stačí zavolat na začátku hry (ale pak už nevolat znova!). Nebere žádné argumenty, nevrací nic. Prostě jen připraví systém.
Narozdíl od předchozí verze, changery již neumí jít od - do. Nyní se changer pohybuje pouze mezi čísly 0 a 1.
• time - čas, přes který changer plynule změní hodnotu. Pokud není čas zadán, changer dostane hodnotu 0 a nemění se.
• changer - ID changeru. Pokud je tento argument zadán, funkce přenastaví data zadanému changeru. Pokud ID není zadáno, funkce vytvoří nový a vrátí jeho ID (v předchozí verzi to byly 2 sólo funkce changer_add a changer_reset).
• reverse - Jak už jsem říkal, changer se pohybuje od nuly do jedničky. Pokud je reverse = true, pohybuje se naopak od jedničky k nule.
Tato funkce vrátí hodnotu changeru. Pokud není argument easing zadán, hodnota changeru zůstane nezměněná a je vrácená lineární forma. Pokud easing zadán je, hodnota changeru je před vrácením prohnána touto funkcí, což má za výsledek slibované zakřivení průběhu.
Vrátí zda-li je changer ještě animován, nebo zda-li již skončil (true / false).
Použití
Za předpokladu, že již někde ve hře byla zavolána funkce changer_init a changery jsou tedy připraveny k použití, můžeme vytvořit třeba takovýto objekt:
Create event:
Draw event:
Easing:
Funkce pro easing může být jakákoliv. Changer ji zavolá, do argument0 ji dá lineární hodnotu a očekává, že funkce vrátí pozměněnou, zakřivenou verzi. Takže to může být třeba takto:Pro jednoduchou parabolu (jako v matice: y = x^2).
Ale protože takto psát křivky by bylo dost otravné, vytvořil jsem ještě funkci bezier():To je funkce, která vrátí hodnotu přechodu pro kubickou bézierovu křivku určenou 2 body [mx1; my1] a [mx2; my2] (ve skutečnosti jsou tyto body 4, ale 2 z nich jsou konstantní a pro tyto účely s nimi nelze pohybovat). Funguje to naprosto stejně jako dříve zmíněné CSS křivky. Díky této funkci může pak jednoduchá easing funkce vypadat takto:Křivky si můžete nakreslit zde: http://cubic-bezier.com/ a poté stačí jen do této GM funkce zadat ony 4 hodnoty, co na té stránce získáte. První argument zůstane vždy stejný a funkce bezier již udělá všechnu magii.
Enjoy

No a protože to je jako dělané pro měniče, co jsem zde kdysi posílal (ačkoliv ohlas měly asi u 2 lidí... viz. http://www.forum.velkejchytrak.cz/viewt ... =16&t=1504), tak jsem to s nimi propojil. Vlastně udělal úplně novou, lepší verzi. Navíc si myslím, že tato verze by mohla zaujmout mnohem více lidí. Na první verzi někteří brblali, jak je to k ničemu (zřejmě nepochopili použití a praktičnost toho celého), tady už to ale nejsou obyčejné lineární čáry. Tady to jsou všelijaké křivky a opravdu dají efektům další rozměr.
Popis funkcí:
Code: Select all
changer_init()
Code: Select all
changer_start([time], [changer], [reverse]);
• time - čas, přes který changer plynule změní hodnotu. Pokud není čas zadán, changer dostane hodnotu 0 a nemění se.
• changer - ID changeru. Pokud je tento argument zadán, funkce přenastaví data zadanému changeru. Pokud ID není zadáno, funkce vytvoří nový a vrátí jeho ID (v předchozí verzi to byly 2 sólo funkce changer_add a changer_reset).
• reverse - Jak už jsem říkal, changer se pohybuje od nuly do jedničky. Pokud je reverse = true, pohybuje se naopak od jedničky k nule.
Code: Select all
changer_get(changer_id, [easing]);
Code: Select all
changer_ended(changer_id);
Použití
Za předpokladu, že již někde ve hře byla zavolána funkce changer_init a changery jsou tedy připraveny k použití, můžeme vytvořit třeba takovýto objekt:

Code: Select all
fx = changer_start(); // Vytvori changer s hodnotou 0
val = 0;

Code: Select all
if (changer_ended(fx))
{
// changer bude stridave menit hodnotu mezi 0 - 1 po jedne vterine
changer_start(1000, fx, val);
val = !val;
}
var a;
a = changer_get(fx, ease_in_out);
draw_circle(x + 200 * a, y, 15, 0);
Funkce pro easing může být jakákoliv. Changer ji zavolá, do argument0 ji dá lineární hodnotu a očekává, že funkce vrátí pozměněnou, zakřivenou verzi. Takže to může být třeba takto:
Code: Select all
return argument0 * argument0;
Ale protože takto psát křivky by bylo dost otravné, vytvořil jsem ještě funkci bezier():
Code: Select all
// bezier(t, mx1, my1, mx2, my2);
Code: Select all
// Klasicky ease-in-out
return bezier(argument0, .42, 0, .58, 1);
Enjoy
