ActionScript 3.0/Externe-Bestanden
Het kan in sommige gevallen handig zijn om met externe bestanden te werken in plaats van alles in het .fla of .swf bestand bij te voegen.
De voordelen hiervan zijn:
- Je .sfw bestand wordt kleiner en is dus sneller te downloaden.
- Je hebt soms niet alle afbeeldingen of andere media nodig die worden bijgevoegd in het .swf bestand.
- Je kunt communiceren met serverscripts en zo ook met databases.
Je hebt hier alleen de klassen URLLoader en URLRequest voor nodig.
Een aanvraag doen naar een bestand
[bewerken]Maak een simpel tekstbestand (.txt) aan met de volgende tekst:
msg=Hello World!
En noem het bestand greeter.txt
Maak vervolgens een nieuw flashbestand aan (.fla) en selecteer bij het eerste frame actions(handelingen).
Neem dan de volgende code over:
//Eerst de benodige pakketten importeren.
import flash.net.URLRequest;
import flash.net.URLLoader;
import flash.events.*;
//Hieronder maak je een variabele van de klasse URLRequest aan.
var request:URLRequest = new URLRequest("greeter.txt");
//Hierin is greeter.txt de URL naar het bestand.
//Dit mag dus ook een webadres zijn
//LET OP! neem dan wel het hele adres over! (incl. https://)
//Daarna heb je variabele nodig om het bestand te laden.
var loader:URLLoader = new URLLoader();
//Vervolgens laad je het bestand met .load(URLRequest):
loader.load(request);
Nu heb je het bestand aangeroepen, maar voor het verwerken van de opgeroepen informatie heb je een EventListener nodig.
//Voeg een Eventlistener toe aan de Loader variabele
loader.addEventListener(event.COMPLETE, CompleteHandler);
function CompleteHandler(event:Event):void
{
//Maak een nieuwe variabele aan om de gegevens te verwerken.
var received = event.target.data;
trace(received);
//Output: msg=Hello World!
}
De gegevens komen terug in de klasse String .
Nu heb staat er in het bestand niet voor niets msg=Hello World! Typ je namelijk: trace(received.msg) dan wordt er alleen Hello World! weergeven. Je kunt zo ook meerdere variabelen doorgeven door deze te scheiden met een & teken.
Bijvoorbeeld: part1=Hello&part2=World!
Dit wordt ook wel een URL gecodeerde string genoemd. (Dit zie je vaak ook in je adresbalk van je browser achter een ? staan.)
Werken met afbeeldingen
[bewerken]Natuurlijk kun je deze techniek ook voor afbeeldingen gebruiken. De volgende bestandsindelingen worden ondersteund:
- Jpeg (.jpg, .jpeg etc.)
- PNG (.png)
- GIF (.gif) Zowel een geanimeerde filmclip als een enkele afbeelding wordt ondersteund
import flash.display.DisplayObject();
//Maak eerst een object aan om het plaatje te tonen.
var myPicture:DisplayObject = new DisplayObject();
//Daarna doen we opnieuw een aanvraag naar het bestand.
//Bij voorkeur in dezelfde map als het .swf bestand, maar ook een webadres is mogelijk.
var request:URLRequest = new URLRequest("mijnAfbeelding.png");
Helaas kun je hier niet gebruikmaken van de klasse URLLoader omdat we de afbeelding ook gaan weergeven. Dit levert namelijk een foutmelding op bij het toevoegen aan de stage.
Gelukkig heeft actionscript hier een andere klasse voor: Loader
//Importeer de onderstaande klassen.
import flash.display.Loader;
import flash.display.contentLoaderInfo;
//De ContentLoaderInfo klasse wordt gebruikt om te controleren wanneer het downloaden van de afbeelding voltooid is.
//Maak een nieuwe variabele aan voor de lader;
var myPictureLoader:Loader = new Loader();
//Laad de afbeelding met de load methode;
myPictureLoader.load(request);
//Voeg ook een eventlistener om te controleren wanner het downloaden voltooid is.
myPictureLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, toonafbeelding);
//Maak een functie aan om de afbeelding te tonen.
function toonafbeelding (e:Event)
{
//Voeg daarna de loader toe aan de stage, bij voorkeur onder de eerder aangemaakte container variabele.
myPicture.addChild(myPictureLoader);
//Dit zal de afbeelding naar de stage toe laden.
}
Communiceren met een webserver
[bewerken]In sommige gevallen is het handig om cantact te leggen met een server en zelfs daaraan gekoppelde databases.
Hiervoor gebruik je precies dezelfde klassen als voor een normaal bestand.
Maar het voordeel van een server is dat deze ook gebruikersinvoer kan verwerken. In dit voorbeeld maken we gebruik van een simpel PHP script.
<?php
//Bestandsnaam: communicatie.php
//Maak een variabele aan voor de gebruikersinvoer
$message = $_POST["msg"];
//Kijk of er iets in is meegeven.
if ($message == ""){
//Er is geen bericht meegestuurd
echo "response=Helaas, er is geen bericht ontvangen.";
}
else{
//Er is een bericht meegestuurd.
echo "response=We hebben je bericht ontvangen.&msg=$message";
}
?>
Merk hier op dat de echo statements een URL gecodeerde string uitvoeren, dit maakt het later uitlezen van een variabele gemakkelijker.
Om een gegevens naar een server te zenden heb je nog een extra klasse nodig: URLVariables.
import flash.net.URL variables;
//Maak een nieuwe variabele aan voor de variabelen die je wilt versturen.
var variabelen:URLVariables = new URLVariables("msg=Hello World!");
/*je kunt direct alle variabelen als een string invoeren, maar je kunt deze ook later bewerken:
variabelen.msg1 = "Hello";
variabelen.msg2 = "World!";
*/
var aanvraag:URLrequest = new URLRequest("https://www.jouwdomein.nl/communicatie.php");
//Geef altijd het hele adres van het bestand op (m.u.v. index.php). Hier kan ook gebruik worden gemaakt van een ip4-adres.
aanvraag.method = URLRequestMethod.POST;
//De methode moet overeenkomen met de manier waarop de server de variabelen verwacht, in dit geval POST.
//Vervolgens voeg je de gegevens toe aan de aanvraag.
aanvraag.data = variabelen;
//Daarna maak je een variabele van het klasse loader aan.
var lader:URLLoader = new URLLoader ();
//Voeg een evenListener toe voor wanneer het laden voltooid is.
lader.addEventListener(Event.COMPLETE, onComplete);
//Daarna is het belangrijk om aan te geven hoe de data worden verzonden.
lader.dataFormat = URLLoaderDataFormat.VARIABLES;
/*In dit geval gebruik je VARIABLES, omdat het variabelen zijn.
Dit is direct ook de meest gebruikte manier om variablen te versturen.*/
Daarna laad je de aanvraag.
lader.load(aanvraag);
function onComplete(e:Event):void
{
trace(lader.data.response);
//Als alles werkt: OUTPUT: We hebben je bericht ontvangen.
trace(lader.data.msg);
//OUTPUT: Hello World!
}