Bei der Programmierung von dynamische Anwendungen ist es immer sinnvoll, änderbare Texte und Variablen in externen Dateien auszulagern. Auf diese Weise kann man dynamische Anwendungen erstellen, ohne die ActionScript-Dateien zu bearbeiten oder neu kompilieren zu müssen. Weiter geht es nach dem Break…
Jeder kennt die Statistiken von Adobe. Angeblich besitzen 99 % aller internetfähigen Computer das Flash Player-Plugin. Aber wie Winston Churchill schon gesagt hat: “Traue keiner Statistik, die du nicht selbst gefälscht hast.”
Wie Jeder gute Blogger, Programmierer oder Administrator, sammle ich mit Google Analytics Daten von meinen Blogbesuchern. Dabei werden viele verschiedene Daten mitgeloggt, wie die Auflösung, die Herkunft oder das Betriebssystem. Eine kleine Auswertung der Daten und die Wahrheit über die Verbreitung findet ihr nach dem Break.
Nach JavaScript kommt nun der Beitrag für die Schnittstelle zu PHP. Bitte beachten:
Nach dem Break geht es weiter!
Dieser Beitrag ist für Profis und Fortgeschrittene im Bereich Programmierung gedacht. Er gibt einen groben Überblick über die Syntax, Notation und Aufbau der Skriptsprache Actionscript 3. Weitere Informationen, die Dokumentation und natürlich den Link zur API findet hier:
Die Übersicht findet ihr nach dem Break!
import flash.display.Loader; import flash.events.Event; import flash.events.IOErrorEvent; import flash.events.ProgressEvent; import flash.net.URLRequest; // Pfad zum Objekt, was geladen werden soll (relativ) var url:String = "/pic/meinBild.jpg"; var reg:URLRequest = new URLRequest(url); var myLoader:Loader = new Loader(); // EventListener // Wird ausgeloest, wenn das Bild fertig geladen ist myLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, fertig); // Wird ausgeloest, wenn ein Fehler aufgetreten ist myLoader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, fehler); // Wird ausgeloest, während des Ladens myLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, update); // Ladevorgang starten myLoader.load(reg); function fertig(e:Event):void{ // Inhalt der Stage hinzufügen this.addChild(myLoader); // oder this.addChild(e.currentTarget.content); } function fehler(e:IOErrorEvent):void{ trace("Es ist ein Fehler aufgetreten: " + e); } function update(e:ProgressEvent):void{ var total:Number = e.bytesTotal; var loaded:Number = e.bytesLoaded; var percent:Number = Math.floor((loaded*100)/total); // Ausgabe während des Ladens trace("Es wurden " + loaded + "Bytes von " + total +" Bytes geladen. Also " + percent + "%"); }
Eine Funktion rufen:
import flash.external.ExternalInterface; ... ExternalInterface.call('deine_javascript_funktion()');
Eine Funktion mit Rückgabewert rufen:
var x:int = ExternalInterface.call('get_x()');
Eine Funktion mit Rückgabewert und einem übergebenen Wert rufen:
var x:int = ExternalInterface.call('deine_javascript_funktion()', 'der wert');
einfach oder?
Jeder Entwickler kennt das Thema: “Wie sichere ich meine Anwendung vor Codediebstahl?” oder “Was kann ich gegen Decompiler tun?”. Die Antworten liefern aufwendige Verschlüsslungsalgorithmen (ein schönes HowTo findet ihr hier) oder kostenpflichtige Programme. Genau diese Programme stelle ich vor:
Logo | Name | Firma | Kosten | Version | Link |
![]() |
SWF Encrypt | amayeta | 100 € | 6.0 | hier |
![]() |
secureSWF | Kindisoft | ab 99 $ (dezimierte Version) |
3.5 | hier |
![]() |
OBFU | Motion-Twin | ab 500 € | k.a | hier |
![]() |
SWF Protector | DCOMSOFT | 39,95 € | 3.0 | hier |
Weitere Informationen und der genaue Test nach dem break!
Das folgende Beispiel zeigt dir einige Informationen über dein System / Flashplayer an.
Diese Daten können mit Hilfe der Capabilities Klasse ausgelesen werden. Man ruft lediglich die Variablen der Klasse per Getter ab.
package { import flash.system.Capabilities; import flash.display.Sprite; public class info extends Sprite { public function info() { this.a_txt.text = Capabilities.os; this.b_txt.text = Capabilities.version; this.c_txt.text = Capabilities.isDebugger.toString(); this.d_txt.text = new Date().toString(); this.e_txt.text = Capabilities.language; } } }
Viel Spaß!
PS: Nicht die Imports vergessen!
In jedem Flash-Forum findet man 1.000 x mal ein und die selbe Frage: “Wie kann ich einen Movieclip rückwärts abspielen?”. Hier ist die Antwort…
import flash.events.MouseEvent; import flash.events.TimerEvent; import flash.utils.Timer; // Wenn auf "meinAusloeser_btn" geklickt wird, führt er die Funktion "meineFunktion" aus meinAusloeser_btn.addEventListener(MouseEvent.CLICK, meineFunktion); // Variable deklarieren var myTimer:Timer; function meineFunktion(e:MouseEvent) { //Die "40" steht fuer die Verzoegerungszeit und das "meinMC.currentFrame" auf die Anzahl der Wiederholungen myTimer = new Timer(40, meinMC.currentFrame); // Event wird nach jeder Verzoegerung ausgeloest myTimer.addEventListener(TimerEvent.TIMER, rueckwaerts); // Event wird einmal am Ende ausgeloest myTimer.addEventListener(TimerEvent.TIMER_COMPLETE, timerende); // Timer starten myTimer.start(); } // Diese Funktion wird nach jeder Verzoegerungszeit ausgefuehrt function rueckwaerts(evt:TimerEvent):void { meinMC.gotoAndStop(meinMC.currentFrame-1); } // Diese Funktion wird am Ende(nach dem letzten Durchlauf) ausgefuehrt function timerende(evt:TimerEvent):void { // loescht den MovieClip removeChild(meinMC); }
Fertig^^
Das Problem kennen bestimmt viele von euch… KEINER WEIS, was für Instanzen in der Stage liegen. Besonders ärgerlich ist das, wenn man mehr mit Code als mit der Zeitleiste arbeitet. Instanzen dynamisch zu erzeugen ist leicht, aber wo befindet Sie sich?
Diese Funktion gibt euch alle, wirklich alle Instanzen mit Namen aus. Davor befindet sich der Container, indem sich diese befindet.
ActionScript:
function displayAll(container:DisplayObjectContainer, parent:String):void { var child:DisplayObject; parent = parent + "--->" + container.name; for (var i:uint=0; i < container.numChildren; i++) { child = container.getChildAt(i); if (child is MovieClip) { trace(container.name + "--->" + child.name); } if (child is DisplayObjectContainer) { displayAll(DisplayObjectContainer(child), parent ); } } trace(parent); } // Aufruf displayAll(this, "stage");
Die Funktion wird mit „displayAll(this.stage, „stage“);“ aufgerufen!
bis die Tage
lg Alexander