attachMovie, objecten uit je library gebruiken via actionScript.
blokje door vinTage op 01-12-2006
attachMovie();

Om deze tutorial een beetje te kunnen begrijpen is een basis kennis van flash wel handig.

Met de attachMovie functie, kan je objecten uit je library gebruiken in je movie.

Waarom zou je dat willen ?
Okay, dat zal ik dus proberen uit te leggen in een paar voorbeeldjes.

Stel dat je een flashMovie hebt die een XML file uitleest.
In die XML file staan de namen en gegevens van de crewleden op jouw site.
Laten we nu even aannemen dat er 5 crewleden zijn, dan wil je natuurlijk 5 buttons in flash die de bijbehorende informatie van dat crewlid toont.

Makkelijk denk je, ik maak gewoon 5 buttons en plaats die op mn scene met bijbehorende actionScript.
Inderdaad, dat is een optie, maar nu komt er een crewlid bij, of er stapt er een op, of er gaat er een uit en twee komen erbij, of er word iemand gepromoveerd/gedegradeerd naar een andere status etc etc
Dan moet je dus weer je fla opduiken en alles gaan aanpassen, terwijl als je met attachMovie zou werken, dan hoef je alleen je XML file aan te passen.


Een ander voorbeeldje.
Je hebt een spelletje, en naar mate het spel vordert, wil je ook dat er andere vijanden in het spelletje komen, hoe flik je dat zonder attachMovie?
Of als je alle vijandjes hebt verslagen, dan wil je dat daar inneens de eind baas staat ?

Al bovenstaande voorbeeldjes en zo nog duizendan anderen zijn te verwezelijken met attachMovie.
Dus laat ik maar beginnen met de tutorial huh :p



linkage

Om te beginnen moeten we er voor zorgen dat flash onze symbolen in de library kent.
Dat realiseren we door er een linkage ID aan te geven.
Open je library en selecteer het symbool wat je wilt attachen.
Rechtsklik op dat symbool in de library en ga naar de optie linkage.
Geef daar een identifier naam op en vink de opties export for actionScript en export in first frame aan.

linkage
De identifier is de naam die we gebruiken in flash om het bestand aan te roepen.
De export for actionScript zorgt er dus voor dat flash weet dat deze movie opgeroepen kan worden.
De export in first frame zorgt ervoor dat deze mc al beschikbaar is vanaf het moment dat de eerste frame geladen is.
Als je een mc hebt die nogal groot is qua bits/bytes, dan kan de export in first frame voor problemen zorgen met het preloaden van je movie, maar daarover straks meer.

NOTE het registratie punt van je movieClip is zeer belangrijk, dus om alles simpel te houden maak je best alle clipjes netjes, met de registratie punten in het linkerbovenhoekje van je graphic. (x=0 en y=0)

Zo, flash weet nu voldoende om deze movieclip op te roepen waneer de clip nodig is.

De volgende stap is het oproepen van je movie zodat hij ook daadwerkelijk te gebruiken is.



attachMovie

De attachMovie functie zit als volgt in elkaar:

attachMovie("identifier", "nieuweNaam", layer);

In het plaatje wat ik hierboven toonde, zag je dat de identifier "mijnMovie" was.
We gaan dus in flash deze aanroepen door in het keyFrame van de timeline de volgende actionScript te zetten:
actionscript code

attachMovie("mijnMovie", "mijnMovie", this.getNextHighestDepth);
 


