Informatika | Számítógép-architektúrák » Zahorecz Dávid - A Macromedia Director bemutatása

Alapadatok

Év, oldalszám:2003, 61 oldal

Nyelv:magyar

Letöltések száma:77

Feltöltve:2009. február 25.

Méret:440 KB

Intézmény:
-

Megjegyzés:

Csatolmány:-

Letöltés PDF-ben:Kérlek jelentkezz be!



Értékelések

Nincs még értékelés. Legyél Te az első!

Tartalmi kivonat

A MACROMEDIA DIRECTOR BEMUTATÁSA Írta: Zahorecz Dávid 8 1. Bevezető 1.1 A Macromedia Director története A 90-es években a számítógépek teljesítményének rohamos fejlődésével, az alkalmazások spektruma is egyre szélesebb lett. Ennek köszönhették hirtelen előtérbe kerülésüket a multimédiás programok is. Kezdetben, a 90-es évek elején a multimédia a felhasználókhoz csak lokális hordozókon kerülhetett az akkor rendelkezésre álló kis internetes sávszélességek miatt. Manapság, főleg a kábel és az ADSL megjelenésével, már rengeteg felhasználó rendelkezik megfelelő kapcsolattal ahhoz is, hogy egy multimédiás programot online, az Interneten keresztül használhasson. Ezen anyagok elkészítéséhez a hagyományos programozási nyelvek nem nyújtottak megfelelő támogatást, ezért a vezető szoftvergyártó cégeknek adott volt az új lehetőség: saját fejlesztői rendszer készítése multimédiás bemutatókhoz. Elvárás volt egy

ilyen rendszerrel szemben, hogy ötvözze az animációs stúdiók egyszerű használatát, a különböző médiák könnyű kezelhetőségét és a magas szintű nyelvek hatékonyságát. Az első igazán sikeres próbálkozás az Asymetrix nevű cég (mai neve: SumTotal) ToolBook - jelentése: „Szerszámkönyv” - nevű programja volt. Mai szemmel nézve nagyon csekély lehetőségekkel és nehézkes programozhatósággal rendelkezett, a maga korában azonban még mindig a leghasználhatóbb volt. A ToolBook kezdeti sikerei után hamarosan kezdett egyértelművé válni, hogy a legnagyobb versenytárs ezen a piacon a Macromedia Inc. lesz, a Director – jelentése: „Rendező” – illetve a Flash – jelentése: „Villanás” – nevű fejlesztői rendszereivel. A cég megjelenése idején (1994) élte virágkorát a lokális multimédia, de már kezdett az internetes felületeken is előtérbe kerülni. Ezért az alapvető elképzelés az volt, hogy a Director egy lokális

fejlesztésre optimalizált rendszer legyen, a Flash pedig az internetes platformot célozza meg. Ennek ellenére a két rendszer sok hasonlóságot mutat a kezdetektől fogva, mely nagyban megkönnyíti azon programozók dolgát, akik mindkét rendszert alkalmazni szeretnék. Ráadásul a két program újabb verzióiban egyre inkább eltűnőben van az a szemléletbeli különbség, melyet a lokális és az internetes 9 felületre való tervezés okozott. A legújabb Director, az MX-2004 éppúgy alkalmazható internetes fejlesztésre, mint a legújabb Flash (verziószáma szintén MX-2004), lokális programok készítésére. A Macromedia tehát 2000-re szinte egyeduralkodóvá vált a piacon, a most bemutatásra kerülő „mozi” elven alapuló rendszerének nem volt ellenfele a sokkal statikusabban működő, „könyv” alapelvű ToolBook. Továbbá a multimédiás szoftverek versenyében egyre inkább döntő szerepet kapó design-hoz nyújtott eszközökben sem tudott

lépést tartani az Asymetrix. A Director 5-ös – 6-os verziójával (1996-97) győzte meg végleg a fejlesztőket és az ezzel foglalkozó cégeket, hogy az egyik legjobb szoftver a multimédiás fejlesztői rendszerek között. Azóta sorrendben a következő verziók jelentek meg: 65, 70, 80, 8.5, MX, MX-2004 Voltak, melyek jelentősebb változásokat hoztak, voltak melyek kevesebbet, de a tendencia egyértelmű volt. Mivel egyre szűkül a piaca a lokális, például CD-n terjesztett programoknak, ezért a Director is arra orientálta fejlődését, hogy újabb lehetőségeket adjon az internetes megjelenéshez. Mindazonáltal valószínűleg e téren sosem fogja utol érni a Flash-t, mely már a kezdetektől erre készült. Mégis jól strukturált rendszere és néhány dolog, melyre a Flash továbbra sem képes, sok fejlesztőt tartott meg a mai napig. 1.2 A multimédiáról általában Hatalmas váltást jelentett a digitális információközlésben, mikor a

hagyományos szöveg mellett megjelentek a további médiák. Rengeteg új lehetőséget nyújtott kezdetben a képek használata, majd a dinamikus médiák: a hangok és a mozgóképek közlése. Az egyik legjelentősebb előnye a digitalizált médiáknak, a könnyű szerkeszthetőség. Nem kell például egy videó megvágásához egy nagy költségű analóg elven működő gép, mely ráadásul komoly szakértelmet is igényel, hanem egy program, megfelelő irányítás alatt, elvégzi ezt helyettünk. Ezzel létre is jött egy új szakterület, melynek feladata ezek szerkesztése. 10 1.21 A képek A kezdetek óta számtalanul sok képszerkesztő program jelent meg, mely lehetőséget nyújt digitális képek egyszerűbb vagy bonyolultabb szerkesztésére. Két fő vonalon folyt a fejlesztés: mind a vektorelvet, mind a raszterelvet követő szerkesztőknek meg voltak az előnyeik és a hátrányaik. A grafikus képek számítógépes feldolgozása eleinte csak a

különböző rajzoló programok alkalmazását jelentette. Ezek rasztergrafikus alapon működtek, azaz képpontokból álló képek feldolgozását végezték. Ez azt jelenti, hogy ha egy pixelgrafikus programmal vonalat rajzolunk, akkor az alkalmazás azt apró pontokká alakította, és azokat jelenítette meg a képernyőn. Ezeket a pontokat nevezzük pixeleknek. Magát az elkészített képet bitképnek hívjuk A pixelgrafikus programok nagy erőssége az, hogy igen egyszerűen lehet velük képeket készíteni. Ehhez mindenféle testreszabható eszköz áll rendelkezésre, például rajzoló vagy kijelölő eszközök. A rasztergrafikus programok hátránya, hogy korlátozzák a felbontással kapcsolatos lehetőségeinket. A bitképek adott számú pixelt tartalmaznak, így a kép felbontása majd attól függ, hogy milyen méretben nyomtatjuk azt ki. Amíg kicsiben nyomtatjuk ki a képet, addig a képpontok aprók lesznek, ha viszont nagy méretben akarjuk kinyomtatni a képet,

akkor a pixelek is megnőnek. Ezt a problémát úgy oldhatjuk meg, ha növeljük a kép pontjainak számát, ám ez a módszer a képet tartalmazó fájl méretét nagymértékben megnöveli. Ismertebb raszteres képszerkesztők: Adobe Photoshop, Corel Photopaint, stb. Egyre nagyobb igény mutatkozott a grafikus objektumok adatbázisban történő tárolására. Ez vezetett a vektorgrafika kialakulásához, mely az objektumokat egy lebegőpontos világkoordináta-rendszerben írja le. Ebben a rendszerben egy pontot a hozzá vezető helyvektorral lehet azonosítani, ezért nevezik ezeket a rendszereket vektorgrafikusnak. Az adatbázis lehetővé teszi az objektumok önálló visszakeresését és a köztük lévő strukturális kapcsolatok számítógépes feldolgozását. A vektorgrafikus rendszerben új objektumokat hozhatunk létre, ezeket transzformálhatjuk. A rajzolás sokkal inkább szerkesztéshez hasonlít, hiszen itt egymástól független vonalakból és alakzatokból

építjük fel a végeredményt. Minden objektum önállóan szerkeszthető A 11 vektorgrafikus programok a görbéket, egyeneseket és feliratokat matematikai egyenletekként tárolják, az objektumok automatikusan alkalmazkodnak a használt kimeneti eszköz által nyújtott felbontáshoz. A vektoros képek másik előnye, hogy viszonylag kevés lemezterületet foglalnak, hátránya viszont, hogy nehéz kizárólag vektoros objektumokkal igazán látványos, igényes design-t alkotni. Híresebb vektoros képszerkesztők: Corel Draw, Adobe Illustrator, Macromedia Freehand, stb. 1.22 A hangok A multimédiás elemek közül talán ez az a média, mely a legritkábban szerepel információközlőként. Általában aláfestő zenék és rövid hangeffektek formájában jelennek meg, mellyel jelentősen befolyásolható egy multimédiás bemutató hangulata. Egy komolyabb témánál értelemszerűen nem érdemes mindenféle zajokkal megzavarni a lényegre való összpontosítást,

kivétel ha ennek fontos információtartalma van, például egy nyelvoktató cd esetében. Ezen hangok létrehozására és formázására számtalan szoftver áll rendelkezésre. A létrehozásra alkalmas programok segítségével a különböző hangminták keverésével készíthetünk zenéket. Meghatározhatjuk az ütemet, valamint, hogy melyik csatornán, melyik hangminta mikor szólaljon meg. A végeredményt ezek a programok kész hangfájl (wav, mp3, stb.) kimenetbe exportálva teszik más programok számára felhasználhatóvá. Az ilyen szintű hangalkotás általában nem feladata egy multimédiás fejlesztői rendszernek. Ismertebb hangalkotó szoftver például a Fruity Loops A másik jellegzetes szoftver típus ezen a területen a szerkesztő. Ezek alsóbb szinten foglalkoznak a hanggal, tehát közvetlen módosíthatóságot biztosítanak a hang amplitúdójában és frekvenciájában. Általában effektezési lehetőségeket is ismernek Az ilyen jellegű

tevékenység már elvárás lehet egy multimédiás fejlesztői környezettől, ennek ellenére a jelenlegiek közül egyedül a Flash bír egy egyszerűsített hangszerkesztési lehetőséggel. A legelterjedtebb ilyen szoftver talán a Sound Forge Fontos a hang témakörénél megjegyeznünk a tömörítések fontosságát. A tömörítetlen wav helypazarló típusát már régen felváltották a tömörített mp3-ak, hiszen Internet esetén nem mindegy, hogy mennyi idő alatt töltődik le a program és egy hang igencsak meg tudja növelni a méretet. Ezt a segédfunkciót már illik alkalmaznia 12 minden fejlesztői rendszernek ha versenyképes akar maradni. Példaként a Flash már arra is képes, hogy egy külső hang bitfelbontását véglegesen módosítsa, nem csak az importáltét. 1.23 Videók, animációk A multimédiás elemek felsorolásakor néha csak mozgóképként szokták említeni ezen médiákat, én mégis fontosnak találom az animációk és

videók megkülönböztetését. Animációknak szoktuk általában hívni azokat a mozgóképeket, melyeket mi digitálisan hozunk létre objektumokkal, valamilyen koordinátarendszerben (2 vagy 3 dimenzióban), tulajdonságok állításával. Videókról a hagyományos úton végzett képrögzítések sorozatának eredményénél beszélünk. Eszerint más fejlesztőfelülettel is rendelkezünk ezekhez. Animációk készítésére ma már minden multimédiás fejlesztői rendszer képes több-kevesebb kisegítő lehetőséggel, így a Director is. Azonban ezek jellemzően nem lépnek ki a 2 dimenzió világából. A 3 dimenziós modellezéshez és animációkhoz külön, rendkívül összetett szoftverek állnak rendelkezésre. A legismertebbek ezek közül a 3D Studio Max és a Maya. Mivel azonban ezek nagy szakértelmet és rengeteg háttérismeretet igénylő alkalmazások, készítettek egyszerűbb 3 dimenziós animációk készítéséhez könnyebben kezelhető

