Dynamická tvorba značiek

Z Armed Assault nápověda

Přejít na: navigace, hledání

Obsah

Úvod

Pri pokročilejšej tvorbe misií sa určite ocitnete (alebo ste sa už ocitli) v situácii keď chcete hráča upozorniť na nejakú oblasť na mape, alebo mu proste niečo na mape ukázať a označiť mu danú pozíciu značkou (markerom).
V tomto prípade máte niekoľko možností ako zrealizovať toto upozornenie.

Editácia už existujúcich značiek

Prvým a asi najjednoduchším je už priamo pri editácii vložiť danú značku na mapu a zadefinovať jej všetky požadované vlastnosti ako je pozícia, veľkosť, názov, typ ... atď.
Na záver editácie potom do súboru init.sqf zadefinujete tejto značke nulové rozmery (alebo jej ich priamo nastavíte na mape), čím ju vlastne ukryjete pred zrakom hráča.
V skriptovacom jazyku teda na to použijeme príkaz setMarkerSize.

Príklad:

"znacka" setMarkerSize [0,0]; 

- nastavenie "nulových" (x,y) rozmerov pre značku s názvom "znacka"

... a potom vo vhodnom okamžiku nastavíme tejto značke požadované rozmery a zviditeľníme ju tak hráčovi.
Samozrejme je potom vhodné na túto udalosť upozorniť hráča nejakým upozornením (hint, zmena úloh misie v briefingu atď.).

Príklad:

"znacka" setMarkerSize [100,75]; 

- nastavenie rozmerov (100 metrov x 75 metrov) pre značku s názvom "znacka" ktorá bude napríklad reprezentovať pomocou elipsovitého tvaru nepriateľské územie

Ďalej je možné použiť takmer všetky ostatné príkazy pre prácu so značkami.

Len v krátkosti pár príkladov:

"hrac" setMarkerPos position player; 

- značka s názvom "hrac" sa presunie na aktuálnu pozíciu hráča

"uzemie" setMarkerColor "ColorBlue"; 

- značka s názvom "uzemie" zmení svoju farbu z defaultnej (prípadne tvorcom misie zmenenej) na modrú farbu

deleteMarker "primarnaUloha"; 

- značka s názvom "primarnaUloha" bude zmazaná z mapy (a už nebude možné na ňu odkazovať z briefingu)

Vytvorenie novej značky

V druhom prípade si môžete vytvoriť úplne novú značku priamo počas behu misie. Ako na to, si ukážeme na nasledujúcich pár riadkoch. Sami potom uznáte že to nieje nič zložité.

marker.sqf

vystartuj = createMarker ["start", position aP];
  "start" setMarkerType "Start";
  "start" setMarkerColor "ColorRedAlpha";
  "start" setMarkerDir getDir aP;
  "start" setMarkerSize [1,4];

Popis:
Najskôr sme si zadefinovali vytvorenie značky pomocou príkazu createMarker a to presne na mieste hráča, ktorý má názov aP.
Ďalej sme zadefinovali typ značky pomocou príkazu setMarkerType. V našom prípade to je obyčajná štartovacia šípka.
Následne bola zmenená jej farba na priehľadnú červenú (pôvodná farba je zelená) a to pomocou príkazu setMarkerColor.
Pre presnejšie zobrazenie pozície značky-hráča na mape, sme ešte využili príkaz setMarkerDir, čím sme vytvorenej šípke nastavili smer natočenia tak, že jej bola predaná hodnota natočenia postavy hráča.
A nakoniec sme vytvorenej šípke zmenili veľkosť pomocou príkazu setMarkerSize, čím sme ju celú pretiahli do dĺžky.

Ak ale teraz s hráčom na mape pohneme ľubovoľným smerom, nami vytvorená šípka zostane stáť na pôvodnom mieste vytvorenia a s pôvodným uhlom natočenia.
Preto si doplníme do už vytvoreného skriptíku pár riadkov a budeme mať pohybujúcu sa značku hráča ...

dynamicMarker.sqf

vystartuj = createMarker ["start", position aP];
  "start" setMarkerType "Start";
  "start" setMarkerColor "ColorRedAlpha";
  "start" setMarkerDir getDir aP;
  "start" setMarkerSize [1,4];

sleep 0.1;

while { alive aP } do {
     "start" setMarkerDir getDir aP;
     "start" setMarkerPos position aP;
     sleep 1;
  };

deleteMarker "start"; 