Als je fla nu published (terwijl er dus NIKS op je werkblad staat), zal er in de linkerbovenhoek je movieclip verschijnen.
(afhankelijk van het registratie punt van je ge-attach'te movieclip)

Ha, het begin is er dus al!
Maar wel vervelend dat die clip linksbovenin staat...hij had eigenlijk ergens anders moeten staan...
Dat probleem kunnen we oplossen door een vierde parameter in de attachMovie te gebruiken.

attachMovie("identifier", "nieuweNaam", layer, {extraParameters});

oftewel
actionscript code

attachMovie("mijnMovie", "mijnMovie", this.getNextHighestDepth, {_x:50, _y:50});

 


Je ziet nu dus dat je de movieClip kan positioneren waar je wilt via de vierde parameter.

Er kunnen eventueel nog meerdere parameters worden gebruikt:
actionscript code

attachMovie("mijnMovie", "mijnMovie", this.getNextHighestDepth, {_x:50, _y:50, _alpha:10});
 

Nu staat je mc gepositioneerd en is voor 10% zichtbaar (doorzichtig).



verwijderen

Een ge-attach'te movie kan je simpel weghalen door:
actionscript code

removeMovieClip("movieClipNaam");
 




Het daadwerkelijk gebruiken van attachMovie()

We hebben nu de basis onder de knie, maar ik wil toch nog even een paar voorbeeldjes tonen.

Bijvoorbeeld hoe je actionScript toekent aan een ge-attach'te clip:
We gaan even een bolletje op de scene laten verschijnen en als je klikt op dat bolletje, verschijnt er een variant op dat bolletje bij.
Ook dat bolletje is weer aanklikbaar en doet hetzelfde.

Teken op de main scene een bolletje (ong 1 cm), en daarop plaats je een dynamic teksvak met de instanceNaam info.
Als je alles hebt getekend selecteer je het bolletje en het tekstvak en klikt op f8.
In de popup die verschijnt geef je het de naam knop, tevens vink je export for actionScript en export at first frame aan, als het goed is staat er in de identifier tekstvak nu ook knop.

Delete alles van je scene, en plaats onderstaande script in het keyFrame in de timeline.

actionscript code

i = 1;
plaatsRandomBolletjes = function () {
  randomGrote = Math.random()*250;
  //met i als hoogte komt elk nieuwe bolletje altijd bovenop
  attachMovie("knop", "knop"+i, i, {
        //plaats het bolletje random in de swf
        _y:Math.random()*Stage.height,
        _x:Math.random()*Stage.width,
        //geef een random alpha aan bolletje
        _alpha:Math.random()*100,
        //afmeting van het nieuwe bolletje
        _xscale:randomGrote,
        _yscale:randomGrote
      });
 
  //plaats het getal in het tekstvak van bolletje
  this["knop"+i].info.text = i;
 
  //geef een functie aan bolletje
  this["knop"+i].onRelease = function() {
    i++;
    plaatsRandomBolletjes();
  };
 
  /*de wisKnop weer helemaal bovenop zetten
  anders zou hij ONDER de boletjes kunnen verdwijnen*/

  this["knop"+i].swapDepths(wisKnop);

};

//Het eerste bolletje plaatsen
plaatsRandomBolletjes();

//alles kunnen wissen
wisKnop.onRelease = function(){
  /*a=2 omdat anders het eerste bolletje ook verwijderd word
  en je niet meer kan klikken*/

  for (a=2; a<=i; a++){
    //verwijderen
    removeMovieClip("knop"+a);
  }
}

 


Bovenstaande voorbeeld zou dit als resultaat moeten hebben.
(als je niets ziet, even de pagina refreshen, het kan namelijk zijn dat het eerste bolletje _alpha = 0; heeft, of enorm klein is )

Download de gratis flash plugin
Normaal zou hier dit voorbeeld moeten staan.




preloaden

Waar ik in het begin van deze tutorial al over had, was over het aanvinken van export in first frame.
Als je een flash file published, worden alleen de gebruikte items mee gepubliseerd, je kan bijvoorbeeld een fla bestand hebben met daarin 50 psd files, 5 mb aan audio etc etc, maar zolang die niet gebruikt worden in je swf, worden die ook niet mee gepubliseerd.
Om flash dus duidelijk te maken dat bepaalde items uit de library ook meegepubliseerd moeten worden, moeten we dat dus aangeven in dat linkage scherm.

Met de optie export in first frame word dit object dus in het eerste frame mee gepubliseerd.
Op zich is daar niet mis mee....zolang het om een onbenullig vectortje gaat of een tekstveldje, maar als het gaat om grote grafische png bestanden of iets dergelijks, dan kom je toch in de problemen met je preloader.
De preloader (die vaak op frame 1 staat) kan pas beginnen met berekenen zodra frame 1 is geladen, als daar dus een paar dikke png files staan, duurt het al een eeuw voordat de preloader dus gaat werken.

Om dit probleem op te lossen vinken we dus de optie export in first frame niet aan.
We slepen dan een instance (die ge-attacht moet worden) op een frame NA de preloader (gewoon ergens buiten beeld) en het preload probleem is ook opgelost.


runtime sharing

De optie export for runtime sharing is er om andere swf bestanden gebruik te laten maken via een common library (een library die gebruikt word door meerdere swf bestanden).
Dus je hebt bijvoorbeeld een movie met daarin een monster dat geexporteerd word, dan kan je in een andere swf via
File > Import > Open External Library (de swf met het monster)
het monster aanroepen zonder dat je dus monster opnieuw moet aanmaken in je main swf.


Nawoord

Voor geluid bestaat er eenzelfde soort functie, namelijk
attachSound();
Deze functie werkt op dezelfde manier als bovenstaande.
Een klein voorbeeldje:
actionscript code

liedje = new Sound();
liedje.attachSound("linkageNaam");
liedje.start();
 


Tot zover deze saaie tutorial over de handige functie attachMovie.
In het forum heb ik (voordat ik deze tutorial maakte) al een paar mensen geholpen met deze manier van werken.
Mocht je een probleem ondervinden, dan is het mischien handig om onderstaande forum reacties eens te bekijken.

clipjes random laten bewegen en om de X tijd een nieuwe bewegende clip erbij plaatsen.
Via de url variabelen op halen en tonen in een staafgrafiekje
Plaatjes inlezen uit een xml file en tonen in een marquee

De fla die ik gebruikte als voorbeeldje met de bolletjes/buttons.




Share |



Stem op deze tutorial


Reacties



Je bent niet ingelogged, je kan geen commentaar geven, of commentaren lezen over deze tutorial.