programokat is. Ilyen a Flash export formátumába (*.swf) konvertálni tudó Swift 3D is A hagyományos videók szerkesztéséhez a szakma 90%-a az Adobe cég Premiere nevű programját használja. Ez egy kétsávos videó szerkesztő, mely egyben a videókhoz tartozó hangok szerkesztésére is alkalmas és rengeteg beállítási lehetőséget biztosít a kimenet konfigurálásához. Az egyes videó részek között számos átúszási fajtát támogat, képek beszúrására is alkalmas és még egyéb rengeteg segítséget nyújt ahhoz, hogy a kívánt végeredményt előállítsuk. Ennek a széleskörű lehetőségtárnak köszönheti óriási népszerűségét. A videóknál említést kell még tenni arról a káoszról, mely a videó kódolási fajták sokaságát jellemzi. Szinte napról napra jönnek ki az újabb és újabb codec-ek, melyek között igen nehéz kiigazodni, s melyek jelentősen nehezítik a fejlesztők dolgát. 13 Ez a probléma csak úgy küszöbölhető

ki ha igyekszünk naprakésznek lenni és rendszeresen frissítjük codec tárunkat. Összegezve elmondható, hogy nem lehet teljes egy multimédiás program videók nélkül, hiszen a legnagyobb látványt kétségtelenül ezek jelentik és természetesen rengeteg információval is szolgálhatnak adott esetben. Éppen ezért nagyban befolyásolja egy fejlesztői rendszer milyenségét, hogy milyen szinten támogatja az ilyen médiák megjelenítését, szerkesztését, vezérlését. Néhány említett program ikonja. 14 1.3 Mire szolgálnak a fejlesztői rendszerek? A fejlesztői rendszerek olyan interaktív programok létrehozására alkalmasak, programozói eszközökkel, melyek az ötféle multimédiás elem mindegyikének felhasználására is képesek. Ez persze csak egy szűk összefoglalása az elvárásoknak Ezek a rendszerek számos fejlesztői felülettel és mögöttes ideológiával rendelkeznek. Mindig van saját programozási nyelvük, objektum- és

eseményorientáltak. Az imént említettem az interaktivitás fogalmát, mely igen központi helyet foglal el egy ilyen rendszerrel szembeni elvárások között. Interaktívnak nevezzük azokat a programokat, melyek nem csak bemutatnak valamit egy adott sorrendben, hanem együttműködve a felhasználóval, közösen határozzák meg a további történéseket. Ennek nagyon jellegzetes példája lehet egy játék vagy egy bonyolultabb menürendszer, esetleg űrlap vagy bármilyen olyan elem, amely a felhasználó beavatkozásától függően alakul. Ehhez mindenképpen teljes körű támogatást kell nyújtania a rendszernek, különben egyenrangúnak tekinthetnénk egy PowerPoint szintű bemutató készítővel. További fontos kritérium a platformfüggetlenség. Biztosítani kell a fejlesztőt arról, hogy munkájából olyan kimenet lesz készíthető, melyet bizonyos fejlettségi szint fölött minden számítógépen teljes egészében futtatni lesz képes. Az igazán

tökéletes az lenne, ha ehhez még Plug-In sem kellene, de természetesen egy Interneten megjeleníthető kimenet esetében ez nehezen elképzelhető, ismét csak a méretbeli korlátok miatt. Végül egy teljesen triviális, ámbár néha mégsem annak tűnő elvárás. Ha valamilyen lehetőséget felkínál a fejlesztői rendszer, akkor annak illik hibák nélkül tökéletesen működnie is. Sajnos ilyen rendszer még nemigen jött létre, a Director-ban is számos funkció hibásan működik. Ezekre az adott témakör tárgyalásánál még külön kitérek. 15 2. Az alap fejlesztői felületek Ahogy az a program és egyes részeinek nevéből kitűnik, a Director a filmkészítés metaforáját használja. Szükségünk lesz tehát szereplőkre – Cast members, forgatókönyvre – Score, és ahol mindez megjelenik, egy színpadra – Stage. Szükségünk lesz még továbbá egy olyan felületre is, ahol a szereplőket a forgatókönyv szerinti szerepnek megfelelően

alakíthatjuk – Property Inspector. Ezeket mutatja be ez a fejezet 2.1 Cast - Szereplőlista A szereplők a legelemibb egységei a multimédiás programunknak, tehát minden ami valamilyen módon megjelenik a programban, vagy hatást gyakorol arra az külön member-ként jelenik meg. Hogy hol? Egy szereplőlistában vagy hagyományos filmbeli nevén egy stábban. Ezek a Cast-ok lehetnek a Director Movie (*.dir) részei vagy tárolhatjuk őket külső fájlban is (*.cst) és egyszerre maximum 32000 szereplőt tartalmazhatnak. Bár általában ez a kapacitás elégséges akár egy egész multimédiás műnek is, mégis számos előnye miatt érdemes több Cast-ot használni:  Külső Cast esetében más Director programok számára is felhasználható lesz a szereplőlista. Így természetesen annak tartalma, a különböző szereplők is elérhetőek lesznek.  Ha több Cast-ot használunk, az lehetőséget ad arra, hogy egy jobban strukturált rendszerben, átlátató

módon tároljuk member-jeinket. Mivel egy nagyobb project esetében akár több ezer színészünk is van, ezért ez tényleg nagy segítség lehet.  Több Cast használatának előnye továbbá, hogy mindegyikhez meghatározható egy úgynevezett „Preload Mode”, melynek segítségével jobban gazdálkodhatunk a felhasználó számítógépének memóriájával, hiszen beállíthatom úgy, hogy csak akkor töltse be az adott szereplőlistát, ha valamelyik tagja szerepet kap. 16 A Cast-ok ilyen módon való menedzselésére a Modify menü Movie > Casts menüpontja szolgál:  A New gombra hatására létrehozhatok új Cast-ot, majd megválaszthatom, hogy az belső – internal – legyen, vagy külső – external, továbbá hogy milyen néven legyen elérhető a továbbiakban.  A Link gombbal már létező, külső Cast-okat csatolhatunk programunkhoz.  A Remove-val törölhetem az aktuálisan kijelölt Cast-ot. 2.2 Score - Forgatókönyv A

program időbeliségét, mint már említettem a Score határozza meg. A forgatókönyvet gyakorlatilag egy kétdimenziós koordinátarendszerként kell elképzelnünk, melynek x tengelye az idő, y tengelye pedig a rétegződés. 2.21 Frames - Képkockák Akárcsak egy film esetében, természetesen a Director-ban is állóképek sorozatával érünk el minden mozgó hatást. Ezek az időpillanatok, melyek alatt a Score nem eszközölhet változást a munkánk kimenetén, a Frame-ek – Képkockák. Ez tehát a vízszintes, időbeliséget kifejező tengely osztása. Azt, hogy egy ilyen időpillanat ténylegesen mennyi ideig van jelen fps (frame per second) mértékegységben határozhatjuk meg. Ez a szám tehát azt fogja megadni, hogy a lejátszófej egy másodperc alatt hány képkockával halad előre. (Szemünk érzékenysége miatt a 30 körüli érték már teljesen folyamatos érzékelést jelent.) Meghatározásának módjai: 17  A Window menü Control Panel

menüpontjára az alábbi ablak jelenik meg. Az itt megadott fps lesz az alapértelmezett programunk futása során.  A másik lehetőség, hogy a Score FrameTempo nevű extracsatornáján új fps értéket állítunk be. Ennek hatására egészen addig míg új utasítást nem adok, ezzel a tempóval játszik a program. Az alábbi képen erre látható példa: Háromszor adunk új értéket – először 30-at, majd 97-et és végül 71-et – a FrameTempo-nak (a legfelső extracsatornán látható). 2.22 Channels - Csatornák A program futása során egy időpillanatban, Frame-en általában természetesen nem csak egy szereplő játszik. Ezek azonosítására és rétegződésüknek meghatározására vannak a csatornák. Egy időben, egy csatornán csak egy szereplő – sprite - lehet, így tudjuk őket megkülönböztetni. Minél nagyobb a csatorna száma, melyen az objektum van, az annál feljebb helyezkedik el rétegesen is. Zavaró lehet, hogy a számozás a tengelyen

lefelé nő, tehát a Score ablakban lejjebb lévő szereplő van a kimeneten feljebb. 18 2.3 Stage - Színpad A fejezet eddigi részében többször említettem, hogy a különböző dolgoknak milyen hatásuk van a kimenetre. De mi is ez a kimenet? Az ami a program futtatható állománnyá exportálása után megjelenik. A film metaforájánál maradva nevezték el ezt a felületet színpadnak. Ez tehát a vizuális megjelenése programunknak Gyakorlatban úgy működik mintha egyszerű háttere lenne szereplőinknek. Lehetőségünk van rá, hogy színét meghatározzuk, így a nem lefedett területeken ez jelenik meg. Hiányosságként értékelhető, hogy gradiens színt, vagy képet nem adhatunk meg, tehát ha ilyen hatást szeretnénk elérni, akkor a külön szereplőként ezt az első csatornára kell elhelyeznünk és azt a programunk teljes „szélességében” aktívvá kell tennünk. Megadható továbbá a Stage mérete, mely ugyancsak igen fontos paramétere

fejlesztésünk végeredményének, hiszen az alkalmazásunk ablakának mérete is ekkora lesz. Állítható továbbá a helye is, mely a későbbi ablak helyét is meg adja egyben 2.4 Property Inspector, az objektumtulajdonságok Egy objektumot teljes egészében tulajdonságainak sorozata határoz meg, melynek egy része létrehozásánál vagy importálásánál véglegesen eldől, a többit azonban később is állíthatjuk. Ezen tulajdonságok menedzselésére szolgál a Property Inspector. A felület különböző részeinek taglalása előtt azonban még tisztáznunk kell egy rendkívül fontos kérdést. Megállapítottuk, hogy programunk legalapvetőbb egységei a szereplők. Egy szereplőt – Cast member-t – is az ő tulajdonságai határoznak meg De milyen tulajdonságok ezek? Szemléletes példa lehet a színész hajának színe, magassága, de akár az is hogy a szereplő például egy kutya. Ha a szereplő azonban szerepet kap, szükség lehet például hajszínének

megváltoztatására és ez persze nem okozhat különösebb gondot. Ez a tulajdonság azonban már a szerep tulajdonsága lesz, nem a szereplőé! Meg kell tehát különböztetnünk a szereplőt és a szerepet. A szerep elnevezése a Director-ban a Sprite. 19 Sok azonos tulajdonsággal rendelkeznek a member-ek és sprite-ok, de közel sem egyezik meg mind. Gondoljuk csak meg, hogy milyen nehézségekbe ütközne, ha a fent említett kutya szereplővel akarnánk eljátszatni Rómeó szerepét a filmben. Tehát például egy szövegmező típusú member-t nem használhatunk kép sprite-ként. Fontos tudni továbbá, hogy egy szereplő több szerepet is játszhat, akár egy időben is. Egy szerephez azonban értelemszerűen csak egy szereplő tartozhat Ha több szerepet játszik egy szereplő, akkor a közöttük lévő különbséget a sprite szintű tulajdonságok adják, a member szintűek továbbra is megegyeznek. Itt kell felhívnom a figyelmet egy nagyon zavaró

tulajdonságra, az előbb említett szövegmező „szöveg” tulajdonságára, mely member szintűként lett megalkotva. Ez azt jelenti, hogyha egy fieldet két helyen is felhasználok, a tartalmuk sosem lehet különböző. Nem túl praktikus Ha az egyiket megváltoztatom, a member szint miatt változik a másik is. Nézzük tehát milyen részekből áll a Property Inspector:  Sprite tulajdonságok: Kijelölt sprite esetén jelenik meg, annak sprite szintű tulajdonságainak állítására.  Általános member tulajdonságok: Azok a member szintű tulajdonságok állíthatóak itt, melyekkel minden member típus rendelkezik.  Típustulajdonságok: Az adott member típushoz tartozó tulajdonságok szerkeszthetőek itt.  Behavior: Itt rendelhetek script-eket a kijelölt sprite-hoz.  Guide: Segédvonalak, rácspontok testreszabásának felülete.  Movie: A movie általános tulajdonságai szerepelnek itt, például a már említett beállításai a

