<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ghost23 Blog &#187; AS2</title>
	<atom:link href="http://www.ghost23.de/category/actionscript2-0/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ghost23.de</link>
	<description>A blog about Flash and stuff</description>
	<lastBuildDate>Fri, 11 Jun 2010 10:13:15 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Grafikspielerei &#8211; isometrische Darstellung</title>
		<link>http://www.ghost23.de/2007/03/grafikspielerei-isometrische-darstellung/</link>
		<comments>http://www.ghost23.de/2007/03/grafikspielerei-isometrische-darstellung/#comments</comments>
		<pubDate>Sat, 10 Mar 2007 16:30:50 +0000</pubDate>
		<dc:creator>Sven Busse</dc:creator>
				<category><![CDATA[AS2]]></category>

		<guid isPermaLink="false">http://www.ghost23.de/blog/?p=48</guid>
		<description><![CDATA[So, jetzt hab' ich auch Lust bekommen, mal was in Richtung Grafikengine zu machen. Ich baue mal eine isometrische Darstellung.
]]></description>
			<content:encoded><![CDATA[<p>Juten Tach,</p>
<p>ich habe mal jüngst angefangen, mich wieder ein wenig mit isometrischer Darstellung zu beschäftigen. Vielleicht kriege ich eine kleine isometrische 3D Engine hin, mal sehen. Der Unterschied zu anderen Engines ist, dass ich meine Objekte nicht programmatisch zeichne,<br />
sondern nur bestehende Objekte mithilfe der Transformationsmatrix von Flash verzerre.</p>
<p>Bei folgendem kleinen Beispiel ist es denn auch so, dass die drei Flächen schon existieren und nur noch durch mein Skript transformiert werden.</p>
<div id="flashcontent">
Du hast leider kein Flash. Das ist mir unverständlich. Lad es doch fix <a href="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash" target="_blank">hier</a> runter.
</div>
<p><script type="text/javascript">
var so = new SWFObject("/blog/wp-content/uploads/matrix_test_01.swf", "mymovie", "550", "400", "8", "#FFFAE6");
so.write("flashcontent");
</script><br />
<br />
Wie man sehen kann, stimmt die Z-Sortierung noch nicht. Darum kümmere ich mich als nächstes. Auch sind sicher die Formeln noch nicht so rank und schlank, wie sie sein könnten. Der Code ist momentan noch recht übersichtlich:
<pre>import flash.geom.Matrix;
var i:Number = 0;
var radius:Number = -75;
var cosI:Number;
var sinI:Number;
this.onEnterFrame = function() {
   wall.transform.matrix = transformSurface(0,300,50);
   floor.transform.matrix = transformSurface(1,300,300);
   ramp.transform.matrix = transformSurface(0.5,300,150);
   i += 0.01;
}
function transformSurface(angle:Number, i_x:Number, i_y:Number):Matrix {
   var trMatrix:Matrix = new Matrix();
   cosI = Math.cos(i);
   sinI = Math.sin(i);
   trMatrix.a = cosI;
   trMatrix.b = sinI*0.5;
   trMatrix.c = -sinI*angle*(1+Math.sin(angle*Math.PI)*0.25);
   trMatrix.d = ((cosI*0.5*angle)+(1-angle))*(1+Math.sin(angle*Math.PI)*0.25);
   trMatrix.tx = (cosI*radius)+i_x;
   trMatrix.ty = (sinI*(radius/2))+i_y;
   return trMatrix;
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.ghost23.de/2007/03/grafikspielerei-isometrische-darstellung/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Klassenqeues</title>
		<link>http://www.ghost23.de/2006/10/klassenqeues/</link>
		<comments>http://www.ghost23.de/2006/10/klassenqeues/#comments</comments>
		<pubDate>Sun, 22 Oct 2006 07:18:08 +0000</pubDate>
		<dc:creator>Sven Busse</dc:creator>
				<category><![CDATA[AS2]]></category>

		<guid isPermaLink="false">http://www.ghost23.de/blog/?p=46</guid>
		<description><![CDATA[Klassen kann man natürlich auch genauso gut über eine andere Referenz verwenden.
]]></description>
			<content:encoded><![CDATA[<p>Juten Tach,</p>
<p>nicht unbedingt neu aber interessant finde ich die Möglichkeit, Klassendefinitionen in Objekten oder Arrays zu referenzieren, um sie später zur Instanzierung zu verwenden. Beispiel:
<pre>var qeue:Array = new Array();
qeue.push(de.bla.FirstClass);
qeue.push(de.bla.SecondClass);
qeue.push(de.bla.ThirdClass);
var oneInstance:Object = new qeue[0]();</pre>
<p>Wem nicht gefällt, dass oneInstance jetzt nur ein Object ist, der könnte zum Beispiel ein Interface schreiben, welches die drei Klassen dann implementieren.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ghost23.de/2006/10/klassenqeues/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Der Segen der Autocompletion</title>
		<link>http://www.ghost23.de/2006/08/der-segen-der-autocompletion/</link>
		<comments>http://www.ghost23.de/2006/08/der-segen-der-autocompletion/#comments</comments>
		<pubDate>Sat, 26 Aug 2006 09:51:45 +0000</pubDate>
		<dc:creator>Sven Busse</dc:creator>
				<category><![CDATA[AS2]]></category>

		<guid isPermaLink="false">http://www.ghost23.de/blog/?p=43</guid>
		<description><![CDATA[Man merkt schon am Titel, dass im Bereich Flash und Actionscript das ganze Entwicklungsinstrumentarium erst langsam das erreicht, was andere Programmiersprachen schon recht lange als selbstverständlich erachten.
]]></description>
			<content:encoded><![CDATA[<p>Juten Tach,</p>
<p>Autocompletion, welch ein Segen. Es hat ja so mit Flash 7 und den Actionscript 2 Klassen langsam angefangen, ich kann gar nicht mehr genau so sagen wann, aber da kamen die ersten Editoren mit Auto-Vervollständigung innerhalb von Actionscript 2.0 auf. Ich benutze ja nun schon seit einiger Zeit FlashDevelop und ehrlich, ich kann mir gar nicht mehr vorstellen, wie das vorher ohne war (doch kann ich, wenn ich in seltenen Fällen mal eben kurz was direkt in der Flash IDE ausprobieren will).</p>
<p>Was ich interessant finde ist, dass mit der Autocompletion sich auch der Programmierstil verändert. Habe ich früher noch immer möglichst kurze und knackige Funktions- oder Variablennamen verwendet, damit man nicht soviel tippen muss, konzentrier ich mich heute viel mehr darauf, dass die Namen sprechend sind, denn tippen muss ich sie ja nicht mehr, macht ja die Autocompletion.</p>
<p>Auch beobachte ich mich dabei, dass ich viel häufiger Konstanten (also pseudo-Konstanten, weil gibbed ja nich in AS) für häufig benötigte Werte oder Strings schreibe, weil dann brauch&#8217; ich die auch nicht mehr tippen.</p>
<p>Auch mach ich nur noch selten davon Gebrauch, einfache Objekte zu erstellen um dort Attribute zu setzen, sondern vielmehr schreibe ich schnell kleine Klassen, in denen ich die Attribute fix deklariere, weil dann zeigt mir später die Autocompletion gleich alle möglichen Attributnamen und ich muss wieder nix tippen. Und wenn dann der Name doch mal nicht sprechend genug war, dann sieht man ja noch den javadoc (pardon, asdoc) Kommentar.</p>
<p>Ach ja, Autocompletion, &#8216;s schon schön &#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ghost23.de/2006/08/der-segen-der-autocompletion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wie sich Klassen überschreiben (2)</title>
		<link>http://www.ghost23.de/2006/01/wie-sich-klassen-uberschreiben-2/</link>
		<comments>http://www.ghost23.de/2006/01/wie-sich-klassen-uberschreiben-2/#comments</comments>
		<pubDate>Tue, 31 Jan 2006 08:50:29 +0000</pubDate>
		<dc:creator>Sven Busse</dc:creator>
				<category><![CDATA[AS2]]></category>

		<guid isPermaLink="false">http://www.ghost23.de/blog/?p=38</guid>
		<description><![CDATA[In Flash 7 so, in Flash 8 ganz anders
]]></description>
			<content:encoded><![CDATA[<p>Juten Tach,</p>
<p>in diesem <a href="/blog/2005/03/wie-sich-klassen-uberschreiben/">Beitrag</a> hatte ich beschrieben, dass eine Klasse in einer Runtime Shared Library eventuelle Pendants in Hauptfilmen, die diese RSL benutzen, überschreibt. Das war in Flash 7 auch so. Nicht so allerdings in Flash 8. Hier verhält sich die RSL jetzt genauso wie ein normal geladener Film. Die bestehende Klasse im Hauptfilm wird immer beibehalten.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ghost23.de/2006/01/wie-sich-klassen-uberschreiben-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Unvollständige Vererbung von Konstruktoren</title>
		<link>http://www.ghost23.de/2005/06/unvollstandige-vererbung-von-konstruktoren/</link>
		<comments>http://www.ghost23.de/2005/06/unvollstandige-vererbung-von-konstruktoren/#comments</comments>
		<pubDate>Wed, 29 Jun 2005 08:15:19 +0000</pubDate>
		<dc:creator>Sven Busse</dc:creator>
				<category><![CDATA[AS2]]></category>

		<guid isPermaLink="false">http://www.ghost23.de/blog/?p=28</guid>
		<description><![CDATA[Konstruktoren werden vererbt. Aber deren Parameter nicht?
]]></description>
			<content:encoded><![CDATA[<p>Juten Tach,<br />
wieder mal so ein Tag, an dem &#8230;<br />
Folgendes kleine Beispiel sei gegeben:</p>
<p>Wir schreiben eine Klasse &#8216;Superklasse&#8217;, in der steht folgendes:
<pre>class Superklasse {
   private var name:String = "Superklasse";
   public function Superklasse(msg:String) {
      trace("Konstruktor von " + name + " spuckt: " +  msg);
   }
}</pre>
<p>Und wir schreiben noch eine Klasse &#8216;Unterklasse&#8217;, in der soll folgendes stehen:
<pre>class Unterklasse extends Superklasse {
   private var name:String = "Unterklasse";
}</pre>
<p>So, jetzt erstellen wir eine .fla und schreiben im ersten Frame einfach folgendes:
<pre>var testchen:Unterklasse = new Unterklasse("Hallo");
var testchen:Superklasse = new Superklasse("Hallo");</pre>
<p>So und nun mal raten, was kommt raus?
<pre>Konstruktor von Unterklasse spuckt: undefined
Konstruktor von Superklasse spuckt: Hallo</pre>
<p>Was sagt uns das? Das fehlen des Konstruktors in der Unterklasse bewirkt zwar wie gewünscht, dass der Konstruktor der Superklasse verwendet wird, wegen Vererbung und so, aber der Parameter kommt nicht mit. Kann mir das einer erklären?</p>
<p>Umgehen lässt sich das Problem nur, indem man einen super() enthaltenden Konstuktor implementiert:
<pre>class Unterklasse extends Superklasse {
   private var name:String = "Unterklasse";
   public function Unterklasse(msg:String) {
      super(msg);
   }
}</pre>
<p>Dann kommt auch der Parameter durch. Ach ja, Flash &#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ghost23.de/2005/06/unvollstandige-vererbung-von-konstruktoren/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Wie sich Klassen überschreiben</title>
		<link>http://www.ghost23.de/2005/03/wie-sich-klassen-uberschreiben/</link>
		<comments>http://www.ghost23.de/2005/03/wie-sich-klassen-uberschreiben/#comments</comments>
		<pubDate>Sun, 06 Mar 2005 16:43:10 +0000</pubDate>
		<dc:creator>Sven Busse</dc:creator>
				<category><![CDATA[AS2]]></category>

		<guid isPermaLink="false">http://www.ghost23.de/blog/?p=24</guid>
		<description><![CDATA[Schon mal überlegt, was passiert, wenn zwei swfs die gleiche Klasse verwenden, und der eine Film den anderen lädt? Von welchem Film wird nun die Klasse verwendet?
]]></description>
			<content:encoded><![CDATA[<p>Juten Tach,</p>
<p>was passiert eigentlich, wenn zwei Movieclips in sich die gleiche Klasse kompiliert bergen und der eine Film den anderen lädt? Welche Klasse wird von welcher überschrieben? Das haben Lars und ich uns gefragt und folgendes herausgefunden:</p>
<p>Folgendes Szenario:<br />
Wir erstellen einen Testordner, darin einen weiteren Ordner mit dem Namen &#8216;B&#8217;. Im Testordner selbst erstellen wir eine .fla mit dem Namen &#8216;A&#8217; und im Ordner &#8216;B&#8217; eine .fla mit dem simplen aber praktischen Namen &#8216;B&#8217;. Ausserdem erstellen wir im Testordner die Klasse mit dem Namen &#8216;Testklasse&#8217;. Sie enthält weiter nichts ausser ihrem Konstruktor, der selbst nichts anderes verrichtet, als: &#8220;Ich bin A&#8221; zu tracen. Die Klasse kopieren wir in den Ordner &#8216;B&#8217; und ändern dort den trace zu: &#8220;Ich bin B&#8221;.</p>
<p>So, nun müssen wir noch dafür sorgen, dass in beiden .fla&#8217;s die jeweilige Klasse kompiliert wird, was man mit einem einfachen &#8216;Testklasse;&#8217; erreicht. Zusätzlich muss Film A noch per createEmptyMovieClip und loadMovie Film B in sich hineinladen.</p>
<p>Flugs kompiliert das ganze, und was spuckt die Ausgabe aus: &#8220;Ich bin A&#8221;. Das ist mal interessant. Ein hineingeladener Film, der selber die gleiche Klasse in sich trägt, überschreibt die vorhandene Klasse des Hauptfilms nicht.</p>
<p>Das hätte uns fast gereicht, aber wir haben trotzdem noch was anderes getestet. Jetzt binden wir Film B mal als RuntimeSharedLibrary ein und was passiert nun: &#8220;Ich bin B&#8221;. Wär&#8217; ja auch zu einfach gewesen. Klassen, die in einer RuntimeSharedLibrary sitzen, überschreiben sehr wohl ihre Doubles im Hauptfilm.</p>
<p>Das ist durchaus wichtig zu wissen, wenn man sich fragt, was man alles kompilieren muss, damit eine Änderung zu Tage tritt. Noch besser ist hier die Verwendung von exclude XML Dateien, die verhindern, dass bestimmte Klassen in bestimmte Filme kompiliert werden.</p>
<p>Exclude Dateien haben nur leider einen Haken: Wenn man eine bestimmte Klasse in einen Film kompilieren möchte, muss man auch immer alle Superklassen, von denen diese Klasse &#8211; auch indirekt &#8211; erbt, mit kompilieren. Sprich, man darf sie nicht exkludieren. Denn Flash kann sonst die Verknüpfung nicht mehr herstellen. Das gilt auch für Interfaces.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ghost23.de/2005/03/wie-sich-klassen-uberschreiben/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Typcasting</title>
		<link>http://www.ghost23.de/2004/12/typcasting/</link>
		<comments>http://www.ghost23.de/2004/12/typcasting/#comments</comments>
		<pubDate>Fri, 03 Dec 2004 21:27:16 +0000</pubDate>
		<dc:creator>Sven Busse</dc:creator>
				<category><![CDATA[AS2]]></category>

		<guid isPermaLink="false">http://www.ghost23.de/blog/?p=21</guid>
		<description><![CDATA[Typcasting ist immer wieder ein beliebtes Thema zum Rätseln. Hier mal eine weitere Darstellung.
]]></description>
			<content:encoded><![CDATA[<p>Juten Tach,</p>
<p>ein Thema, was schon hundertmal durchgekaut wurde, zumindest in anderen Programmiersprachen und welches jetzt auch in Flash, wo wir sowas lustiges wie Wenn-Du-willst-gerne-aber-muss-auch-nicht-Typisierung haben.</p>
<p>Also, warum das ganze? Folgendes Szenario: Wir haben eine Template Klasse, die soll später mal eine Seite anzeigen. So eine Seite besteht aus lauter lustigen Komponenten, also Bildern, Headlines, Links, Texten, Videos usw. Da all diese Komponenten bestimmte grundlegende Funktionen wie z.B. das Setzen des Inhalts (der Text, die Url des Bildes, die Url des Links usw.) benötigen, sehen wir eine allgemeine Klasse &#8216;Component&#8217; vor. Die konkreten Komponenten erben dann von dem Ding. Eine Link Klasse würde dann wahrscheinlich neben vielen anderen Funktionen vielleicht noch sowas wie setHighlight() implementieren, nur mal als Beispiel.</p>
<p>So, unsere Template Klasse benötigt nun, warum auch immer, ein Array, in dem alle für diese Seite verwendeten Komponenten referenziert werden, nachdem sie erzeugt wurden. Intern hätte die Klasse also ihr Array:
<pre>private var _components:Array;</pre>
<p>Und wir brauchen auch noch eine Funktion zum Hinzufügen von Komponenten und eine zum Herausnehmen:
<pre>public function setComponent(newComp:Component):Void{...}
public function getComponent(index:Number):Component {...}</pre>
<p>So. Der Parameter und der Rückgabewert der einen bzw. der anderen Funktion muss natürlich vom Typ Component sein, denn es sollen ja alle möglichen Komponenten eintragbar sein.</p>
<p>So und jetzt geht&#8217;s schon los. Angenommen, ich habe jetzt eine Link-Komponente erzeugt und will sie nun eintragen:
<pre>var myLink:Link = new Link();
setComponent(myLink);</pre>
<p>Jetzt fragt man sich vielleicht: &#8220;Moment, setComponent will doch vom Typ Component, warum geht das jetzt mit dem Link?&#8221; Weil Flash hier ein implizites Typcasting macht, sprich es ist immer erlaubt, vom Speziellen ins Allgemeine umzuwandeln und da muss man auch nix besonderes machen, das passiert dann einfach bei der Zuweisung bzw. in unserem Fall beim Funktionsaufruf.</p>
<p>Anders wäre es jetzt, wenn wir den umgedrehten Fall hätten. Angenommen also, unser Template wollte nur Links im Array speichern, dann würden wir sowas schreiben:
<pre>public function setLink(newLink:Link):Void{...}</pre>
<p>Wenn wir nun eine Komponente vom Typ &#8216;Component&#8217; erzeugen und zuweisen wollten, würde das schiefgehen:
<pre>var myComp:Component = new Component();
setLink(myComp); // Compiler würde hier 'Typdiskrepanz' melden</pre>
<p>Macht ja auch Sinn, denn nicht jede Komponente ist mit einem Link kompatibel, hingegen ist jeder Link immer auch eine Komponente.</p>
<p>Es gibt aber Fälle, wo wir einfach wissen, dass unser Objekt vom Typ &#8216;Component&#8217; eigentlich ein Link ist. Betrachten wir folgenden Verlauf:
<pre>var myLink:Link = new Link();
setComponent(myLink);
// So, jetzt also nur dieser Link im Array. weiter geht's.
var myOtherLink:Link = getComponent(0);
// ähh, geht nicht. getComponent liefert vom Typ Component,
// wir brauchen aber Link.</pre>
<p>Ja, hier ist das Problem also noch mal illustriert. Jetzt ist das ja blöd, weil wir wissen ja, dass wir da einen Link reingetan haben, nur Flash weiss das nicht, Flash sieht nur, wir wollen einen &#8216;Link&#8217;, aber getComponent() liefert vom Typ &#8216;Component&#8217;. Wenn man sich also wirklich sicher ist, dass man eigentlich den richtigen Typ hat, kann man einen Typcast versuchen. Man schreibt dann also:
<pre>var myLink:Link = new Link();
setComponent(myLink);
// So, jetzt also nur dieser Link im Array. weiter geht's.
var myOtherLink:Link = Link(getComponent(0));</pre>
<p>Jetzt haben wir Flash also explizit (deswegen hier auch explizites Typcasting, weil nicht automatisch) angewiesen, die Referenz auf das Objekt, welches getComponent liefert zuzulassen, weil wir wissen, dass sich dahinter ein Link verbirgt. Wenn es kein Link wäre, würde Flash hier nur &#8216;null&#8217; liefern.</p>
<p>So, das war das. Ach übrigens, dieser ganze Spass gilt so nur für Objekte. Es gibt ja noch die primitiven Datentypen, wie einen String, womit ich nicht die String Klasse meine, sondern einen String selbst. Bei den primitiven Datentypen gibt es auch Typenumwandlung, allerdings findet hier tatsächlich eine Konvertierung statt, während wir da oben ja nie was konvertiert, sondern nur die Typdefinition angepasst haben.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ghost23.de/2004/12/typcasting/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MovieClipLoader.onLoadError und Firefox</title>
		<link>http://www.ghost23.de/2004/11/moviecliploader-onloaderror-und-firefox/</link>
		<comments>http://www.ghost23.de/2004/11/moviecliploader-onloaderror-und-firefox/#comments</comments>
		<pubDate>Sat, 20 Nov 2004 08:26:06 +0000</pubDate>
		<dc:creator>Sven Busse</dc:creator>
				<category><![CDATA[AS2]]></category>

		<guid isPermaLink="false">http://www.ghost23.de/blog/?p=19</guid>
		<description><![CDATA[FireFox und Mozilla oder das Flash 7 Plugin für diese Browser unterstützt das Event onLoadError vom MovieClipLoader bei nicht.
]]></description>
			<content:encoded><![CDATA[<p>Juten Tach,</p>
<p>wieder mal so&#8217;n bug, den Kollege <a href="http://www.nulldesign.de" target="_blank">Lars</a> und ich neulich entdeckt haben:</p>
<p>FireFox und Mozilla bzw. wahrscheinlich eher das Flash Plugin für diese Browser unterstützt das Event onLoadError vom MovieClipLoader nicht. Bei anderen Browsern haben wir&#8217;s noch nicht getestet. Alle anderen Events vom MovieClipLoader funktionieren.<br />
Tja &#8230;<br />
(Nachtrag: bei Flash 8 geht&#8217;s)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ghost23.de/2004/11/moviecliploader-onloaderror-und-firefox/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Object.__resolve()</title>
		<link>http://www.ghost23.de/2004/08/object-__resolve/</link>
		<comments>http://www.ghost23.de/2004/08/object-__resolve/#comments</comments>
		<pubDate>Sun, 15 Aug 2004 11:53:49 +0000</pubDate>
		<dc:creator>Sven Busse</dc:creator>
				<category><![CDATA[AS2]]></category>

		<guid isPermaLink="false">http://www.ghost23.de/blog/?p=8</guid>
		<description><![CDATA[Wenn man sich die Methode __resolve() in seiner Klasse definiert, f䮧t sie alle Zugriffe auf nicht vorhandene Methoden oder Attribute, die nicht der Compiler eh schon angemeckert hat, zur Laufzeit ab. Fast immer ...
]]></description>
			<content:encoded><![CDATA[<p>Juten Tach,<br />
mann, also dieses Actionscript 2.0 &#8230;<br />
Da gibt es ja jetzt dieses neue Object.__resolve() seit Actionscript 2.0. Übrigens, gar nicht erst anfangen, in der Flash Doku nachzuschauen, das wird nur in den livedocs dokumentiert, vorerst.<br />
Also kurz zusammengefasst, __resolve ist eine Art catchAll für Objekte. Ihr kennt das von catchAll E-Mail Postfächern, wo man irgendwas@meineDomain.com schreiben kann und es kommt immer an. Das gleiche Prinzip kann man hier mit Funktionen machen. Man kann man nun in einem Objekt eine Funktion __resolve() definieren, die dann immer aufgerufen wird, wenn jemand eine Funktion oder ein Attribut über dieses Objekt aufrufen will, die dieses Objekt gar nicht besitzt.<br />
Soweit so gut. Nun kam mir gleich der Gedanke: &#8220;Cool, dann kann ich ja unerlaubte Methoden- oder Attributzugriffe prinzipiell auch zur Laufzeit abfangen und einen Fehler werfen.&#8221; Denn das tolle ist, selbst wenn jemand sowas schreibt wie:
<pre>meineInstanz["falscheVariable"]</pre>
<p>erkennt das Flash und ruft ebenfalls __resolve() auf. Geschummle ist also nicht mehr möglich.<br />
Dachte ich. Aber weit gefehlt. Wenn man
<pre>meineInstanz["falscheVariable"];</pre>
<p>schreibt, wird zwar __resolve() aufgerufen, wenn man aber ganz frech eine Zuweisung macht, z.B.
<pre>meineInstanz["falscheVariable"] = "Hallo";</pre>
<p>dann wird __resolve() nicht aufgerufen. Die Variable wird dann einfach erzeugt.<br />
Damit kann man also immer noch zur Laufzeit mogeln und einer an sich nicht dynamic deklarierten Klasse Variablen zuschieben.<br />
Schade eigentlich.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ghost23.de/2004/08/object-__resolve/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Typcasting mit MovieClips</title>
		<link>http://www.ghost23.de/2004/08/typcasting-mit-movieclips/</link>
		<comments>http://www.ghost23.de/2004/08/typcasting-mit-movieclips/#comments</comments>
		<pubDate>Fri, 06 Aug 2004 19:33:52 +0000</pubDate>
		<dc:creator>Sven Busse</dc:creator>
				<category><![CDATA[AS2]]></category>

		<guid isPermaLink="false">http://www.ghost23.de/blog/?p=7</guid>
		<description><![CDATA[attachMovie liefert immer vom Typ MovieClip zur?as aber, wenn man eine beerbte Klasse erwartet, weil man sie dem Symbol in der Bibliothek zugewiesen hat? Typcasting nat?.
]]></description>
			<content:encoded><![CDATA[<p>Juten Tach,<br />
letztens bin ich in einem Workshop ganz schön ins Schwitzen gekommen. Nicht nur, weil es so heiß ist zur Zeit, sondern weil ich was zeigen wollte, was natürlich nicht geklappt hat. Zunächst hatte ich erstmal eine Klasse geschrieben, die von MovieClip erbt und die das Interface SimpleMovie implementiert:<br />
Hier das interface SimpleMovie:</p>
<pre>interface SimpleMovie {
   public function machWas():Void;
}</pre>
<p>Hier die Klasse MovieClip1:</p>
<pre>class MovieClip1 extends MovieClip implements SimpleMovie {
   public function machWas():Void {
      trace("MovieClip1 schreit.");
   }
}</pre>
<p>Dann hatte ich ein Factory Klasse geschrieben, die jetzt für ihren Client einen MovieClip vom Typ MovieClip1 erzeugen sollte, nach dem Factory Design Pattern Prinzip(unwichtiges habe ich hier aus Platzgründen weggelassen):</p>
<pre>class MovieFactory {
   public function getSimpleMovie():SimpleMovie{
      var tempMovie:SimpleMovie;
      tempMovie = _root.attachMovie("movie1", "someMovie", 1);
      tempMovie._x = 100;
      tempMovie._y = 100;
      return tempMovie;
   }
}</pre>
<p>So, nu&#8217; hat dann irgendwann meine ClientKlasse, die ja auch einen SimpleMovie haben will, gesagt: &#8216;var meinMovie:SimpleMovie = getSimpleMovie();&#8217;. Und dann hat natürlich, wie mir jetzt ja auch auch klar ist, der Compiler gesagt, moment mal hat er gesagt, is&#8217; nich&#8217;, weil Typ MovieClip ist ja nicht gleich SimpleMovie.<br />
Hää, denk&#8217; ich? Der MovieClip, den ich attached habe, ist vom Typ MovieClip1 und da er SimpleMovie implementiert, müsste Flash das doch typcasten können?!<br />
Nee, ganz falsch, weiß ich nun. Zum Ersten liefert attachMovie immer einen MovieClip als Rückgabewert zurück und die allgemeine Klasse MovieClip implementiert ja nun mal kein interface SimpleMovie, da kann man also auch nix casten. Und dann castet Flash auch schon mal gar nicht mal so eben von selbst, das muss man schon selber machen.<br />
Also ändert man sein Skript dahingehend:</p>
<pre>class MovieFactory {
   public function getSimpleMovie():SimpleMovie{
      var tempMovie:MovieClip1 = MovieClip1(_root.attachMovie("movie1", "someMovie", 1));
      tempMovie._x = 100;
      tempMovie._y = 100;
      return SimpleMovie(tempMovie);
   }
}</pre>
<p>So, jetzt casted man als erstes mal nach MovieClip1, was ja vollkommen in Ordnung ist, weil wir haben dem Symbol ja genau diese Klasse zugewiesen und nur die Tatsache, dass Flash immer allgemeine MovieClips zurückgeben will, soll uns da nicht schrecken. Und dann casten wir beim return noch in SimpleMovie, was auch OK ist, weil ja die Klasse MovieClip1 das interface SimpleMovie implementiert und man deswegen auch zu diesem Typ casten kann.<br />
Ja und nu&#8217; klappt alles. Herrlich. Fragt sich nur, warum soviel Aufwand für&#8217;n blöden MovieClip &#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ghost23.de/2004/08/typcasting-mit-movieclips/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