Popis:
Horné riadky vytvorenia značky sú identické a tak popíšem iba zostávajúce.
Pomocou príkazu while sme si vytvorili jednoduchú slučku ktorá bude neustále opakovať obsahujúce príkazy až pokiaľ nebude splnená jej podmienka na ukončenie. V našom prípade je to smrť hráča.
Dovtedy sa bude teda neustále meniť natočenie (setMarkerDir) a pozícia (setMarkerPos) značky na základe predaných hodnôt od smeru natočenia a pozície hráča.
V prípade smrti hráča, sa splní podmienka v cykle a skript vykoná ďalší riadok za týmito riadkami a to je príkaz deleteMarker. Hráč je mŕtvy, zmažeme teda aj jeho značku.

V celku jednoduché nie ?

Nakoniec si ukážeme jeden malý efekt ktorý môžete výborne skombinovať s animáciou mapy.

Pop-Up značky

V krátkosti to popíšem ako "povytiahnutie" šípky na mape z nulovej veľkosti na nami definovanú.
Hráčovi sa tak na mape budú akoby vytvárať šípky z ničoho.

Najskôr si teda vytvorte nejakú animáciu mapy, alebo iba jednoducho upozornite hráča v misii aby sa prepol na mapu a sledoval špecifickú oblasť. V tejto špecifickej oblasti jednoducho iba naklikajte tri ľubovoľné značky (môžu to byť už rovno šípky v danom smere) a nastavte im názvy arrow1, arrow2 a arrow3. Nič viac nemusíte nastavovať. V adresári misie si vytvorte súbor init.sqf a skopírujte si nasledovný kód.

init.sqf

"arrow1" setMarkerSize [0,0];
"arrow2" setMarkerSize [0,0];
"arrow3" setMarkerSize [0,0];

sleep 4.5;
hint "Mrkni na mapu ...\n\nZa chvilu uvidis sipkovu trikoloru ...";
sleep 4.5;

["arrow1", "Arrow", "ColorWhite"] execVM "popUpArrows.sqf";
sleep 1;
["arrow2", "Arrow", "ColorBlue"] execVM "popUpArrows.sqf";
sleep 1;
["arrow3", "Arrow", "ColorRed"] execVM "popUpArrows.sqf"; 

Popis:
Ihneď na začiatku misie bude všetkým značkám na mape nastavená nulová veľkosť, takže ich hráč neuvidí.
Ďalej som použil 9 sekundovú pauzu s malým hint-om, ale vo vašom prípade by tu boli nejaké udalosti ktoré by hráča upozornili na to aby začal sledovať mapu (resp. nejakú animáciu mapy).
Po tejto krátkej pauze sú už vykonávané "povyskočenia" jednotlivých šípiek.

Skriptu s názvom popUpArrows.sqf, ktorý si popíšeme nižšie je predávané pole prvkov ktorých význam je:

  • názov aktuálnej značky na mape
  • typ značky, ktorá bude zobrazená na mape (preto ste mohli na mapu naklikať napríklad vlajky alebo otázniky)
  • farba aká sa použije na danú zobrazovanú značku

popUpArrows.sqf

_arrow = _this select 0;
_type = _this select 1;
_color = _this select 2;

_x = 0;
_y = 0;

_arrow setMarkerType _type;
_arrow setMarkerColor _color;
_arrow setMarkerSize [0.01,0.01];

while { _x < 1.5 } do {

     _arrow setMarkerSize [_x,_y];
     _x = _x + 0.05;
     _y = _y + 0.05;
     sleep 0.01;

  }; 

Popis:
Z predchádzajúceho skriptu init.sqf sú predávané hodnoty jednotlivým premenným, ktoré reprezentujú názov značky (_arrow - arrow1, arrow2, arrow3), typ značky (_type - šípka) a farbu značky (_color - biela, modrá, červená). Ďalej je lokálnym premenným _x a _y preddefinovaná nulová hodnota, pretože práve tieto dve premenné neskôr v skripte reprezentujú rozmery samotných šipiek.
Nasleduje prvotné vytvorenie/zmena značky na mape a následne na to je vo veľmi krátkom intervale (0.01 sekundy) postupne v cykle pričítaná hodnota 0.05 pre oba rozmery šipky (napr. _x = 0 + 0.05 potom _x = 0.05 + 0.05 atď.).
Takto sa potom zdá, že šipka na mape akoby "povyskočila". Tento cyklus je stále opakovaný dokola (pričítanie hodnoty 0.05 k aktuálnej hodnote premennej _x a _y) až pokiaľ hodnota premennej _x nedosiahne hodnotu väčšiu ako 1.5, čo je vlastne definitívna veľkosť šipky.
V tomto okamžiku sa "rast" šipky zastaví, pretože sa splnila podmienka cyklu while.

Odkazy

createMarker, setMarkerType, setMarkerSize, setMarkerPos, setMarkerDir, setMarkerColor, deleteMarker

Osobní nástroje