Stage-nek. 20 2.5 Példák: Cast: Score: 21 Kép a Stage-ről: A Property Inspector, úgy hogy egy sprite van kijelölve: 22 3. Animációs lehetőségek Alapvető elvárás egy multimédiás fejlesztői rendszerrel szemben, hogy kiterjedt animációs lehetőségekkel rendelkezzen. Ezen a területen a Director némi lemaradást mutat a Macromedia másik terméke, a Flash mögött, de mindenesetre mindenképpen elégséges a tudása e téren is. Igazán bonyolult mozgások készítését természetesen programozással kell megvalósítanunk, ezek a lehetőségek inkább az egyszerű, díszítő jellegű animációk készítéséhez nyújtanak segítséget. 3.1 Tweening – Átúsztatás A Tweening egy olyan eljárás, mely a hagyományos rajzfilmkészítés elvén alapszik. Régen, mikor még minden képkockát kézzel rajzoltak, a művész csak a főbb pontokat rajzolta meg. A köztes változások aprólékos megrajzolását olyan emberek végezték, akik jól tudtak

rajzolni, másolni, de az alkotás nem az ő feladatuk volt. Ugyanez a munkamegosztás a fejlesztő és a Director között. Nekünk csak a főbb pontokat kell megadnunk, a köztes állapotokat a Tweening ebből számolja. Ezek a definiálható pontok a Keyframe-ek - Kulcskockák. A Score-ban ezeket kis fehér körökkel jelöli az adott sprite-on. Az alább megadott sprite szintű tulajdonságokat úsztatja át a következő ilyen pontig, létrehozva ezzel az animációt:  Path – x és y tengely szerinti pozíció  Size – méret (szélesség és magasság)  Rotation – elfordulás (fokban)  Skew – vízszintes és függőleges dőlés (fokban)  Background Color – háttérszín  Foreground Color – előtérszín  Blend – láthatóság (százalékban) Ha tehát például az egyik Keyframe-en a horizontális pozíciót 150-re, a vertikális pozíciót 100-ra, az elfordulást pedig 0-ra állítom, míg a következő Keyframe-en ezek az adatok

sorrendben 350, 100 és 360, akkor a sprite úgy fog jobbra mozogni 200 pixelt, hogy közben fordul egy teljes kört regisztrációs pontja körül. 23 Itt kell említést tennünk a Director koordinátázási elvéről. A 0,0 koordináta a Stage bal-felső sarkában van, a x pozíció értelemszerűen jobbra, az y lefelé nő. Egysége a pixel. Azt viszont még mindig nem tudjuk, hogy az adott sprite melyik pontját határozzuk meg, mikor koordinátákat adunk meg. A válasz az imént említett regisztrációs pont („RegPoint”), melynek helye a határoló téglalap bal-felső sarkához képest van megadva, és mely egy member szintű tulajdonság. A Stage-en való elhelyezkedés értelemszerűen sprite szintű tulajdonság, ellenkező esetben egy member-t mindig csak ugyanoda tudnánk helyezni. Ez a példa is szemléletesen mutatja a sprite szintű és member szintű tulajdonságok elkülönítésének fontosságát és alapelvük különbözőségét. A felsorolt sprite

tulajdonságok állításán kívül még egy módon befolyásolhatom a Tweening animációm kinézetét. Az animált sprite kijelölésével a Modify menüben a Sprite > Tweening menüpontot kiválasztva a következő ablak jelenik meg:  A Tween beállítás checkbox-jainak állításával az egyes tulajdonságok animálása kapcsolható ki illetve be.  A Curvature csúszkájának mozgatásával azt tudom befolyásolni, hogy mennyire görbítse meg a mozgások pályáját, azokon a pontokon, ahol az irányt vált. A Linear-nál semennyire, az Extreme-ig húzva jelentősen torzítja az alapértelmezetten kiszámolt útvonalat. 24  Az Ease-In, illetve az Ease-Out beállítások segítségével tudom meghatározni, hogy gyorsuljon, vagy lassuljon az adott animáció. Gyakorlatban ez azt jelenti, hogy az egyik vagy másik Keyframe felé sűríti a köztes állapotokat. 3.2 Cast To Time Ez egy olyan animációs technika, mely egy az előzőekben

felállított állítással szemben képez kivételt. Azt állítottuk korábban, hogy egy sprite-hoz, mindig csak egy member tartozhat. Íme a kivétel Ha egyszerre több member-t kijelölök a Cast-ban, akkor kiválaszthatom a Modify menü Cast To Time menüpontját. Ennek hatására egy új sprite fog létrejönni, mely annyi frame hosszú lesz, ahány member-t kijelöltem. Mindegyik frame alatt más és más member-t fog mutatni azok közül, melyek ki voltak jelölve, abban a sorrendben, ahogyan a Cast-ban szerepeltek. Ha nyújtom a sprite-ot, akkor arányosan nőnek majd a member-ek „szeletei” is benne. Ha viszont összehúzom, akkor kénytelen megfelelő számú member-t eldobni, melyek sajnos így végleg elvesznek. Ha újra nyújtom, akkor is csak a benn maradt member-ek „szeleteit” nyújtja. Az ezzel a módszerrel létrehozható animációk gyakorlatilag egy animált gif tudásával megegyezők. Egyszerű raszteres képek egymás után való megjelenítése Előnye

viszont, hogy egy így létrehozott sprite-ra továbbra is alkalmazhatóak a Tweening eljárásai. Ezzel a kombinálással viszont már összetettebb animációk készíthetőek. Például megrajzolom egy madár szárnyának állapotait repülés közben, majd ezeket a képeket a Cast To Time segítségével összefűzöm egy sprite-ba, és végül a Tweening-gel arra mozgatom, forgatom, amerre csak szeretném. Így máris elkészült egy repülő madár, mozgó szárnyakkal. Bizonyos esetekben szükség lehet egy már elkészített sprite member-jeinek sorrendjének megfordítására. Erre szolgál a Modify menü Reverse Sequence (Fordított sorrend) menüpontja. 25 Kijelölt képek a Cast-ban. A Cast To Time parancsra kattintva a Modify menüben, most egy növekvő virágot készít a program. 3.3 Film Loop A Film Loop röviden egy olyan member típus, mely a Score egy szeletét eltárolja létrehozásakor. Ha egy ilyen member-nek szerepet adok, akkor – bár egy sprite-ot

látok a Score-ban – mégis megjeleníti azt a teljes Score részletet, ami ki volt jelölve létrehozásakor. Tehát bonyolultabb – több sprite-ból álló animációk – tárolására alkalmas. Member szintű tulajdonsága, hogy hányszor ismételje a lejátszást („Loop”). A másik jelentős előnye a módszernek, hogy csak így valósítható meg lejátszófej független animáció a Director-ban. A Film Loop-nak saját lejátszófeje van, mely ahogy szerepet kap elindul, s alapértelmezetten csak akkor áll meg, ha a Loop-ban megadott értékszer már lejátszotta tartalmát. Tudni kell még, hogy az egyszerűbb hozzárendelt script-eket képes megjegyezni a Film Loop, de csak erősen redukált parancskészlettel. Arra mindenesetre azért képes, hogy megállítsa saját lejátszófejét és ez mindenképpen hasznos tud lenni. 26 Nagy hiányosság azonban, hogy e külön Score-t imitáló objektumot nem tudjuk kívülről vezérelni, saját lejátszófejét

programból mozgatni. Ez ennél sokkal magasabb szinten valósult meg a Flash-ben, Movie Clip néven. Film Loop-ot létrehozni az Insert menü Film Loop menüpontjával tudok. Ekkor csak egy member jön létre a Cast-ban, szerepet nekünk kell neki adni. Éppen a kijelölt Score részletből (az elsőtől a 22. frame-ig és a 10 csatornától a 16-ig) készülünk Film Loop-ot készíteni. 27 3.4 Példák: Alaphelyzet (31. csatorna 2 frame-jén lévő Keyframe): A nyíl nem látható és fent helyezkedik el. Ha a kurzor szöveg fölé megy, a tweening lemozgatja a nyilat és láthatóvá teszi. (31. csatorna 10 frame-jén lévő Keyframe) Nekünk csak a két szélső ponton kellett ezeket a tulajdonságokat beállítanom. 28 4. A Lingo programozási nyelv alapjai A Director programozási nyelve a Lingo egy objektum alapú, de jellegében procedurális nyelv. Működése az üzenetküldésre és annak kezelésére, a „Handler”-ekre épül. A nyelvben létező

komponensek pár kivételtől eltekintve megegyeznek a Director kezelőfelületeiről elérhetőkkel. A programozást könnyűvé teszik az angol nyelvtanára erősen hasonlító szintaxis és a szemléletes könnyen megjegyezhető elnevezések. 4.1 Az eseményorientáltság Mint azt említettem, a Director-ban minden utasítás csak valamilyen esemény hatására hajtódhat végre. Ám ezen események kiváltója, vagy máshogy fogalmazva üzenetek küldője, többféle is lehet. Ezek szerint a következő csoportokba sorolhatjuk az eseményeket: I. Interakciós események: Mint arról már korábban szóltunk, egy multimédiás program igazi lényege az interaktivitás, a felhasználó és program közti párbeszéd. Ez is, mint minden más, eseményeken keresztül valósul meg. Ebbe a csoportba tehát minden olyan esemény beletartozik, melyet közvetlenül a felhasználó beavatkozása eredményez. Például:  mouseDown: az egér balgombjának lenyomása 

mouseUp: az egér balgombjának felengedése  rightMouseDown: az egér jobbgombjának lenyomása  rightMouseUp: az egér jobbgombjának felengedése  mouseEnter: a kurzor valamely sprite fölé való húzása  mouseLeave: valamely sprite elhagyása a kurzorral  keyDown: bármelyik billentyű lenyomása a klaviatúrán  keyUp: bármelyik billentyű felengedése a klaviatúrán 29 II. Nem interakciós események: A. Ide tartoznak a program futása által automatikusan generált események, más néven rendszeresemények, melyeket a Director maga küld el. Például:  startMovie: a movie elindulásakor generált üzenet  stopMovie: a movie bezárásakor generált üzenet  enterFrame: a lejátszófej az adott frame-re ér  exitFrame: a lejátszófej az adott frame-et elhagyja  beginSprite: a lejátszófej az adott sprite „idejébe” ér  endSprite: a lejátszófej az adott sprite-ot elhagyja B. A másik csoport a nem

interakciós események között a user defined event – felhasználó által definiált esemény. Ezek olyan üzenetek, melyeket a programozó küld el programból. Gyakorlatilag úgy használhatóak ezek, mint hagyományos nyelvek függvényei, hiszen a handler-t is mi írjuk hozzá, tehát az bármikor meghívható ilyen módon és paraméterezhetőek is. 4.2 Script típusok A script-ek tulajdonképpen nem mások, mint handler-ek tárolói, melyek segítségével befolyásolhatjuk, hogy az adott eseményt – üzenetet – melyik handler kezelheti le. Alapvetően négyféle script-et különböztetünk meg A legegyszerűbb a Sprite Script, melyet mint nevében is benne van, sprite-hoz rendelve használunk. Hatással csak akkor lehet, ha az adott üzenet, melynek lekezelő handler-jét tartalmazza, eljut az őt birtokló sprite-hoz. A következő a Frame Script. Ezeket a legalsó – mindig látható – extracsatornához rendelve alkalmazhatjuk. Csak akkor játszhat szerepet

valamely benne lévő handler, ha az adott frame-en tartózkodik éppen a lejátszófej. Mindkét eddig említett script a Cast-ban külön script member-ként jelenik meg, típusuk Behavior – „viselkedés”. 30 Az egyetlen olyan script típus, mely nem külön member-ben van tárolva, a Cast Member Script. Ezt egy már létező member-be integrálva hozhatom létre Ha egy member-nek van member script-je, akkor azt egy külön kis ikon is jelzi a Cast-ban. A benne lévő handler-ek csak abban az esetben futhatnak le, ha a belőle készült sprite megkapja az adott üzenetet. Az utolsó lehetséges script típus, a Movie Script. Ez is külön script memberként jelenik meg, a típusa pedig Movie lesz Ez egy olyan script, melyet nem kell és nem is lehet sehova rendelni, hatását a Cast-ban minden egyéb teendő nélkül kifejti. Ezen tulajdonsága miatt általában nem is kell belőle több mint egy darab, legfeljebb akkor, ha szeretném csoportosítani a benne lévő

