Archive for December, 2007

AIR (beta3) og Flex Builder 3 (beta3)

Du kan tage et sidste (gratis) smugkig på den næste version af Flex Builder 3 her. Den indeholder også beta 3 af Adobe AIR, som du dog også kan downloade selvstændigt.

God fornøjelse

/ockley

Leave a Comment

Adobes nye website

www.adobe.com er blevet redesignet. Jeg har ikke trævlet det igennem, men mit umiddelbare indtryk er et mere overskueligt website. Så uden yderligere introduktion:

www.adobe.com og www.adobe.dk

/ockley

Leave a Comment

Web 2.0 (ver. 2.0)

Jeg har tidligere vist et klip om Web 2.0 men blev her til formiddag, gjort opmærksom på en musikvideo om emnet (tak Stig) :-)

Hans eneste kommentar var: “It’s funny, because it’s true!”. Hvor har han dog ret.

[flv:http://www.youtube.com/watch?v=fi4fzvQ6I-o 425 355]

http://www.youtube.com/watch?v=fi4fzvQ6I-o

/ockley

Leave a Comment

Loade og afspille flere underfilm i en sekvens (tutorial).

Det at hente film ind i via ActionScript 3.0 og håndteringen af events nok den støreste udfordring for den normale Flash CS3 bruger, der er på udkig efter at få opgraderet sin viden. De to nye måder at gøre disse ting på gør det dog også lidt lettere at håndtere hentning og afspilning af film. I denne artikel vil jeg vise, hvordan du kan hente et antal undersfilm og afspille dem i rækkefølge efter hinanden. Når den sidste swf-film har spillet, vil den starte forfra ud fra en reference til filmen i et Array.

Du kan hente zip-filen “subMovieSequence.zip” med filer til opgaven.
Princippet bag dette er at du definerer et array med alle navnene. Derefter henter og afspiller du dem én ad gangen. Hver film bliver lagt i et Array og tjekker (i hver frame) om dens sidste frame er nået. Når det sker vil den begynder at hente den næste film. Når alle film i Array’et er hentet. Vil alle efterfølgende kald til film, der skal spilles ske ift. det genererede Array. OK lad os tage det lidt ad gangen.

var movieNames:Array = new Array("movie_1.swf", "movie_2.swf", "movie_3.swf");
var movies:Array = new Array();
var currentMovie:int = 0;
var isAllLoaded:Boolean = false;

Først generes et Array() kaldet movieNames, der indeholder navnene på alle de film du vil hente. De skal placeres i samme mappe som filmen der henter dem. Derefter deklarerer du et Array() kaldet movies, der skal indeholde referencer til de hentede film.Defter deklarerer du en variabel kaldet currentMovie, der skal være en tæller for den film, der i øjeblikket behandles. Endelig er der en Boolean variabel kaldet isAllLoaded, der fortæller om der skal hentes en film, eller om du allerede har hentet alle film ind. Den sættes selvfølgelig til false som udgangspunkt.

loadSingleMovie(movieNames[currentMovie]);
function loadSingleMovie(movieName:String):void {
var loader:Loader = new Loader();
loader.load(new URLRequest(movieName));
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onMovieLoaded);
}

Her definerer du funktionen loadSingleMovie() der accepterer en tekststreng med navnet på den film der skal hentes. Inde i funktionen oprettes en loader der loader filen gemt i variablen movieName ind. Den tilføjer en listener til contentLoaderInfo, der holder øje med hvornår swf-filen er færdig med at loade. Denne eventlistener har en handler kaldet onMovieLoaded(). Den ser således ud:

function onMovieLoaded(evt:Event):void {
var playingMovie:Sprite = evt.target.content;
movies.push(playingMovie);
startMovie(playingMovie);
}

Denne handler afspilles, når filmen er hentet ind. Den overfører indholdet fra loaderen til en Sprite kaldet playingMovie. Variablen evt er en reference til den der affyrede eventet. Derfor kan property’en loader.content fanges med evt.target.content. Spriten med filmen skubbes ind i et Array der indeholder alle hidtil hentede film. Til sidst kaldes startMovie() med en reference til den aktuelle film.

Filmen er ikke vist på scenen endnu. Den er kun hentet og lagt i et array til en gang den skal bruges igen.

function startMovie(movieName:Sprite):void {
addChild(movieName);
movieName.addEventListener(Event.ENTER_FRAME, checkFinish);
}

I funktionen startMovie() tilføjes filmen gemt i variablen movieName i Display List og der tilføjes en listener på klippet, der eksekveres hvert sekund.

function checkFinish(evt:Event):void {
if(evt.target.currentFrame == evt.target.totalFrames) {
evt.target.removeEventListener(Event.ENTER_FRAME, checkFinish);
evt.target.parent.removeChild(evt.target);
if(currentMovie < movieNames.length - 1) {
currentMovie++; playNextMovie();
} else {
isAllLoaded == true;
currentMovie = 0;
playNextMovie();
}
}
}

checkFinish() er den handler der affyres hver frame i den film, der i øjeblikket afspilles. Det første den gør er at tjekke om den aktuelle frame er samme værdi som antallet af frames i filmen. Hvis den er det udføres resten af funktionen - eller ingenting. Du vil ikke gøre noget specielt i hver frame, du vil kun gøre noget når den sidste frame er nået.

Hvis det er den sidste, fjerner du din ENTER_FRAME listener på filmen, og beder den om at forlade scenen igen. Derefter tjekker du om den aktuelle film (gemt i currentMovie) er mindre end den sidste film i Array'et. Husk at antallet af elementer i et Array er en større en dit index, da index'et starter fra 0. Hvis den stadig er mindre lægger du én til currentMovie og kalder functionen playNextMovie(). Hvis den er den sidste der skal hentes, hopper du tilbage til 0, sætter isAllLoaded til true og kalder playNextMovie();

function playNextMovie():void {
if(isAllLoaded == false) {
loadSingleMovie(movieNames[currentMovie]);
} else {
startMovie(movieNames[currentMovie]);
}
}

Denne funktion, playNextMovie(), finder simpelthen ud af om der skal loades en ny film, eller om der bare skal afspilles en film fra Array'et med hentede film. De første gange vil loadSingleMovie() blive kaldt. Først når tallet i currentMovie bliver større end antallet af elementer i movieNames, vil den hoppe tilbage til 0 og udføre startMovie().

Det er mange funktioner, og det kan da helt sikkert også gøres hurtigere, men jeg synes at dette giver en overskuelig løsning, der samtidig genbruger det hentede materiale. Der er ikke taget højde for preloading af clip i denne her funktion.

God fornøjelse

/ockley

Leave a Comment