Na začiatok by som uviedol, prečo som chcel ten dokrok vložit do projektu. Ako som už povedal, pracujem s 3D postavami, ale toto isté by platilo aj pre spritové postavy.
V každej scéne mám povrch, na ktorom keď postava kráča, prehráva sa mi konktrétny, pridelený zvuk. Dĺžka kroku jednej postavy je v konverzii na pixely cca 90 px. Ak je ale vzdialenosť postavy od miesta, kam hráč klikov napríklad 130 px, znamená to, že postavá spraví jeden celý krok a niečo viac ako polovicu kroka. Toto je vo WME riešené (ako si už spomínal), prehrá sa anímácia dokroku, ale neprehrajú sa všetky snímky. Takže postava spraví krok, ale neprehrá sa zvuk, ktorý je pridelený pri kroku. Pri pohľade na to je to veľmi nepekný jav.
Dúfam, že to nie je moc komplikované, v praxi je to jasná vec;).
V podstate existujú dve riešenia (s ktorými som pracoval Ja):
1. Vypočítať dráhu dokroku a nastaviť ju postave
2. Vypočítať celkovú dráhu a spraviť iba celé kroky
Ad 1:)a:)Vzdialenosť dvoch bodov v rovine (postavy = bod A, mouse click = bod B), by sa dali jednoducho vypočítať pomocou Pytagorovej vety (analytická geometria). Vypočítaná prepona by sa prekonvertovala na číslo
int, a potom by sa delila dĺžkou kroku postavy. Nakoniec, nie je problém vypočítať zvyšnú dráhu (ktorá je menšia ako jeden celý krok defaultne nastavený animátorom). Túto dráhu by som nastavil ako dĺžku animácie celého kroku zo skriptu.
Týmto by som zabezpečil, že postava spraví celý krok, ktorého dĺžku nastavím runtime.
Pozn.: Tento systém nemám ešte overený, a nie som si istý, či by to fungovalo, pretože pri zmene dĺžky kroku by pravdepodobne došlo aj ku zmene počtu snímkov.
Tento problém so sebou prináša trocha viacej okolností, ktoré by sa museli doriešiť. Pretože však túto možnosť nepoužívam, nebudem ju ďalej rozoberať. Ak by mal niekto záujem rozobrať tie okolnosti, nech sa ozve v tomto vlákne.
b:)Ďalšia možnosť by bola spraviť si akési postavy, ktoré by mali odlišné dĺžky krokov (napr. 20, 40, 60, 80), a tieto potom spraviť ako dokrok. Samozrejme, musíme brať v úvahu to, že budú rozdiely v pixeloch, ale 10 pixelov je zanedbateľná dĺžka:).
Ad 2:)Pomocou funkcie vypočítam celkovú vzdialenosť, a túto predelím dĺžkou kroku. Zvyšnú dráhu budem ignorovať a jednoducho ju nepoužijem. Napríklad, ak bude celková dráha 400 px a dĺžka kroku 90 px, postava spraví iba celé 4 kroky (360 px), a tých 40 pixelov zostane "neprejdených".
Myslím, že nemusím hovoriť o tom, ako spraviť to, aby postava prešla len toľko krokov, koľko je "akurát". Ak to niekto nevie, nech trocha premýšľa, nie som zrovna spisovateľ, aby som mal chuť rozoberať všetko do detailov
.
Teraz ku samotnej funkcii, ktorá počíta dráhu:
Sú dve možnosti:
- preťaženie metódy
GoTo(X, Y) vo skripte scene.script
- definovať metódu vo skripte actora a túto potom volať vo skripte scene.script
Funkcia, ktorá je využiteľná pre možnosť
Ad b:) a je definovaná vo skripte pre actora:
method GoToPosition(PosX, PosY)
{
var Vzdialenost = Math.Sqrt(Math.Pow(actor.X - PosX, 2) + Math.Pow(actor.Y - PosY, 2));
Vzdialenost = ToInt(Vzdialenost);
if(Vzdialenost > 90)
{
Krok = Vzdialenost / 90;
Krok = ToInt(Krok);
actor.GoTo(PosX, PosY);
}
}
Vo skripte actora treba prepočítavať tie kroky a keď bude posledný, postavu jednoducho zastaviť.
Určite budete kritický, plný nápadov a podobne. Píšte svoje postrehy, pripomienky, čomu nerozumiete a pod.