handler-eket. 4.3 Scriptek hierarchiája Mint azt már említettem minden eseményt úgynevezett handler-ekkel kezelünk le, s arról is volt már szó, hogy az handler-eket különböző típusú script-ek tárolják. Meghatározott azonban, hogy ezek a script-ek mikor jutnak hozzá az eseményhez. Ezt szabályozza a Director script hierarchiája. A fenti ábra tanulsága szerint először a sprite script-nek van joga a létrejött eseményt lekezelni. Természetesen az esemény oldalirányban alapértelmezetten nem 31 terjed, tehát ha sprite-on esett eseményről van szó (például mouseEnter), akkor csak az a sprite script kapja meg, amelyik az adott sprite-hoz hozzá van rendelve. Ha sprite szinten az esemény lekezelődik, akkor ott az véget is ér. Ha azonban nem volt handler-e az üzenetnek, akkor az továbbterjed. Amennyiben nem egyszerű eseményhívás hatására indult el az üzenet – mint az ábrán is látszik –, akkor a következő állomás a member script.

Természetesen csak arról a member-nek a scriptjéről van szó, amelyikből az adott sprite készült Mikor member szinten sem kerül lekezelésre az üzenet a következő állomása a frame script lesz. Pontosabban annak a frame-nek a script-je kapja meg, amelyen aktuálisan a lejátszófej tartózkodik. A többi frame script nem szólhat bele az üzenetbe semmilyen módon. Végül pedig ha frame szinten sem halt el az esemény, akkor az „lecsorog” a movie script-ig. Mint azt korábban említettem a movie script-ek közvetlenül a Cast-ban fejtik ki hatásukat, tehát a Director minden részének állapotától teljesen függetlenül lekezelődnek azon események, melynek a movie script-ben van handler-e. Ha a movie script-ben sem kezelődik le az esemény, akkor anélkül szűnik meg, hogy a program bármilyen módon reagálna rá. Természetesen annál interaktívabb egy program, minél kevesebb ilyen esemény van. 4.4 Handler-ek és az alapvető navigációs lehetőségek

Rengetegszer említettem már, hogy minden esemény lekezelése handler-ekben történik. Nézzük hát milyen szintaktikával valósíthatjuk meg: on <esemény neve> utasítások end A handler tehát egy keret tartalma, az on és end közötti utasítások sorozata. Ezekkel reagál a program az on után meghatározott esemény érkezésére. A legegyszerűbb és egyben leggyakrabban használt ilyen utasítás a lejátszófej mozgatása, illetve a movie-k közötti ugrás, mellyel minden egyszerűbb navigációs feladat megoldható. 32 Szintaktikája az alábbi: go <frame száma> vagy go to movie <movie neve> vagy go <frame száma> of movie <movie neve> A go parancs szolgál tehát a lejátszófej mozgatására mind az adott movie-n belül mind azon kívül (más dir fájlok). Hatása azonnali, tehát ha egy bármilyen utasítás a go parancs után következik, akkor azt már az frame-en fogja végrehajtani a Director. Ha movie-k között

szeretnék ugrani, akkor a movie nevénél az adott dir fájlt és ha szükséges, annak relatív vagy abszolút elérését kell megadnom. 4.5 Példák: Egy gombként használt kép van kijelölve. Alatta kivilágosítva láthatjuk, hogy mely script-ek vannak a sprite-hoz rendelve. Szintén kivilágosítva figyelhetőek meg a Castban ezek a Behavior (ikon a jobb-alsó sarokban) típusú script member-ek 33 Movie script a Cast-ban. Figyeljük meg, hogy különbözik ikonja a Behavior típusú script ikonjától. Egy egyszerű Behavior script. Amint látjuk ez a script 3 handler-t tartalmaz, melyek közül az egyikben egy go parancsot is láthatunk, mely egy „hang1” nevű movie-ra ugratja a programot. 34 5. Változók használata 5.1 Lokális és globális változók A Lingo-ban alapvetően kétféle változót használhatunk: lokálist és globálist. Ez általában a programozási nyelvek többségében így van, de mégis fontos megérteni, hogy a hol használható

fel az egyiknek illetve másiknak az értéke. Egy lokális változó értékét csak az adott handler-en belül és annak is csak egyszeri lefutása alatt használhatjuk fel. Amint a handler lefutott a változó megszűnik létezni Gyakori tévedés, hogy lokális változók hatásterének a script-et gondolják. Ez abban az esetben igaz is, ha az adott script csak egyetlen handler-t tartalmaz, de amennyiben több is van benne, akkor csak ott létezik, ahol deklaráltuk. A globális változók értelemszerűen tehát minden handler számára olvashatóak és írhatóak, de csak amennyiben az adott handler-ben belül elérhetővé teszem, azaz deklarálom. Ellenkező esetben lokális változóként fogja kezelni A kétféle deklaráció szintaktikája a következő: global <változó neve> local <változó neve> Fontos megjegyezni, hogy a lokális változók deklarálása elhagyható, hiszen amennyiben egy addig nem létező kifejezésnek értéket adok, az automatikusan

lokális változóvá válik. A handler-ek tárgyalásánál azt láthattuk, hogy utasítások csak a handler keretein belülre kerülhetnek. Ez alól képez kivételt, néhány egyéb parancs között, a global utasítás. Ha például egy script-ben lévő handler-ek közül többen használják ugyanazt a globális változót, akkor a global parancsot az első handler elé írjuk és így olyan hatást eredményez, mintha az összes azt követő handler-ben deklaráltam volna. Ilyenkor tehát mindig a global után következő handler-ekben fejti ki hatását, így ha például a második és harmadik handler közé írom, akkor a harmadiktól lefelé lévő handler-ek használhatják a változót. 35 Nézzünk erre egy egyszerű példát: on mouseUp global x y = 20 go x+y end global szam on novel szam = szam + 1 end on csokkent szam = szam – 1 end A „szam” nevű globális változót az első handler után deklaráltam, hogy mindkét azt követő handler használhassa,

míg az x-et az első handler-en belül, hiszen csak itt használom. Az y változót sehol sem deklarálom, mert az értékadással rögtön létrejön, mint lokális változó. 5.2 Rendszerváltozók Az előző fejezetben megismerhettük, hogy hogyan használhatunk különböző változókat a Lingo-ban. Azonban léteznek ezeken kívül egyéb változók is, melyeket a Director automatikusan hoz létre és ad nekik értékeket. Ezek vezérlik működését és jegyzik meg különböző állapotait. Az ilyen változókat rendszerváltozóknak vagy rendszertulajdonságoknak szoktuk nevezni. Némelyik rendszerváltozó csak olvasható, de vannak olyanok is, melyek egyben írhatóak is, így tudjuk velük mi magunk is alakítani programunkat. Az egyes rendszerváltozókra mindig így hivatkozunk: the <rendszerváltozó neve> Nézzünk néhány olyan rendszerváltozót, melyet csak olvasni tudunk:  the Frame – A lejátszófej pozícióját tartalmazza.  the mouseH – A

kurzor X pozícióját jegyzi a Stage bal széléhez képest .  the mouseV – A kurzor Y pozícióját tárolja a Stage tetejéhez viszonyítva.  the currentSprite – azt adja vissza, hogy az adott Behavior script éppen melyik sprite-hoz rendelve fut. 36 Az alábbi rendszertulajdonságok nem csak olvashatóak, hanem írhatóak is:  the windowType – Az alkalmazásunk ablakának típuskódja van benne.  the stageColor – A Stage aktuális háttérszínének kódját tartalmazza.  the centerStage – Azt adja meg, hogy programunk a monitor közepén helyezkedik-e el vagy sem. 5.3 Példák: on exitFrame go the Frame end Ez a programrészlet egyszerűen megállítja a lejátszófejet, hiszen ahányszor megpróbálna a lejátszófej kilépni a frame-ről (exitFrame esemény), mindig kiadunk egy olyan go utasítást, melynek paramétere a the Frame rendszerváltozó. Mivel ez mindig azt a számot tartalmazza, ahányadik frame-en a lejátszófej éppen

van, ezért ez a parancs mindig visszaküldi az enterFrame állapotba, és 1 / fps idő múlva újra erre a handler-re érkezik. on mouseUp global honnan honnan = the Frame go 3 of movie „hang1.dir” end Ez a program egy másik – „hang1.dir” – movie-ra ugratja programot és a lejátszófejet, azon belül is a 3. frame-re Azonban azt szerettem volna megoldani, hogy mikor a felhasználó visszatér ebbe a movie-ba, akkor pontoson onnan folytatódjon minden, mint mielőtt elhagyta. Ehhez egy „honnan” nevű globális változóban megjegyeztem, az aktuális frame-et az ugrás pillanatában és a másik movie-ban az alábbi paranccsal automatikusan ide tér vissza: on mouseUp global honnan go honnan of movie „01-Merkur.dir” end 37 6. Hivatkozás objektumtulajdonságokra 6.1 Sprite és Member szintű tulajdonságok Az animációkról szóló fejezetben már részben érintettem az objektumtulajdonságok témakörét. Megtudhattuk mi a különbség a sprite és

member szintű tulajdonságok között. Arról azonban még nem esett szó, hogy Lingo-ban, hogyan kezelhetem ezeket, hogyan hivatkozhatok tulajdonságokra. A tulajdonságok azonosítására természetesen annak neve szolgál. Ezek egy része megegyezik a Property Inspector-ban találhatókkal, mások különböznek. Például a láthatóság mindkét felületen „Blend”, de a horizontális pozíció az Inspector-ban „x”, a Lingo-ban pedig „locH” néven tudunk rá hivatkozni. Új problémát vet fel az egyes sprite-ok azonosítása. A rendszer nem ad lehetőséget a sprite-ok elnevezésére. Annak a csatornának a számával tudjuk azonosítani, amelyiken vannak. Ez így első hallásra egyszerűen hangzik, de bonyodalmakat okozhat, hogy egy csatornán különböző frame-intervallumokon más és más sprite-ok lehetnek. Az alábbi ábra egy ilyen esetet mutat: A 20. csatornán 1-től 9-ig és 11-től 15-ig más sprite van Ezeket tehát ugyanúgy, a 20-as számmal

azonosítja a Lingo. A szabály az, hogy a hivatkozás mindig arra a sprite-ra értendő, amelyik felett van éppen a lejátszófej. A szintaktikát tekintve kétféle módszer is használható a Lingo-ban. Az első az angol nyelvtanra jobban emlékeztető, a második pedig a Java szintaktikájához igen hasonló pontos rendszerű: the <tulajdonság neve> of sprite <száma> sprite(<száma>).<tulajdonság neve> 38 A member-ek azonosításánál mindenképpen könnyebb dolgunk van. Az egyes member-ek száma egyedi a Cast-on belül, ráadásul mint azt több eddig már bemutatott Cast-ban is láthattuk nevet is kaphatnak. Természetesen ha nem csak egyetlen Cast van, akkor a Cast neve is kell az azonosításhoz. A kétféle szintaxis használatára itt is lehetőség van: the <tulajdonság neve> of member <száma vagy neve> member(<száma vagy neve>).<tulajdonság neve> Megadott Cast-ban lévő member tulajdonsága: the

<tulajdonság neve> of member <száma vagy neve> of castLib <cast neve> member(<száma vagy neve>, <cast neve>).<tulajdonság neve> 6.2 Példák: on mouseEnter the blend of sprite 8 = 10 end on mouseLeave the blend of sprite 8 = 0 end Ez a rövid script az alaphelyzetben láthatatlan shape-hez van rendelve, mely a 8. csatornán van. Mikor felé ér a kurzor (mouseEnter) halványan megjelenik (blend: 10%), amikor elhagyja (mouseLeave), akkor pedig visszaállítja láthatatlanra (blend: 0%). on ellenoriz if jo = 1 then the text of member 60 = "Gratulálok! Sikerült kiraknod a képet!" the visible of sprite 40 = true end if end Egy feltételtől függően, megváltoztatja a 60. member-en lévő üzenő field szövegét a gratulációra (text: „Gratulálok”) és az ebből készült 40-es sprite-ot megjeleníti (visible: true). 39 7. Elágazások a Lingo-ban Aki foglalkozott már programozással annak nem szükséges megmagyarázni,

