Aja… das leidige Problem mit objektorientierter Programmierung ist, dass sie so endgeil der Code aussieht, ein Minimum Abweichen vom Konzept, unweigerlich eine Depression des Programmierers zur Folge hat, weil er ja jetzt nicht mehr 100% durchgestylten Code hat, das ganze ist vergleichbar mit einem modischen Kurzhaarschnitt versus Vokuhila.
Um dem ganzen zu entgehen hab ich jetzt eine relativ einfache Lösung gefunden, der Code sieht so gut aus wie das Projekt groß ist. Es zahlt sich meiner Meinung nach nur aus richtig große Projekte wirklich durchzustylen, da es bei kleinen unter Umständen einfach zu lange dauert. Jetzt werden sicher viele schreien, Reusability, bla bla….. allerdings ist es nach meiner Erfahrung eher so, dass die kleinen Projekte sehr spezielle Lösungen fordern, die mit einer OOP Library nur ungenügend abgedeckt werden können.
Dazu gibts auch einen Artikel beim Bokel.
Wenn man jetzt speziell auf Flash sinnt, wird dies oft zu einem Murren über ActionScrpt 2 führen, da dies ja dann oberflächlich keinen Sinn mehr machen würde, zumindest für Miniprojekte. Stimmt nicht ganz, denn der unglaublich dirty Mix aus AS1 und AS2 hat auch manchmal sein gutes. Man kann sich das Beste aus 2 Welten holen und es funktioniert auch noch. Wer also einmal mit den Fehlern und Hindernissen von Flash und ActionScript seinen Frieden geschlossen hat, ist hier gut bedient.
Beispiel: Dynamisch geladenes und animiertes Menü, basierend auf einer XML Datei und JavaScript Aufruf an den Browser
[as]
stop();
import flash.external.*;
Stage.align = “TL”;
var x:XML;
var flashvars:Array;
var navitems:Array;
flashvars = new Array();
navitems = new Array();
// productive enviroment
flashvars["SRCFILE"] = _root.SRCFILE;
// debug enviroment
//flashvars["SRCFILE"] = “site/xml/navigation.xml”;
x = new XML();
x.ignoreWhite = true;
x.load(flashvars["SRCFILE"]);
x["link"] = this;
x.onLoad = function(success) {
if(success) {
for(var i:Number = 0; i < this.firstChild.childNodes.length; i++) {
this.link.navitems.push({maintitle:this.firstChild.childNodes[i].attributes.maintitle, subtitle:this.firstChild.childNodes[i].attributes.subtitle, uri:this.firstChild.childNodes[i].attributes.uri});
}
this.link.genNavigation();
} else {
trace(“navigation loading failed”);
}
}
function genNavigation():Void {
for(var i:Number = 0; i < navitems.length; i++) {
var tmpButton:MovieClip;
var tmpSpacer:MovieClip;
tmpButton = this.attachMovie(“button”, “button_” + String(i), i * 2 + 1);
if(i < (navitems.length – 1)) {
tmpSpacer = this.attachMovie(“spacer”, “spacer_” + String(i), i * 2);
}
tmpButton.headtitle.headtitle.text = navitems[i].maintitle;
tmpButton.subtitle.subtitle.text = navitems[i].subtitle;
tmpButton["uri"] = navitems[i].uri;
tmpButton.onRollOver = function() {
this.gotoAndPlay(2);
}
tmpButton.onRollOut = function() {
this.gotoAndPlay((10 – this._currentframe) + 11);
}
tmpButton.onReleaseOutside = tmpButton.onRollOut;
tmpButton.onRelease = function() {
flash.external.ExternalInterface.call(“loadcontent”, String(this.uri));
}
tmpButton.dummy._width = 110;
tmpButton._x = i * 120 + 5;
tmpButton._y = 30;
tmpSpacer._x = 120 + i * 120;
tmpSpacer._y = 25;
}
}
[/as]