hogy mire valóak az elágazások. Egy interaktív program esetében ezek használata fokozottan előtérbe kerül. Képesek lehetünk tehát például egy handler-en belül több lehetséges parancssorozat közül választani attól függően, hogy felhasználói oldalról milyen interakciók érkeztek. 7.1 If elágazások Az if elágazások mindig egy feltételt vizsgálva döntik el merre haladjon tovább a program. Ahhoz, hogy feltételt készítsünk szükségünk van összehasonlító – comparison – operátorokra. Ezek a következők: < (kisebb), <= (kisebb vagy egyenlő), <> (nem egyenlő), > (nagyobb), >= (nagyobb vagy egyenlő), = (egyenlő). Nézzük meg az if elágazás szintaktikáját egy konkrét példán keresztül: on mouseUp c = integer(the text of member „kora”) if 18 > c then the text of member „kiir” = „Túl fiatal vagy a program megtekintéséhez!” else go 12 end if end A handler-ben lévő elágazás megvizsgálja, hogy a

„kora” nevű szöveg member-be milyen szám lett beírva (ehhez előtte számot csinálunk a string típusú adatból a „c” változóba). Ha 18-nál kisebb, akkor kiírja a megfelelő szöveget, ha viszont legalább 18 (tehát bármilyen egyéb esetben), akkor átugrik a 12. frame-re Más programnyelvekben megszokhattuk, hogy a feltételt zárójelezni kell, a Lingo-ban viszont ez nem kötelező, de a jobb átláthatóság kedvéért persze alkalmazható. A másik szokásos hiba a „then” lehagyása a feltétel végéről Valamiért a Lingo fejlesztői ragaszkodnak ehhez a feleslegesnek tűnő szócskához. 40 Szükség lehet még arra is, hogy az elágazás else ágát további részekre oszthassam. Ezt persze megtehetném újabb if-ek beágyazásával is, de létezik erre elegánsabb módszer is, az else if útvonal. Bővítsük az előbbi programunkat így: on mouseUp c = integer(the text of member „kora”) if 18 > c then the text of member „kiir” =

„Túl fiatal vagy a program megtekintéséhez!” else if 34 > c then go 22 else go 12 end if end Ebben az esetben megkülönböztetjük a 18-tól 33-ig lévő korosztályt, őket egy másik, a 22. frame-re küldjük Újabb igényként léphet fel, hogy valamely programrész csak több feltétel egyidejű teljesülésekor fusson le. Erre szolgál az „and” logikai operátor Több feltétel közül csak az egyiknek kell teljesülnie, ha „or” operátor van köztük. A harmadik logikai művelet a negáció. Ehhez a feltételt egy „not(<feltétel>)” keretbe kell tennünk Ezekre mutat példát a következő handler: on enterFrame global nev if (the Frame = 12) and (nev = ”Jakab”) then the text of member 60 = „Sajnálom, ezt az oldalt Jakab nem nézheti meg.” end if if (the Frame = 22) and ((nev = ”Juli”) or (nev = ”Mari”))) then the text of member 60 = „Sajnálom, ezt az oldalt Ti nem nézhetitek meg.” end if if (the Frame = 32) and not(nev =

”Jakab”) then the text of member 60 = „Sajnálom, ezt az oldalt csak Jakab nézheti meg.” end if end 41 7.2 Case elágazások Ha egyetlen kifejezés értéke alapján rengeteg irányba szeretnék elágazni, akkor rendkívül nehézkessé válhat a rengeteg else if használata. Ennek megkerülésére készült a case típusú elágazás. Az elágazás fejébe itt nem egy feltételt kell írnom, hanem valamilyen értéket tároló vagy értéket visszaadó kifejezést: változót, tulajdonságot, függvényt. Az egyes útvonalakat a lehetséges értékekkel határozom meg, melyek mellesleg bármilyen adattípusban lehetnek. Ha egyik esetnek sem felel meg az érték, akkor az „otherwise” eset parancsait hajtja végre, amennyiben írtunk ilyet. Ha nem akkor egyik ág sem fut le. A case elágazás szintaktikája a következő: case <vizsgálandó érték> of <lehetséges érték>: <utasítások> <lehetséges érték>: <utasítások>

<lehetséges érték>: <utasítások> otherwise: <utasítások> end case Szemben sok programnyelv hasonló struktúráival itt nem kell arra ügyelnünk, hogy a teljesülő eset után következő továbbiakat ne hajtsa végre. A Lingo mindenképpen csak a case egyik ágát futtatja le. Általában igaz mindkét elágazás típusra, hogy ha az adott útvonal csak egyetlen parancsot tartalmaz, akkor azt írhatjuk a feltétellel vagy esettel egy sorba. Például: if a = 1 then b = 2 else if a = 2 then b = 8 else b = 0 42 7.3 Példák: on exitFrame if (the mouseV > 530) and (the mouseV < 572) and (the mouseH > 115) and (the mouseH < 705) then arany = float(the mouseH - 115)/620 the locH of sprite 5 = 115 - arany * 800 end if end A feltételben azt határozom meg, hogy csak akkor mozogjon az 5-ös sprite-on lévő menüsor, ha az egér az adott aktív terület felett van. A menü oldalirányban mozog, ezért először kiszámolom a horizontális

elhelyezkedésének arányát a felület szélességéhez képest, majd ennek arányában helyezem el alatta a menüsort. A float típus biztosítja, hogy az arány változóba tört szám kerülhessen. 115 a felület bal szélének x koordinátája, 620 pedig a szélessége. 800 a menüsor szélessége on hyperlinkClicked me, data, range case data of "fooldal": go to movie "Fooldal.dir" "napunk": go to movie "00-Nap.dir" "bolygok": go to movie "001-Bolygok.dir" "kisbolygok": go to movie "10-Kisbolygok.dir" () "kereses": go to movie "14-Kereses.dir" "kilepes": quit end case end Ez a script lekezeli a hyperlink-ek valamelyikén esett kattintást. Azt, hogy melyikre kattintott a felhasználó a „data” nevű változóba kapjuk meg. A legegyszerűbb módja annak, hogy ezeket az értékeket parancsokkal párosítsam, a case elágazás használata volt. Ennek a

megvalósítását látjuk 43 8. Ciklusok alkalmazása Az előző fejezetben megismerhettük, hogyan tudunk bizonyos feltételtől vagy feltételek logikai kapcsolatától függően programrészeket futtatni. A másik tipikus vezérlési szerkezet, mikor megmondjuk azt is, hogy hányszor kell lefuttatni az adott programrészt. Erre valók a ciklusok Segítségükkel elérhetjük, hogy az egyes programrészletek ismétlődjenek. Egy ciklus mindig addig fut, ameddig egy adott feltétel teljesül vagy ameddig erre külön megszakító utasítást ki nem adok. A Lingo egyik jelentős hiányossága is itt tapasztalható, miszerint elöl tesztelő illetve számláló ciklus van, de a hátul tesztelő valamiért kimaradt a nyelvből. Ez adott esetben felesleges munkát adhat a fejlesztőnek. 8.1 Repeat While ciklus Ez a vezérlési szerkezet az egyszerű elöl tesztelő ciklusok elvén működik. A ciklusfejben meghatározok egy feltételt, melynek teljesülése esetén ciklus tartalma,

a ciklusmag parancsai lefutnak. Ezek után a program visszatér a ciklusfejhez és megint megvizsgálja a feltételt. Ha igaz, megint lefut és ezt egészen addig csinálja, ameddig a feltétel teljesül. Mikor először hamis, azonnal kilép a ciklusból anélkül, hogy még egyszer lefuttatná. Tekintsük meg a vezérlés szintaktikáját: repeat while <feltétel> utasítások. end repeat Szükség lehet azonban arra is, például egy véletlenül beálló végtelenciklus elkerülésére, hogy magunk is kiléphessünk a ciklusból. Erre az exit repeat parancs szolgál. Erre mutat példát a következő programrészlet: repeat while the locH of sprite 8 < 300 if the blend of sprite 8 = 0 then exit repeat the locH of sprite 8 = the locH of sprite 8 + 1 updateStage end repeat 44 Ez a program egy olyan animációt készít, amely ha a 8-as sprite x koordinátája 300-nál kisebb, akkor addig elmozgatja jobbra. Kivétel, ha le van véve a láthatósága (blend) 0ra

Megjegyzés: Felfigyelhettünk a programban egy új – attribútum nélküli – parancsra, az updateStage-re. Ez a parancs, mint nevében is benne van, a képernyő frissítésére szolgál. Hogy miért volt itt erre szükségem? Gondoljuk csak meg, hogy a Director alaphelyzetben csak frame mozgáskor (enterFrame előtt) frissíti a képernyőt. Márpedig amíg a ciklus fut, addig a lejátszófej sem mozdul. Ahhoz tehát, hogy az 1 pixelenkénti mozgás animációként látszódjon, ilyenkor rendre ki kell adnom az updateStage parancsot. Fontos lehet tudni, hogy az így készített animációk gyorsasága erősen függ a processzorteljesítménytől, tehát nem igazán optimalizálható időben, ráadásul közben események sem mehetnek, tehát interakciók sem. Ezért nem igazán ajánlott az ilyen animációk használata. 8.2 Repeat With ciklus Egy ciklus esetében a leggyakoribb elvárás, hogy egy utasítássorozatot valahányszor végezzen el egymás után, valamint, hogy

mindig tudjam éppen hányadik körét rója a szerkezet. Ehhez egy egyszerű elöl tesztelő ciklus esetében külön energiát kell fordítani egy változó növelésére és vizsgálatára. Ezt a műveletet egyszerűsíti meg a számláló típusú ciklus. Itt már a ciklusfejben létrejön a változó, annak kezdőértéke, meghatározhatjuk a feltételt, aminek teljesülnie kell, valamint a műveletet is, melyet minden ciklusban végrehajt a változón. A Lingo-ban ezt a repeat with ciklus végzi, kissé egyszerűsített módon. Meg kell adnunk a ciklusváltozó nevét, kezdő és végértékét – tehát nem feltételt – és azt, hogy nőjön vagy csökkenjen értéke egyel ciklusonként – tehát egyéb művelet megadása nem lehetséges. Elég zavaróak ezek a hiányosságok, még ha programból ezeket korrigálni tudjuk is. A szerkezet szintaktikája a következő: repeat with <ciklusváltozó> = <kezdőérték> to vagy down to <végérték> utasítások.

end repeat Ha to van a két érték között, akkor növeli a ciklusváltozót, ha down to, csökkenti. 45 8.3 Példák: repeat with j=1 to length(szoveg) if char j of szoveg = char 1 of szo then jo = 1 repeat with k=1 to szohossz if not(char j+k of szoveg = char 1+k of szo) then jo = 0 exit repeat end if end repeat if jo = 1 then append talalat, line 1 of szoveg * append ugras, word 1 of line 2 of szoveg * append ugras, word 2 of line 2 of szoveg * exit repeat end if end if end repeat Ez a programszelet egy szót keres egy adott szövegben. A „szoveg” változó tartalma az amiben keresek, a „szo” tartalma amit keresek, a „szohossz” annak hosszát tárolja. A külső ciklusban rendre addig vizsgálom a szöveg karaktereit, amíg az meg nem egyezik a keresendő első karakterével. Ekkor belépek egy belső ciklusba, mely a keresendő szó karakterszáma mínusz egyszer fut le és a másodiktól kezdve hasonlítja össze a karaktereket. Amint valamelyik nem egyezik

visszaírja a ciklus előtt 1-re állított „jo” nevű változó értékét 0-ra és kilép a ciklusból. Ha az összes karakter egyezett, akkor 1 marad az érték és így halad tovább. Végül megvizsgálom ezt a változót és ha megtalálta, akkor a teljes szöveg első 2 sorában lévő járulékos információkat két tömbbe* mentem. * A tömbökről bővebben a következő fejezetben írok 46 9. Tömbváltozók Ahogy egyre bonyolultabb programokat írunk, annál nehézkesebb rohamosan növekvő adatmennyiségünket változókban tárolni. A tömbök erre a problémára nyújtanak megoldást, mert szerkezetük alkalmas arra, hogy ne csak egyetlen értéket tárolhassunk bennük. Gyakorlatilag korlátlan számú elem tárolható benne, határt csak a memóriánk szabhat. 9.1 Egyszerű és asszociatív tömbök Azt állítottuk, hogy egy tömbben számos értéket tárolhatunk. Szükségünk van tehát valamilyen azonosítóra, mellyel hivatkozva olvashatjuk vagy

írhatjuk ezeket külön-külön. Az egyszerű tömbök esetében ez egy szám, melyet az elem létrejöttekor automatikusan megkap az elem, ezt hívjuk az elem indexének. A legtöbb programnyelvben ez a számozás nullával indul, tehát például az utolsó elem indexe az elemszám mínusz eggyel azonos. A Lingo ezzel szemben 1-gyel kezdi az indexelést, mely ha valaki sokat programozott már más környezetekben, akkor igen nehezen megszokható. Nézzük hogyan hozhatok létre ilyen tömböt: valtozo = list() vagy valtozo = [] Így üres tömbök jöttek létre, de lehetőségem van egyből értékeket is tenni bele: valtozo = list(28, 2, true, ”Jakab”) vagy valtozo = [28, 2.23, true, ”Jakab”] Amint látható a példában egy tömb elemeinek típusának nem kell megegyeznie, éppúgy lehet egész (integer), mint tört (float), logikai (boolean) vagy szöveg (string). Hivatkozni pedig, mint említettem indexükkel tudunk az elemek értékére: masvaltozo = valtozo[3] Így a

masvaltozo-ba a valtozo 3. eleme, azaz a true kerül 47 A számokkal való azonosításnak számos előnye mellett azonban hátrányai is vannak. Például az, hogy mikor írjuk programunkat fejben kell tartanunk, hogy hányadik elemhez, melyik értéket rendeltem. Nyilvánvalóan sokkal könnyebben jegyeznénk meg ebben az esetben valamilyen azonosító szövegeket. Ezt valósítják meg az asszociatív tömbök. Az ilyen adatszerkezeteknél tehát már nem csak indexükkel, hanem valamilyen szöveges azonosítójukkal is elérhetem az elemeket. A Director ezeket nevezi a tömb tulajdonságainak, erre utal az angol elnevezés is: Property List. Az ilyen tömbök létrehozásának módja a következő: valtozo = [#nev: „Zahorecz”, #eletkor: 24, #ferfi: true] A tanultak alapján tehát az alábbi két kifejezés ugyanazt az eredményt adja: masvaltozo = valtozo[2] masvaltozo = valtozo[#eletkor] 9.2 Parancsok és függvények tömbökhöz Ha dinamikusan szeretnénk

használni tömbünket, akkor természetesen nem elég azt létrehozni, műveleteket is el kell tudnom végezni rajta. A Lingo a következő parancsokat szolgáltatja tömbökhöz:  Beszúrás: addAt <tömb neve>, <index>, <érték> vagy <tömb neve>.deleteAt(<index>, <érték>)  Felülírás: setAt <tömb neve>, <index>, <érték> vagy <tömb neve>[<index>] = <érték>  Törlés: deleteAt <tömb neve>, <index> vagy <tömb neve>.deleteAt(<index>)  Hozzáadás tömb végéhez: append <tömb neve>, <érték> vagy <tömb neve>.append(<érték>) 48 További segítséget nyújt a tömbök kezelésében a Lingo néhány függvénye. Természetesen ezeket akár magunk is megprogramozhatnánk, de nagyban felgyorsíthatják munkánkat ezek használata.  Elemszám kérése: count(<tömb neve>)  Érték keresése egyszerű tömbben:

getPos(<tömb neve>, <érték>) A függvény az érték indexét adja vissza.  Érték keresése asszociatív tömbben: getOne(<tömb neve>, <érték>) A visszatérési érték az érték tulajdonsága.  Tulajdonság keresése asszociatív tömbben: findPos(<tömb neve>, <tulajdonság>) Az adott tulajdonság indexét adja vissza. 9.3 Példák: on startMovie () kerdeslista = [] repeat with i = 1 to 30 append kerdeslista, i end repeat end A handler-nek ez a része feltölti a „kerdeslista” nevű tömbváltozót 1-től 30-ig számokkal. on tovabb () aktszam = random(count(kerdeslista)) akt = kerdeslista[aktszam] deleteAt kerdeslista, aktszam () end Ez a programrész dönti el, hogy melyik legyen a következő kérdés (véletlenszerűen) a számát beleteszi értékét az „akt” nevű változóba, majd törli a kiválasztott listaelemet. 49 10. Függvények a Lingo-ban 10.1 Események használata függvényként Gyakran

előfordul, hogy egy nagyobb programrész, változatlan formában több handler-ben is megjelenik. Ezektől a felesleges többletmunkáktól kímélhetnek meg minket a függvények használata. Paraméterek használatával pedig dinamikusan is alkalmazhatom őket. Lehetnek azonnali hatással is programunkra, de lehetőséget ad a Lingo arra is, hogy érték visszaadására is képesek legyenek. Bár a fejezet címe függvényeket említ, de valójában ezek nem mások, mint az 4.1 fejezetben, az eseményorientáltságnál tárgyalt user defined események Arról van szó tehát, hogy küldenünk kell egy üzenetet, ha szükséges paraméterekkel együtt, és azt a hagyományos módon egy handler-ben kell lekezelnünk, az esetleges paraméterek fogadásával. Ügyelnünk kell természetesen arra, hogy az 4.3 fejezetben tárgyalt script hierarchia szerint olyan script-be írjuk a handler-t, melyhez az esemény biztosan el fog jutni. Éppen ezért, a bonyodalmak elkerülése végett,

legtöbbször az ilyen „függvényeket” movie script-be szoktuk írni, ahova biztosan eljut az esemény. Értelemszerűen ez csak azokra az esetekre igaz, mikor az üzenethez csak egyetlen handler tartozik. Az üzenetküldés legegyszerűbb szintaktikája, mikor egyszerűen az esemény nevével generálom a hívást (az 4.3 fejezet ábráján a bal oldalon látható) Nézzünk egy egyszerű példát arra, amikor egy ilyen módon meghívott függvény értéket ad vissza: on mouseUp x1 = the locH of sprite 5 x2 = the locH of sprite 8 tav = szamol(x1, x2) the text of member „kiir” = „A sprite-ok horizontális távolsága:” && string(tav) end on szamol a, b dif = b - a return dif end 50 Az üzenetküldés további módjai a sendSprite illetve a sendAllSprites parancsok. Az előbbi egy meghatározott sprite-nak küldi az üzenetet, az utóbbi pedig az összes aktuális aktív sprite-hoz juttatja el az eseményhívást. Erre a script hierarchia miatt lehet

szükség, hiszen mint már említettem az események oldalirányban nem terjednek, így sprite-ról sprite-ra sem. Ezen két parancs szintaktikája a következő: sendSprite (<sprite száma>, #<esemény neve>, <paraméterek>) sendAllSprites (#<esemény neve>, <paraméterek>) Fontos megjegyezni, hogy míg az egyszerű üzenetküldéses módszernél a member script-ekhez sosem juthat el az esemény, addig az ezekkel a parancsokkal indított üzenetek, ha a sprite nem kezelte le, eljutnak a member script-ekhez is. 10.2 A Lingo néhány saját függvénye Egy igazán igényes programnyelvből nem hiányozhatnak a programozó dolgát jelentősen megkönnyítő, különféle segédfüggvények sem. Márpedig a Lingo igazán igényesnek mondható és így természetesen rengeteg ilyen függvénnyel lát el minket. Párat már megismerhettünk a „Tömbváltozók” fejezetben Vannak azonban egészen más jellegű függvényei is, ezek közül szeretnék

egy-két érdekesebbet, hasznosabbat bemutatni:  random(<pozitív egész szám>) Ez a függvény egy véletlen számot ad vissza úgy, hogy a lehetséges legkisebb értéke 1 lesz, a legnagyobb pedig a megadott szám. Ha tehát például 0-val kezdődő számsorból akarunk véletlenszerűen választani, akkor a maximum értéknél egyel nagyobb számot kell a függvény bemeneti értékének megadni, majd ki kell vonnunk kimenetéből egyet.  sprite(<száma>).intersects(<másik sprite száma>) Akkor lehet segítségünkre ez a függvény, ha két sprite ütközését szeretném vizsgálni. Ha van közös pontjuk, akkor a kimenet true, ha nincs false.  charToNum(<karakter>) és numToChar(<szám>) Az előbbi az adott karakter ASCII kódját adja vissza, az utóbbi pedig fordítva. Sokszor szükségünk van ezekre a függvényekre, mert billentyűeseménykor a the keyCode rendszerváltozóból az utoljára lenyomott billentyű ASCII kódját

tudom kiolvasni. 51  rollOver(<sprite száma>) Ez a függvény azt adja vissza, hogy az adott sprite felett van-e éppen a kurzor vagy sem. (true vagy false) Megjegyzés: hasonló problémák megoldására van a the rollOver rendszerváltozó, melyben mindig annak a sprite-nak a száma van, amelyik felett éppen a kurzor van. 10.3 Példák: on inaktiv kezd, veg repeat with i = kezd to veg the visible of sprite i = false end repeat () end Mivel gyakran volt szükségem bizonyos egymás mellett lévő sprite-ok inaktívvá tételére, ezért készítettem ezt a függvényt, mely egy ciklus segítségével, a paraméterként átadott intervallumban lévő sprite-ok láthatóságát leveszi. on enterFrame () repeat with i=27 to 38 the locH of sprite i = 112 + random(60) the locV of sprite i = 161 + random(251) end repeat () end Azért felel ez a handler, hogy a 27-től 38-ig lévő 12 képdarabot a 113-as és 172-es horizontális, illetve a 162-es és 412-es vertikális

koordináták között véletlenszerűen helyezze el a frame-re érkezéskor. Ehhez használtam a Lingo random() függvényét 52 11. Fájlkezelés Programunk elkészültékor, a kimenet mindenképpen egy olyan alkalmazás lesz, mely önmagát módosítani képtelen. Így tehát az eddig megismert eszközeinkkel nem vagyunk képesek arra, hogy alkalmazásunk két indítása között bármi megváltozzon. Az eddigi futtatásoktól minden részében független lesz programunk, pedig számos olyan igény lehet, mely ezzel szemben álló. Például egy ismert felhasználó nevén szólítása vagy egy játék legjobb eredményeinek tárolása ilyen lehet. Ezeknek megvalósítására szolgál a külső fájlok használata. Az ezekbe való írás, a későbbi kiolvasás segítségével bármit módosíthat programunk menetén. 11.1 Egyszerűsített fájlkezelés Pref-ekkel A legegyszerűbb módja a programon kívülre írásnak vagy az onnan való beolvasásnak a pref-ek használata. A

pref-ek valójában txt típusú fájlok, melyek mindig a futó alkalmazásunk mellett lévő „Prefs” könyvtárban tárolódnak. EXE esetében tehát közvetlenül mellette, DIR (dokumentum) fájl esetében pedig a Director.exe mellett Ha shockwave (DCR) formátumba exportáltam egy böngésző számára, akkor pedig az ő Plug-In könyvtárában hozza létre a „Prefs” mappát. (Ezekről az exportálási lehetőségekről bővebben a „Programunk publikálása” fejezetnél írok.) Nézzük tehát a Pref-ek írásának és olvasásának módját: setPref <pref neve>, <szöveg> Ez a parancs írja bele a pref-be a meghatározott szöveget. Ha még nem létezik a pref fájl, akkor létrehozza és ha még a Prefs könyvtár sem létezik, akkor azt is getPref(<pref neve>) Ez a függvény visszaadja a paraméterként megadott pref tartalmát. Ha nem létezik a pref, amire hivatkozunk, akkor a visszatérési értéke „void”. A következő handler egy pref

végéhez tesz hozzá újabb szöveget: on mouseUp setPref „nevek”, getPref(„nevek”) && RETURN && „Jakab” end 53 11.2 A FileIo extra használata A Lingo alap utasításkészletébe a magasabb szintű fájlkezelés nem került bele. A Director-hoz azonban installáláskor kapunk néhány úgynevezett extrát (a fájlok kiterjesztése: x32), melyeket fejlesztés közben, dir-ben dolgozva a Lingo automatikusan használ, exportáláskor azonban ezt is külön bele kell integráltatnunk a kimenetbe. Egy ilyen extrában (FileIox32) vannak a magasabb szintű fájlkezelés parancsai is. Ezzel a készlettel gyakorlatilag minden megvalósítható, amit már más nyelveknél megszokhattunk. A következő utasításokat kell ismernünk a FileIo extra használatához: <fájlmutató> = xtra("FileIo").new() Fájlpointer létrehozása. <fájlmutató>.createFile(<elérési út / fájlnév>) Fájlpointer beállítása a megadott fájl

elejére. <fájlmutató>.status() Fájlpointer állapotáról ad információt. Például ha létező fájlra mutat akkor –122 a visszatérési értéke. <fájlmutató>.openFile(<elérési út / fájlnév>, <megnyitás kódja>) A megadott fájl megnyitását végzi. A megnyitás kódja 1 ha csak olvasni akarunk a fájlból, 2 ha csak írni bele és 0 ha mindkettőt. <fájlmutató>.writeString(<szöveg>) Megadott szöveg beírása a fájlba. <fájlmutató>.readFile() Ez a függvény a fájl teljes tartalmát adja vissza. delete(<fájlmutató>) Ezzel az utasítással a fájl teljes tartalmát töröljük. <fájlmutató>.closeFile() A fájl bezárása szolgáló parancs. 54 Itt ismertetnék egy függvényt, mely bár nem a FileIo extra része, mégis szervesen kapcsolódik a témakörhöz. A függvény szintaktikája a következő: getNthFileNameInFolder(<elérési útvonal>, <fájl sorszáma>) Az elérési útnál

meghatározott könyvtárban lévő, alfanumerikus sorrendben megadott sorszáma alapján azonosított fájl nevét adja vissza. 11.3 Példák: repeat with i=1 to i+1 f = getNthFileNameInFolder(the moviePath & "szovegek", i) if f = EMPTY then exit repeat flista[i] = the applicationPath & "szovegek" & f end repeat repeat with i=1 to count(flista) fajlmutato = xtra("FileIO").new() fajlmutato.openFile(flista[i], 1) szoveg = fajlmutato.readFile() fajlmutato.closeFile() repeat with j=1 to length(szoveg) (ez az a programrész, ami ciklusok fejezet példaprogramja volt!) end repeat end repeat Ez a programrész, egy részben már ismertetett handler-ben van, a szövegkeresést végzőben. A ciklusok fejezeténél lévő részletből még nem derült ki, hogy a szövegkeresést gyakorlatilag egy mappa összes fájljában végzi. Az első ciklus beleteszi egy tömbbe az alkalmazás elérése alatti „szovegek” nevű mappában lévő összes fájl

nevét. (Az alkalmazás elérését a the moviePath nevű rendszerváltozó tárolja.) A második ciklus végigmegy ezen a tömbön és rendre megnyitja a következő fájlt, beolvassa a „szoveg” nevű változóba tartalmát, majd jön a már ismert ciklus, mely ebben keresi az adott szót. 55 12. Hangok használata Az eddigi fejezetekben tárgyaltak mind programunk vizualitásával foglalkoztak. A bevezetőben azonban már említettem, hogy a multimédia egyik fő eleme a hangok, melyek használata nagyban befolyásolhatja programunk milyenségét. A Director igen nagy hangsúlyt fektet az ilyen médiák kezelésére. Képes a rendszer wav, aiff, au és a leggyakrabban használt mp3 típusú hangok importálására. Mindemellett számos lehetőségünk van arra, hogy minél kifinomultabb hangkezelést valósíthassunk meg. 12.1 Belső hangok használata A Director lehetőséget nyújt arra, hogy úgy kezelhessük a hangokat, mint bármilyen más szereplőt.

Importálás után tehát member lesz belőle a Cast-ban A Cast kivilágosított részén látható két hang-member. Ha ezeket a hangokat a hagyományos, Score által vezérelt módon szeretnénk lejátszani, akkor az erre a célra biztosított két extracsatornát kell használnunk. Ha ezekre húzom ki a member-t, akkor azokon a frame-eken fog szólni az adott hang, ahol a csatornán szerepel. 56 A képen a két Score által vezérelhető hangcsatorna látható. Az elsőn az 1 és 19 frame között szól hang, a másodikon a 9. és 39 között Az ilyen hangok lejátszási elve az, hogy ameddig a lejátszófej nem hagyja el az általa elfoglalt frame intervallumot, addig a lejátszás folyamatos. Ha tehát például a fenti példában a 10. frame-en leállítom a lejátszófejet, akkor mindkét hang folyamatosan, egymással párhuzamos fog lejátszódni. Azt, hogy ismétlődjön-e a hang egy member szintű tulajdonságban (Loop) adhatjuk meg. 12.2 Hangvezérlő parancsok A

Lingo rendkívül széles lehetőségekkel rendelkezik ezen a területen. Szinte minden a hangok befolyásolására támasztható igényünket kielégíti. Lehetőségünk van a teljes movie összes hangjának ki- illetve bekapcsolására, a the soundEnabled rendszerváltozó állításával. Sokszor lehet szükségünk arra, hogy megtudjuk egy adott csatornáról szól-e azon éppen hang vagy sem. Erre szolgál a soundBusy(<csatorna száma>) függvény A hangerő szabályzására több lehetőségünk is van. Ha az egész movie hangerejét akarjuk állítani, akkor a the soundLevel rendszerváltozónak kell 0 és 7 között értéket adnunk. Természetesen a csatornáknak külön is állíthatjuk a hangerejét a 57 the volume of sound <hangcsatorna száma> tulajdonsággal. Ennek 0 és 255 közötti értékeket adhatunk. A Lingo-val megoldhatjuk azt is, hogy a hang ne egyből teljes hangerejével kezdjen játszani, hanem fokozatosan érje el teljes erőségét.

Ehhez a sound(<hangcsatorna száma>).fadeIn(<milliszekundum>) parancsot kell kiadnom A sound(<hangcsatorna száma>).fadeOut(<milliszekundum>) utasítás pedig a megadott milliszekundum alatt halkítja le a zenét. További paraméterezési lehetősége a hangnak, hogy megadhatjuk, melyik hangszórón szóljon jobban. A the pan of sound <hangcsatorna száma> tulajdonságnak adott –100 és +100 közötti értéke ezt adja meg. –100-nál csak a bal, +100-nál pedig csak a jobb hangszóró fog szólni. Ez előző fejezetben azt már megtudhattuk, hogyan tudunk egy hang member-t a Score-ban meghatározott helyen megszólaltatni. Lehetőségünk van azonban arra is, hogy ezt is programból tegyük. A parancs szintaktikája a következő: puppetSound <hangcsatorna száma>, <member száma vagy neve> A parancs kiadása után rögtön megkezdődik a hang lejátszása, akkor is ha addig azon a csatornán más szólt eddig. Ha a member

paraméterhez 0-t írunk, akkor leáll az adott hangcsatorna. Az utasítás első paramétere nem csak 1 vagy 2 lehet, hiszen a Director valójában nyolc hangcsatornával rendelkezik. Mint láthattuk ebből a Score csak az első kettőt tudja kezelni extracsatornákként megjelenítve, a Lingo-val azonban mind a nyolcat vezérelhetjük. Sok új lehetőséget adhat, ha nem csak ez eddigiekben megismert belső, importált hangokat használjuk, hanem külső hangokat is lejátszunk. Erre szolgál a sound playFile <hangcsatorna száma>, <elérési útvonal / fájlnév> utasítás. Minden parancs és függvény ugyanúgy használható az így lejátszásra kerülő hangokra is, két kivételtől eltekintve. Ezekre később felhívom a figyelmet Ha egy csatorna hangját csak ideiglenesen akarjuk megállítani, akkor a sound(<hangcsatorna száma>).pause() parancsot kell kiadnunk, ha pedig újra szeretnénk elindítani, akkor a sound(<hangcsatorna száma>).play()

utasítással tehetjük ezt meg. Hasonló szintaktikájú a sound(<hangcsatorna száma>)rewind() parancs, mellyel az adott zenét az elejére állíthatom. 58 Szükség lehet arra, hogy egy általam meghatározott pozícióra állítsam az adott hangot. Ezt befolyásolhatom a sound(<hangcsatorna száma>)currentTime tulajdonságnak adott értékkel. Ilyen műveleteknél sokszor szükség lehet arra, hogy tudjuk milyen hosszú az adott hang. A the duration of member <száma vagy neve> nevű tulajdonságból ezt lehet kiolvasni. Fontos megjegyezni, hogy az imént említett két tulajdonság csak a belső, member-ként jelenlévő hangok esetében létezik. 12.3 Példák: on mouseUp sound playFile 3, "16-Hang/zene4.mp3" end Ez egy olyan gomb script-je, mely kattintásra elindítja a „16-Hang” nevű mappában lévő zene4.mp3-at on exitFrame me global hangkiir if hangkiir = 1 then the text of member "kiir" = "Hangerő:" &&

string(integer(float(the volume of sound 3) / 255 * 100)) & "%" end if go the frame end Ez frame script azért felel, hogy ha éppen a hangállító csúszkát mozgatom (a „hangkiir” változót ilyenkor az 1-re állítja), akkor a „kiir” nevű member-ben jelenjen meg, hogy éppen hány százalék a hangerő. 59 13. Videók megjelenítése A digitális videók lejátszása a leginkább hardverigényes része a multimédiának, ugyanakkor a leghatásosabb látványt is ezekkel érhetjük el. A Director ezen a területen mindig jóval a többi fejlesztői rendszer előtt jár. Ez nem véletlen, hiszen a videók méretükből adódóan, internetes megjelenés esetén nem igazán alkalmazhatóak. Ennek köszönhető a Flash lemaradása is, melyen némileg korrigáltak az MX-2004 verzióban. A Director a hagyományos videókon kívül kezelni tudja a QuickTime és a RealMedia fájljait is. Ezek természetesen igénylik az őket futtatni tudó programokat is, tehát

hiába importálok például egy QuickTime videót, ha nincs installálva a QuickTime lejátszó. Az AVI az egyetlen olyan videó típus, amelyet külső programok megléte nélkül is képes futtatni. Egy MPEG-et például alapértelmezetten az importáláskor QuickTime filmként tesz be a Cast-ba. Fontos megjegyezni, hogy a videókat, a hangokkal ellentétben, nem lehet ténylegesen integrálni programunkba. Az importálás után létrejövő member a Cast-ban gyakorlatilag csak egy link. Az adott fájl elérése a fileName nevű member tulajdonságban tárolódik. Ezt egyébként nem csak olvashatjuk, hanem írhatjuk is, így könnyedén tudunk programból „importálni”. Erre mutat egy egyszerű példát a következő programsor: the fileName of member „video” = the moviePath && „pelda.avi” 13.1 Videók beállításai member szinten  Video: Kikapcsolásakor nem jelenik meg a videó, csak a hozzátartozó hang, amennyiben azt a következő beállításban

megadom.  Audio: Ennek állításával határozhatom meg, hogy szóljon-e a videó hangja.  DTS (Direct To Stage): Bekapcsolásával teljesen átadhatjuk a videó vezérlését a számítógépen installált lejátszónak. Ez biztosítja a tökéletes megjelenítési minőséget, hátránya azonban, hogy ebben az esetben nem kerülhet semmi a videó fölé, hiába van feljebbi csatornán. 60  Controls (csak QuickTime member-nél): Aktivizálhatom a QuickTime saját vezérlőfelületét.  Paused: Mikor az adott videóra ér a lejátszófej, nem kezdi el egyből a lejátszást, hanem állva jelenik meg.  Loop: Akárcsak a hangnál, itt szabhatjuk meg, hogy ismételgesse-e videónkat ha a végére ért.  Preload (csak AVI típusnál): A movie indulásakor betölti a memóriába az adott videót. (Különben csak akkor teszi, mikor szerephez jut)  Streming (csak QuickTime member-nél): Akkor kezdi meg a lejátszást, amikor elegendő mennyiségű

adat töltődött be a folyamatos lejátszáshoz.  Playback: Ha az első opció, a Sync To Sound van beállítva, akkor a hangot mindenképpen folyamatosan lejátszva, a képkockákból szükség esetén kihagyva jeleníti meg a videót. A második esetben, a Play Every Frame (No Sound) kiválasztásakor mindenképpen lejátssza a videó összes frame-jét, a hangját viszont nem.  Rate: Akkor jelenik meg ez a beállítás, ha a Sync To Sound van kiválasztva. Ha Normal módban van, akkor úgy játssza a videót, ahogyan az eredetileg meghatározott. A Maximum hatására olyan gyorsan játssza le, ahogyan még éppen meg tudja jeleníteni az összes képkockát. A Fixed esetében megadhatunk egy fps számot Ilyenkor ezzel a sebességgel játssza a videót akkor is, ha ennek érdekében ki kell hagynia néhány kockát. 13.2 Videók vezérlése sprite szinten Egy videó legtöbb esetben nem sokat ér programunkban, ha azt a felhasználó nem tudja valamilyen szinten

vezérelni. Ezt legegyszerűbben a fent említett QuickTime Control paneljének használatával oldhatom meg. Azonban ha nem QuickTime videót használunk, vagy nem illik programunk arculatába az egyetlen lehetséges vezérlőfelület, akkor nekünk kell létrehoznunk egy ilyet. Ehhez azonban ismernünk kell azokat a sprite szinten megadható tulajdonságokat, melyekkel megtehetjük ezt. Ilyenek következők: 61  sprite(<videó sprite száma>).trackStartTime(<szám>) Ezzel a tulajdonsággal határozhatjuk meg 1/60 másodpercben, hogy hol kezdődjön az adott videó.  sprite(<videó sprite száma>).trackStopTime(<szám>) Ugyanazzal a mértékegységgel, a videó befejezésének időpontja adható meg.  the movieRate of sprite <videó sprite száma> A lejátszás sebessége, iránya határozható meg így. Ha az értéke 0, akkor áll a videó, 1-nél normális lejátszási sebességgel megy, 2-nél kétszeressel és így tovább. Ha

negatív számot adunk meg értékül, akkor visszafelé játszik  the movieTime of sprite <videó sprite száma> Azt tárolja, hogy hol tart éppen a videó lejátszása. Olvashatjuk és írhatjuk is ezt a tulajdonságot. 13.3 Példák: A Cast-jának egy része látható. Éppen a 40 member, egy QuickTime videó van kijelölve. Member beállításai megfigyelhetőek a Property Inspector-on 62 14. Programunk publikálása 14.1 Shockwave kimenet az Internethez A Director-ban készített programunk egyik lehetséges megjelenési platformja az Internet. Mint azt már korábban említettem nem ez a rendszer elsődleges profilja, de az újabb verziókban már viszonylag hatékonyan fejleszthetünk ilyen az irányba is. A Shockwave-be exportált movie kiterjesztése DCR lesz. Html-be ágyazva, egy böngészőben tudjuk megjeleníteni. A futtatásához a kliens gépen shockwaveplayer-nek kell installálva lennie. Ez a program a wwwmacromediacom/shockwawe/download webcímről

ingyenesen letölthető. Ilyenkor a böngésző a Plug-In felhasználásával jeleníti meg a programot. Fontos megjegyezni, hogy néhány Lingo parancs és függvény nem működik ebben a formában. Érdemes erre már a fejlesztés közben gondolni, mert rengeteg bosszúságtól kímélhetjük meg így magunkat. A shockwave kimenetünk paraméterezésére a File menü Publish Settings pontjában van lehetőségünk. Ezt az ablakot láthatjuk az alábbi képen:  A „Formats” fül alatt határozhatjuk meg a létrejövő fájljaim neveit, illetve azt, hogy mit tartalmazzon a létrejövő Html fájl.  A „General” részben a felbontás és a háttérszín adható meg. 63  A „Shockwave” menüpontnál meghatározhatjuk, hogy milyen lehetőségek jöjjenek elő jobbklikkre és hogy átméretezhető legyen-e.  A „Compression” fül alatt adhatjuk meg a kép- és hangtömörítés nagyságát.  A „Shockwave Save” pontban egyéb járulékos

információkat adhatunk programunkhoz. Az exportálás paramétereinek megadása után a Fájl menü Publish parancsára történik meg a kimenet létrehozása. Mind a shockwave fájl (DCR), mind a Html a DIR fájlunk mellé kerül. 14.2 Alkalmazás (EXE) készítése Lokális használathoz ajánlott alkalmazást készíteni programunkból. Az ilyen kimenetnek nincsen szüksége semmilyen lejátszó programra, kivéve a már említett QuickTime vagy RealMedia fájlokhoz. Az operációs rendszerrel szemben természetesen vannak elvárásai ezeknek az alkalmazásoknak is. Az EXE készítését a File menü Create Projector pontjánál tehetem meg. A kattintás után megjelenik egy ablak, ahol az összes szükséges fájlt hozzáadhatom programomhoz. Ezek a következők:  Maguk a programok, a DIR fájlok.  A külső Cast-ok, a CST fájlok.  A szükséges extrák, melyeket a programban használtunk. Igényelnek extrát például a fájlműveletek, a QuickTime videók

vagy a beillesztett Flash-ek. A hozzáadott elemek az ablak alján egy keretben jelennek meg. A sorrend állítható a jobb oldalon található „Move Up” és „Move Down” gombokkal. Természetesen ha Lingo-val navigáljuk programunkat, akkor ennek jelentősége megszűnhet. Azonban az mindenképpen fontos, hogy melyik DIR fájl van az első helyen, hiszen azzal indul majd programunk mielőtt még magunk vennénk kézbe a navigációt. 64 Ezt az ablakot tekinthetjük meg a következő ábrán: Az „Options” gombra kattintva a következő paraméterező ablakot kapjuk: 65 Az ablakban látható beállítások a következőkre szolgálnak:  Play Every Movie: A meghatározott sorrendben egymás után automatikusan lejátssza a movie-kat vagy csak ez elsőt.  Animate In Background: Ha nincs bejelölve, akkor megáll a lejátszás, amikor a felhasználó másik taszkra vált.  Options: Meghatározhatom, hogy „Full Screen” módban vagy ablakban fusson az

alkalmazás.  Stage Size: Itt adhatom meg, hogy igazodjon-e a Stage mérete az aktuális movie- hoz vagy mindig az első méreteit használja. A „Center”-t kiválasztva az ablakunk induláskor a monitor középen jelenik meg.  Media: Lehetőségünk van itt arra, hogy a Shockwave tömörítését felhasználjuk programunk méretének csökkentésére. Ne felejtsük el azonban, hogy ebben az esetben újra szüksége lesz a felhasználónak a shockwaveplayer jelenlétére.  Player: Magát az EXE-be integrált lejátszót tömöríthetjük itt. „Standard” módban nincs tömörítve, ha a „Compressed” a bejelölt, akkor az EXE indításakor néhány másodpercet majd várnunk kell indulásig, amíg kicsomagolja azt. A „Shockwave” kiválasztásával ugyanazt az eljárást fogjuk a Player tömörítésére használni, mint amire a médiáknál is lehetőségünk van, tehát így is szükséges a shockwaveplayer. 66 15. A Rendszer előnyei és hátrányai

15.1 Összehasonlítás a Macromedia Flash-sel Az a megállapítás, hogy egy komponense a rendszernek fejlett vagy elmaradt, nyilvánvalóan akkor nyer értelmet, ha egy másik rendszerbeli megfelelőjéhez viszonyítjuk. A bevezetőben már említettem, hogy jelenleg a Director legnagyobb versenytársa a Macromedia másik terméke, a Flash. Ebben a fejezetben tehát megpróbálok áttekintést adni, hogy miben erősebb konkurensénél a Director és melyek azok az elemek, ahol jelentősebb lemaradása van. Mindjárt a legalapvetőbb multimédiás elem, a szöveg kezelésében jelentős különbségek mutatkoznak. Míg a Director nyelve, a Lingo, teljes körű formázhatóságot biztosít számunkra, akár karakter szinten is, addig a Flash-ben az ActionScript semmilyen hasonlóval nem bír. Nézzük mi a helyzet a további médiák terén. A 13 fejezetben már említettem, hogy a Director videó kezelése sokkal kifinomultabb versenytársáénál, arról azonban még nem esett szó,

hogy mi a helyzet az állóképek területén. A Flash a kezdetektől fogva rá volt szorulva, hogy egy nagy tudású vektoros képszerkesztőt is magába integráljon, a minél kisebb méretek elérésének érdekében. Ebben a kategóriában a Director meg sem közelíti a Paint szintű raszteres és a „Vector Shape” nevű vektoros szerkesztőivel. A hangokat illetően megvan mindkét rendszernek a maga előnye és hátránya. A Director megint programozhatósági tekintetben erősebb (Ezt taglalja a 12. fejezet), a Flash pedig szokásához híven több kezelőfelületet nyújt segítségül. Ezeken akár egy hanghoz saját hangerőgörbét rendelhetünk vagy exportálhatjuk, tömöríthetjük hangjainkat. Az ActionScript alapvető jellemzője, hogy mindenben jelentősen meg akarja könnyíteni a programozó dolgát. Ezt hűen tükrözi, hogy gyakorlatilag típusok megadása nélkül is dolgozhatunk vele. Azonban néha, mikor ennek érdekében megpróbál „helyettünk

gondolkodni”, igen bosszantó végeredménye lehet. A Director 67 ennél jóval típusosabb nyelv, azonnal hibát jelez a program, ha például egy számot próbálok meg egy field text tulajdonságának megadni. Érdekes összehasonlítási szempont lehet a fájlkezelés. Talán ebben körözi le leginkább a Director ellenfelét. A Flash egy adott fájl tartalmához tud hozzáférni, ahhoz is csak akkor, ha az megfelelően megformázott állapotban van. Ami a Lingo-t illeti, a 11.2 fejezetben már megismerkedhettünk a FileIo extrával, mely segítségével gyakorlatilag bármilyen szükséges műveletet elvégezhetünk tetszőleges fájlokkal. Nem mellékes szempont az sem, hogy hogyan viszonyul egymáshoz a két rendszer. A Flash a Director semmilyen dokumentum vagy exportált formátumát nem képes fogadni, olvasni. Ezzel szemben a Director-ba minden nehézség nélkül be tudjuk importálni a Flash shockwave formátumát, az SWF-et. Lehetőséget nyújt változóinak

olvasására, sőt írására is, valamint néhány tulajdonságának állítására. Természetesen erre szükség is van, hiszen mint említettem, mind grafikailag, mind animációk tekintetében kiterjedtebb lehetőségekkel bír a Flash. Az eddig tárgyalt pontokban nagyrészt a Director került ki győztesen az összehasonlításokból. Most azonban szeretném megemlíteni, a Director egyetlen igazán jelentős hiányosságát a Flash-el szemben. Az egész rendszer egyetlen fő lejátszófejjel rendelkezik. A Flash-ben azonban létezik egy olyan szimbólum (nagyjából a membernek megfeleltethető elem), a Movie Clip, mely saját lejátszófejjel, és annak teljesen független vezérelhetőségével bír. Bármennyi ilyen példány szerepel egyszerre, mindegyiket lehetőségünk van külön irányítani. Gyakorlatilag úgy működnek ezek, mintha további Flash-ek lennének a Flash-ben. Halovány másolata ennek a Directorban a Film Loop, melynek ugyan a Score-tól függetlenül

mozog belső, saját lejátszófeje, azonban nem vezérelhető az kívülről, sőt belülről is csak nagyon kis mértékben, ráadásul egy Film Loop utólag nem módosítható. 68