<?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>flashdevelop.de</title>
	<atom:link href="http://www.flashdevelop.de/feed" rel="self" type="application/rss+xml" />
	<link>http://www.flashdevelop.de</link>
	<description>a fool with a tool is still a fool</description>
	<lastBuildDate>Tue, 03 Jan 2012 11:17:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Aus getPixel32 den RGB und Alpha Wert erhalten</title>
		<link>http://www.flashdevelop.de/actionscript-3/aus-getpixel32-den-rgb-und-alpha-wert-erhalten.html</link>
		<comments>http://www.flashdevelop.de/actionscript-3/aus-getpixel32-den-rgb-und-alpha-wert-erhalten.html#comments</comments>
		<pubDate>Tue, 03 Jan 2012 11:04:22 +0000</pubDate>
		<dc:creator>A. Khong</dc:creator>
				<category><![CDATA[ActionScript 3]]></category>
		<category><![CDATA[Mathe]]></category>
		<category><![CDATA[snippet]]></category>

		<guid isPermaLink="false">http://www.flashdevelop.de/?p=733</guid>
		<description><![CDATA[Die Methode getPixel32 liefert uns ein 32 Bit Integer und repräsentiert ein Farbwert mit einem Alphakanal (ARGB).  Die einzelnen Farbwerte bekommen wir durch Bit-Manipulation heraus. var colour:uint = 0xCC33DD66; var A:uint = color &#62;&#62; 24 &#38; 0xFF; // alpha var R:uint = color &#62;&#62; 16 &#38; 0xFF; // rot var G:uint = color &#62;&#62; 8 [...]]]></description>
			<content:encoded><![CDATA[<p>Die Methode getPixel32 liefert uns ein 32 Bit Integer und repräsentiert ein Farbwert mit einem Alphakanal (ARGB).  Die einzelnen Farbwerte bekommen wir durch <a title="Bit-Manipulation" href="http://www.flashdevelop.de/programmierung/bit-manipulation.html">Bit-Manipulation</a> heraus.</p>
<pre class="brush:as3">var colour:uint = 0xCC33DD66;

var A:uint = color &gt;&gt; 24 &amp; 0xFF; // alpha
var R:uint = color &gt;&gt; 16 &amp; 0xFF; // rot
var G:uint = color &gt;&gt; 8 &amp; 0xFF;  // grün
var B:uint = color &amp; 0xFF;       // blau</pre>
<p>Die Methode getPixel wird gleichermaßen errechnet, nur mit ein Wert weniger.<span id="more-733"></span></p>
<pre class="brush:as3">var color:uint = 0x33DD66;
var R:uint = color &gt;&gt; 16 &amp; 0xFF;
var G:uint = color &gt;&gt; 8  &amp; 0xFF;
var B:uint = color &amp; 0xFF;</pre>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.flashdevelop.de/actionscript-3/aus-getpixel32-den-rgb-und-alpha-wert-erhalten.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ein Bild proportional skalieren</title>
		<link>http://www.flashdevelop.de/actionscript-3/ein-bild-proportional-skalieren.html</link>
		<comments>http://www.flashdevelop.de/actionscript-3/ein-bild-proportional-skalieren.html#comments</comments>
		<pubDate>Mon, 05 Dec 2011 16:23:54 +0000</pubDate>
		<dc:creator>A. Khong</dc:creator>
				<category><![CDATA[ActionScript 3]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[snippet]]></category>

		<guid isPermaLink="false">http://www.flashdevelop.de/?p=708</guid>
		<description><![CDATA[Mit einer Matrix lässt sich ein Bild sehr einfach proportional skalieren.  Die folgende Funktion skaliert ein BitmapData &#8211; Object proportional und hält die eingegebenen Maximalgrößen ein. // image ist ein verknüpftes Bild in der Bibliothek var c:BitmapData = new image(0,0); // skalieren und anzeigen var b:Bitmap = new Bitmap(getScaledBitmapData(c, 100, 100)); // Glättung des Bildes, [...]]]></description>
			<content:encoded><![CDATA[<p>Mit einer Matrix lässt sich ein Bild sehr einfach proportional skalieren.  Die folgende Funktion skaliert ein BitmapData &#8211; Object proportional und hält die eingegebenen Maximalgrößen ein.<span id="more-708"></span></p>
<pre class="brush:as3">// image ist ein verknüpftes Bild in der Bibliothek
var c:BitmapData = new image(0,0);

// skalieren und anzeigen
var b:Bitmap = new Bitmap(getScaledBitmapData(c, 100, 100));

// Glättung des Bildes, fall man noch mehr machen möchte (rotieren etc)
b.smoothing = true; 

addChild(b);

/**
 * Skaliert ein BitmapData-Object proportional
 * @param scale 	Das BitmapData-Object
 * @param maxWidth	maximale Breite
 * @param maxHeight	maximale Höhe
 *
 * @return 	ein neues skaliertes BitmapData-Object
 */
function getScaledBitmapData(scale:BitmapData, maxWidth:Number, maxHeight:Number):BitmapData
{
	// Skalierungsfactor berechnen
	var wt:Number = maxWidth / scale.width;
	var ht:Number = maxHeight / scale.height;

	// kleinsten Wert bestimmen, damit maxWidth oder maxHeight nicht überschritten wird
	var factor:Number = Math.min(ht, wt);

	// Matrix mit Skalierungsfaktor erstellen und ein neues BitmapData-Object erstellen
	var m:Matrix = new Matrix();
	m.scale(factor, factor);
	var bd:BitmapData = new BitmapData(scale.width * factor, scale.height * factor, false);
	bd.draw(scale, m, null, null, null, true);
	return bd;
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.flashdevelop.de/actionscript-3/ein-bild-proportional-skalieren.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FDT 5 veröffentlicht</title>
		<link>http://www.flashdevelop.de/allgemein/fdt-5-veroffentlicht.html</link>
		<comments>http://www.flashdevelop.de/allgemein/fdt-5-veroffentlicht.html#comments</comments>
		<pubDate>Thu, 27 Oct 2011 13:24:28 +0000</pubDate>
		<dc:creator>A. Khong</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[fdt]]></category>
		<category><![CDATA[tool]]></category>

		<guid isPermaLink="false">http://www.flashdevelop.de/?p=698</guid>
		<description><![CDATA[Nun ist es soweit, das lang ersehnte FDT 5 ist da. Das besondere an dieser Version ist, das neue Preismodell. FDT5 gibt es nur noch als FDT 5 free und und FDT 5 Max. Die free Version ist eine gute Alternative zu FlashDevelop und läuft unter Windows, OSX und Linux. Probiert es einfach aus unter http://fdt.powerflasher.com]]></description>
			<content:encoded><![CDATA[<p>Nun ist es soweit, das lang ersehnte FDT 5 ist da. Das besondere an dieser Version ist, das neue Preismodell. FDT5 gibt es nur noch als <em>FDT 5 free</em> und und <em>FDT 5 Max.</em> Die <em>free</em> Version ist eine gute Alternative zu FlashDevelop und läuft unter Windows, OSX und Linux.</p>
<p>Probiert es einfach aus unter <a title="FDT 5" href="http://fdt.powerflasher.com/" target="_blank">http://fdt.powerflasher.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.flashdevelop.de/allgemein/fdt-5-veroffentlicht.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhone App Entwicklung mit FDT und ANT</title>
		<link>http://www.flashdevelop.de/programmierung/iphone-app-entwicklung-mit-fdt-und-ant.html</link>
		<comments>http://www.flashdevelop.de/programmierung/iphone-app-entwicklung-mit-fdt-und-ant.html#comments</comments>
		<pubDate>Mon, 28 Feb 2011 22:07:06 +0000</pubDate>
		<dc:creator>A. Khong</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[ActionScript 3]]></category>
		<category><![CDATA[Anleitung]]></category>
		<category><![CDATA[ant]]></category>
		<category><![CDATA[fdt]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://www.flashdevelop.de/?p=668</guid>
		<description><![CDATA[Da nun das iPhone auch ohne Vertrag der deutschen Telekom erhältlich ist, habe ich mir gleich eins zugelegt. Anschließend befasste ich mich mit der Entwicklung von Apps mit Flash. Leider habe ich zu diesem Thema nicht sehr viel im Internet gefunden und habe vieles ausprobiert und wieder verworfen und bin nun zu einem recht ordentlichem [...]]]></description>
			<content:encoded><![CDATA[<p>Da nun das iPhone auch ohne Vertrag der deutschen Telekom erhältlich ist, habe ich mir gleich eins zugelegt. Anschließend befasste ich mich mit der Entwicklung von Apps mit Flash. Leider habe ich zu diesem Thema nicht sehr viel im Internet gefunden und habe vieles ausprobiert und wieder verworfen und bin nun zu einem recht ordentlichem Ergebnis gekommen. Ob dies die beste Lösung ist, kann ich nicht sagen. Außerdem werde ich in diesem Beitrag nicht auf die Erstellung eines <em>Apple Developer Account</em> und die Erstellung eines Zertifikates eingehen, mehr dazu am Ende des Beitrages.</p>
<p>Was wir benötigen:</p>
<ol>
<li><a title="Flex 4 SDK" href="http://opensource.adobe.com/wiki/display/flexsdk/Download+Flex+4" target="_blank">Flex4 SDK bekommt von Adobe</a></li>
<li><a title="Packager für iPhone" href="http://labs.adobe.com/technologies/packagerforiphone/" target="_blank">Packager für das iPhone von Adobe</a></li>
<li><a title="Antform" href="http://antforms.sourceforge.net" target="_blank">AntForm</a></li>
<li><a title="FDT iPhone Template" href="http://www.flashdevelop.de/wp-content/uploads/2011/02/FDT.zip">FDT iPhone Template</a></li>
</ol>
<p><strong><span id="more-668"></span>Flex4 und iPhone SDK einrichten:</strong></p>
<p>Das iPhone Package ist nur eine Erweiterung für das Flex SDK, daher muss zunächst das Flex 4 SDK entpackt werden. Anschließend werden die vorhandenen Dateien mit dem iPhone Package ersetzt. Ich habe mir hierzu ein eigenen Ordner angelegt und das SDK in FDT wie folgt eingetragen. Die roten Zahlen in dem Bild sind die einzelnen Schritte.</p>
<div id="attachment_671" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.flashdevelop.de/wp-content/uploads/2011/02/add_sdk.jpg" rel="lightbox[668]" title="add_sdk"><img class="size-medium wp-image-671" title="add_sdk" src="http://www.flashdevelop.de/wp-content/uploads/2011/02/add_sdk-300x228.jpg" alt="" width="300" height="228" /></a><p class="wp-caption-text">SDK hinzufügen</p></div>
<p>Hab könnte man gleich mit einem Flex4 Air Projekt anfangen, es muss lediglich das SDK mit dem iPhone Package ausgewählt werden. Mit dem <em>pfi Compiler</em>, der sich in dem SDK Ordner befindet <em>lib/pfi.jar</em> oder <em>bin/pfi.bat</em>, kann aus der <em>swf</em> eine für das iPhone lauffähige <em>ipa</em> Datei erstellt werden.</p>
<p><strong>Das Template:</strong></p>
<p>Das Template legt bei der Projekterstellung alle wichtigen Dateien und Verzeichnisse an. Die Compiler Einstellungen werden ebenfalls angepasst. Da ich FTD unter Windows benutze, ist die Beschreibung für Mac OSX entwas anders. Das Template muss zuerst in das FDT Verzeichnis entpackt werden. Bei mir befindet sich dies in den <em>Anwendungsdaten</em> unter <em>Dokumente und Einstellungen</em>, die standart Templates sollten dort zu sehen sein. Jetzt können wir FDT starten und ein neues Projekt erstellen.</p>
<div id="attachment_680" class="wp-caption aligncenter" style="width: 262px"><a href="http://www.flashdevelop.de/wp-content/uploads/2011/02/create_iphone_project1.jpg" rel="lightbox[668]" title="create_iphone_project1"><img class="size-medium wp-image-680" title="create_iphone_project1" src="http://www.flashdevelop.de/wp-content/uploads/2011/02/create_iphone_project1-252x300.jpg" alt="" width="252" height="300" /></a><p class="wp-caption-text">Shritt 1 - 4</p></div>
<div id="attachment_681" class="wp-caption aligncenter" style="width: 262px"><a href="http://www.flashdevelop.de/wp-content/uploads/2011/02/create_iphone_project2.jpg" rel="lightbox[668]" title="create_iphone_project2"><img class="size-medium wp-image-681" title="create_iphone_project2" src="http://www.flashdevelop.de/wp-content/uploads/2011/02/create_iphone_project2-252x300.jpg" alt="" width="252" height="300" /></a><p class="wp-caption-text">Schritt 5 - 6</p></div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">http://blubl.geoathome.at/2010/09/flash-iphone-entwicklung-mit-flashdevelop-und-dem-adobe-packager-for-iphone/</div>
<p>Nun ist das Grundgerüst des Projektes erstellt.</p>
<div id="attachment_677" class="wp-caption aligncenter" style="width: 262px"><a href="http://www.flashdevelop.de/wp-content/uploads/2011/02/create_iphone_project3.jpg" rel="lightbox[668]" title="create_iphone_project3"><img class="size-medium wp-image-677" title="create_iphone_project3" src="http://www.flashdevelop.de/wp-content/uploads/2011/02/create_iphone_project3-252x300.jpg" alt="" width="252" height="300" /></a><p class="wp-caption-text">Templatestrukur</p></div>
<p><strong>Wichtige Hinweise der Struktur:</strong></p>
<p>*<strong> assets </strong>hier könnte die Projekt FLA hinein, die assets.fla.</p>
<p>* <strong>src </strong>beinhaltet die Sourcen des Projektes, die Main.as wird vom ANT Build als Einstiegspunkt genommen.</p>
<p>* <strong>bin </strong>hier wird die SWF abgelegt. Die Bilder im Verzeichnis icons werden vom <em>pfi </em>zwingend benötigt. Dies sind die Icons die im Store und auf dem iPhone angezeigt werden.</p>
<p>* <strong>build</strong> beinhaltet die benötigten Ant Dateien. Antform wird für die Auswahl des IPA Types und die Eingabe des Passwortes benötigt. In der build.property werden ein paar Einstellungen die für das Antbuild benötigt werden eingetragen. Diese könnte wie folgt aussehen</p>
<pre class="brush:bash">appName = MeinAppName
dirFlexSDK  = C:/Develop/flex_sdk_4.1.0.16076_packagerforiphone_v2_win_101110
pfi = ${dirFlexSDK}/bin/pfi.bat

certificateFile = iphone_dev.p12
provisioningFile = iphone_dev.mobileprovision

flashPlayerDebug = ${dirFlexSDK}/bin/adl.exe

mxmlc=${dirFlexSDK}/bin/mxmlc.exe

addClassPaths = 'C:/Develop/greensock/bonus-all-v11/AS3'</pre>
<p>Durch <em>appName </em>wird nach dem Build eine Flashdatei <em>MeinAppName.swf</em> im bin Ordner liegen. dirFlexSDK gibt den Ort des <em>Flex4 SDK mit dem iPhone package</em> an, pfi den Ort des IPA Compilers. Da ich unter Windows arbeite, bietet sich die <em>pfi.bat</em> an, diese kann dem <em>pfi</em> mehr Ressourcen gönnen. Zur Erläuterung für Mac OSX, die pfi.bat startet die lib/pfi.jar, daher könnte auch ${dirFlexSDK}/lib/pfi.jar angeben werden, es muss allerdings die build.xml angepasst werden &lt;java jar=&#8221;${pfi}&#8221; fork=&#8221;true&#8221; failonerror=&#8221;true&#8221;&gt; &lt;arg value=&#8221;-package&#8221;/&gt;&#8230;&#8230; Evtl. könnte man sich auch ein pfi.command schreiben. <em>certificateFile </em>und <em>provisioningFile</em> sind die Zertifikate von Apple. Der Rest ist euch bestimmt schon bekannt durch<a title="Apache Ant mit FlashDevelop" href="http://www.flashdevelop.de/programmierung/anleitung-teil-3-apache-ant-mit-flashdevelop.html"> Apache Ant mit FlashDevelop</a>.</p>
<p>* <strong>certificates </strong>hier müssen die Zertifikate hinein.</p>
<p>* <strong>iPhone </strong>beinhaltet die erstellte IPA Datei</p>
<p>* <strong>lib </strong>hier liegen die benötigten SWCs, die assets.swc</p>
<p>* application.xml muss laut pfi im Root Ordner liegen, hier werden Angaben zur App gemacht.</p>
<p>* <strong>Default.png</strong> muss auch laut pfi im Root Ordner liegen.</p>
<p><strong><br />
</strong></p>
<p><strong>IPA für das iPhone erstellen:</strong></p>
<p>Das Erstellen der <em>IPA</em> wird von Ant übernommen. Gestartet wird es wie folgt:</p>
<div id="attachment_685" class="wp-caption aligncenter" style="width: 262px"><a href="http://www.flashdevelop.de/wp-content/uploads/2011/02/create_iphone_project4.jpg" rel="lightbox[668]" title="create_iphone_project4"><img class="size-medium wp-image-685" title="create_iphone_project4" src="http://www.flashdevelop.de/wp-content/uploads/2011/02/create_iphone_project4-252x300.jpg" alt="" width="252" height="300" /></a><p class="wp-caption-text">Compile IPA mit Ant Schritt 1</p></div>
<p>Nun wird das Ant Build ausgeführt und es wird ein Eingabefenster angezeigt.</p>
<div id="attachment_686" class="wp-caption aligncenter" style="width: 262px"><a href="http://www.flashdevelop.de/wp-content/uploads/2011/02/create_iphone_project5.jpg" rel="lightbox[668]" title="create_iphone_project5"><img class="size-medium wp-image-686" title="create_iphone_project5" src="http://www.flashdevelop.de/wp-content/uploads/2011/02/create_iphone_project5-252x300.jpg" alt="" width="252" height="300" /></a><p class="wp-caption-text">Compile IPA mit Ant Schritt 2</p></div>
<ol>
<li>IPA Type</li>
<li>GPU Renderdiagnose, wird nur im ipa-test oder ipa-debug berücksichtigt.</li>
<li>Das Passwort für das Zertifikat</li>
<li>Starten des pfi Comilers. Es kann einige Minuten dauern, bis das Ergebnis vorliegt.</li>
</ol>
<p>Einen besonderen Dank möchte ich an <a class="bigusername" rel="nofollow" href="http://www.flashforum.de/forum/member.php?u=10060">_geo </a>aussprechen, der mich mit seinem Beitrag <a title="Flash iPhone Entwicklung mit FlashDevelop und dem Adobe &quot;Packager for iPhone&quot;" href="http://blubl.geoathome.at/2010/09/flash-iphone-entwicklung-mit-flashdevelop-und-dem-adobe-packager-for-iphone/" target="_blank"><em>Flash iPhone Entwicklung mit FlashDevelop und dem Adobe &#8220;Packager for iPhone&#8221;</em></a> inspiriert hat. Dort findet ihr eine Anleitung für FlashDevelop, und viele Details zur IPA und dem Zertifikat.</p>
<p>Alle Details zum packanger für iPhones findet hier bei Adobe unter  <a href="http://download.macromedia.com/pub/labs/packagerforiphone/packagerforiphone_devguide.pdf" target="_blank">http://download.macromedia.com/pub/labs/packagerforiphone/packagerforiphone_devguide.pdf</a></p>
<p><strong>UPDATE</strong> (18. März 2011 20:34) Template Version 1.1</p>
<ul>
<li> <em>ProjectTypes </em>rausgeflogen, es wird jetzt das Standart <em>AS3 Air</em> benutzt</li>
<li>Der Projektname wird in den Dateien () ersetzt.</li>
<li>Application ID kann optional hinzugefügt werden</li>
<li>Der Ordner <em>libs </em>wird automatisch in den <em>buildpath </em>eingefügt</li>
<li>Eine launch Datei wird angelegt und automatisch hinzugefügt</li>
</ul>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.flashdevelop.de/programmierung/iphone-app-entwicklung-mit-fdt-und-ant.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Integer Minimal- und Maximalwert</title>
		<link>http://www.flashdevelop.de/actionscript-3/integer-minimal-und-maximalwert.html</link>
		<comments>http://www.flashdevelop.de/actionscript-3/integer-minimal-und-maximalwert.html#comments</comments>
		<pubDate>Fri, 12 Nov 2010 09:52:10 +0000</pubDate>
		<dc:creator>A. Khong</dc:creator>
				<category><![CDATA[ActionScript 3]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[snippet]]></category>

		<guid isPermaLink="false">http://www.flashdevelop.de/?p=658</guid>
		<description><![CDATA[Diese Funktion hält ein Integer in einem vorgegebenem Bereich. val ist der Integerwert der in dem Bereich bleiben soll. min ist der minimale Wert. max ist der maximale Wert. public function intRange(val:int, min:int, max:int):int { return val &#60; min ? min : (val &#62; max ? max : val); }]]></description>
			<content:encoded><![CDATA[<p>Diese Funktion hält ein Integer in einem vorgegebenem Bereich.<br />
<em>val </em>ist der Integerwert der in dem Bereich bleiben soll.<br />
<em>min </em>ist der minimale Wert.<br />
<em>max </em>ist der maximale Wert.</p>
<pre class="brush:as3">public function intRange(val:int, min:int, max:int):int
{
	return val &lt; min ? min : (val &gt; max ? max : val);
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.flashdevelop.de/actionscript-3/integer-minimal-und-maximalwert.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bit-Manipulation</title>
		<link>http://www.flashdevelop.de/programmierung/bit-manipulation.html</link>
		<comments>http://www.flashdevelop.de/programmierung/bit-manipulation.html#comments</comments>
		<pubDate>Mon, 08 Nov 2010 20:13:17 +0000</pubDate>
		<dc:creator>A. Khong</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Anleitung]]></category>
		<category><![CDATA[Beispiel]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[programm]]></category>

		<guid isPermaLink="false">http://www.flashdevelop.de/?p=621</guid>
		<description><![CDATA[Bei Bit-Manipulationen spart man sich viele Abfragen oder Statusvariablen und eignet sich zum Beispiel gut für Vergleiche. Die Theorie: Ein Integer besteht aus 32 Bit. Diese Bits können in Binär oder Hexadezimal sehr schön dargestellt werden. Binär : 11110000111100001111000011110000 Hexadezimal: 0xF0F0F0F0 Dezimal : 4042322160 Im Binärsystem seht jede Ziffer für ein Bit. 1 bedeutet das [...]]]></description>
			<content:encoded><![CDATA[<p>Bei Bit-Manipulationen spart man sich viele Abfragen oder Statusvariablen und eignet sich zum Beispiel gut für Vergleiche.</p>
<h3>Die Theorie:</h3>
<p>Ein Integer besteht aus 32 Bit. Diese Bits können in Binär oder Hexadezimal sehr schön dargestellt werden.</p>
<pre>Binär      : 11110000111100001111000011110000
Hexadezimal: 0xF0F0F0F0
Dezimal    : 4042322160</pre>
<p>Im <a title="Dualsystem" href="http://de.wikipedia.org/wiki/Dualsystem" target="_blank">Binärsystem</a> seht jede Ziffer für ein Bit. 1 bedeutet das Bit ist gesetzt und 0 nicht gesetzt. Im <a title="Hexadezimalsystem" href="http://de.wikipedia.org/wiki/Hexadezimalsystem" target="_blank">Hexadezimalsystem</a> werden vier Bits in einer Ziffer dargestellt. 0x symbolisiert lediglich, dass es sich um eine Hexadezimalzahl handelt.</p>
<p>Folgende Bit &#8211; Operatoren werden wir benötigen:</p>
<pre>Links schieben : &lt;&lt;
Rechts schieben: &gt;&gt;
UND verknüpfen : &amp;
ODER verknüpfen: |
Exclusive ODER : ^
Einerkomplement: ~</pre>
<h4><span id="more-621"></span>Links schieben:</h4>
<p>Anweisung in Dezimal:</p>
<pre class="brush:as3">var foo:int = 1&lt;&lt;1;</pre>
<p>Die Variable foo hat den Wert 2 nach der Operation, es wird praktisch mal zwei genommen. Aus Binärsicht wird einfach eine <strong>0</strong> von <strong>RECHTS </strong>hineingeschoben.<br />
Binäredarstellung:</p>
<pre>0001
0010</pre>
<h4>Rechts schieben:</h4>
<p>Anweisung in Deziemal:</p>
<pre class="brush:as3">var foo:int = 2&gt;&gt;1;</pre>
<p>Die  Variable foo hat den Wert 1 nach der Operation, es wird praktisch durch zwei geteilt. Aus Binärsicht wird einfach eine <strong>0</strong> von <strong>LINKS </strong>hineingeschoben.<br />
Binäredarstellung:</p>
<pre>0010
0001
</pre>
<p>Hätten wir 1&gt;&gt;1 genommen, wäre die 1 rechts rausgefallen und hätten dann 0 und nicht 0.5, da wir im Integer Bereich arbeiten.</p>
<h4>UND verknüpfen:</h4>
<p>Anweisung in Dezimal:</p>
<pre class="brush:as3">var foo:int = 3&amp;1;</pre>
<p>Die  Variable foo hat den Wert 1 nach der Operation. Bei UND Verknüpfungen ist 1 UND 1 wahr, 1 UND 0 falsch, und 0 UND 0 ebenfalls falsch. D. h. 1&amp;1 = 1, 1&amp;0 = 0 und 0&amp;0 = 0.<br />
Binärdarstellung:</p>
<pre>0011  // Dez: 3
0001  // Dez: 1
----
0001  // Dez: 1
</pre>
<h4>ODER verknüpfen:</h4>
<p>Anweisung in Dezimal:</p>
<pre class="brush:as3">var foo:int = 2|1;</pre>
<p>Die  Variable foo hat den Wert 3 nach der Operation. Im Gegensatz du der UND-Verknüpfung ist es immer wahr, sobald eins der Bits 1 ist.<br />
Binärdarstellung:</p>
<pre>0010  // Dez: 2
0001  // Dez: 1
----
0011  // Dez: 3
</pre>
<h4>Exclusive ODER verknüpfen:</h4>
<p>Anweisung in Dezimal:</p>
<pre class="brush:as3">var foo:int = 6^5;</pre>
<p>Die  Variable foo hat den Wert 3 nach der Operation. Bei exlusive ODER ist es nur wahr wenn die Bits unterschiedlich sind.<br />
Binärdarstellung:</p>
<pre>0110  // Dez: 6
0101  // Dez: 5
----
0011  // Dez: 3</pre>
<h4>Einerkomplement:</h4>
<p>Anweisung in Dezimal:</p>
<pre class="brush:as3">var foo:int = 3&amp;~1;</pre>
<p>Die  Variable foo hat den Wert 2 nach der Operation. Hierbei sind zwei Schritte erforderlich. Die Bits der 1 müssen zunächst invertiert werden, die 0 wird zu 1 und die 1 zu 0. Anschließend werden die invertierten Bits UND verknüpft.<br />
Binärdarstellung:</p>
<pre>0011  // Dez: 3
0001  // Dez: 1

0011
1110  // invertiertes 0001
----
0010  // Dez: 2
</pre>
<h3>Die Praxis:</h3>
<p>Nehmen wir an, wir müssen ein Spiel oder eine Anwendung erstellen, in dem wir verschiedenfarbige Briefumschläge haben und ein Umschlag kann eine oder mehrere Sachen beinhalten. Es gibt also grüne, blaue, gelbe und rote Umschläge und als Sache Buch, Rechnung und CD. Vielleicht gibt es auch noch intern, öffentlich, private oder geschäftlich.</p>
<p>Wir definieren uns in einer Klasse,  z.B. Envelope, folgende Konstanten und setzen unsere Bits. Zu dem benötigen wir noch eine Variable, die den Brieftyp beinhaltet.</p>
<pre class="brush:as3">public static const GREEN:uint      = 1&lt;&lt;0;
public static const BLUE:uint       = 1&lt;&lt;1;
public static const YELLOW:uint     = 1&lt;&lt;2;
public static const RED:uint        = 1&lt;&lt;3;

public static const BOOK:uint       = 1&lt;&lt;20;
public static const INVOICE:uint    = 1&lt;&lt;21;
public static const CD:uint         = 1&lt;&lt;22;

public static const INTERN:uint     = 1&lt;&lt;28;
public static const PUBLIC:uint     = 1&lt;&lt;29;
public static const PRIVATE:uint    = 1&lt;&lt;30;
public static const COMMERCIAL:uint = 1&lt;&lt;31;

private var _type:uint;
</pre>
<p>Das setzen der richtigen Bits übernimmt zum Glück der Computer für uns und müssen lediglich rechts schieben. Warum wir nicht einfach die Werte 1, 2,3, 4, 5&#8230;. geben, liegt daran, dass wir nicht die Zahlen vergleichen werden, sondern den Vergleich auf Bit ebene vornehmen. D. h. wenn das erste Bit von <em>_type</em> gesetzt ist, ist der Umschlag grün. Man könnte ihn auch grün, rot machen, in dem man das erste und das vierte Bit setzt.</p>
<p>Die Bits der Farben sind also wie folgt gesetzt:</p>
<pre>0001  // GREEN
0010  // BLUE
0100  // YELLOW
1000  // RED</pre>
<p>An diesem Beispiel sehen wir auch, was passiert, wenn wir den <em>public static const YELLOW:uint = 3;</em> gesagt hätten. Die Dezimalzahl 3 ist in Binär 0011 und es hieße für uns, dass der Umschlag grün und blau ist. Spätestens wenn wir den ODER und UND Operator verwenden, dürfte dies jedem klar werden.</p>
<p>Einen roten Umschalg zu setzen und zu testen, ob dieser eine bestimmte Farbe hat, ist an dieser Stelle nich wirklich spannend.</p>
<pre class="brush:as3">_type = RED;  // roter Umschlag

// auf Farbe testen
if (_type ==  RED)
{
// Umschlag ist rot
}</pre>
<p>Bits von _type:  1000</p>
<p>Spannender wird es wenn wir nun einen roten Umschlag mit einem Buch haben wollen, d. h. wir müssen das vierte und fünfte Bit setzen und genau jetzt kommt unser ODER Operator ins Spiel. Mit ODER können wir die Bits setzen.</p>
<pre class="brush:as3">_type = RED | BOOK;</pre>
<p>In Binär:</p>
<pre>00001000  // RED
00010000  // BOOK
--------
00011000 // ODER verknüpft</pre>
<p>Siehe da, wir haben im _type das Bit für <em>RED</em> und <em>BOOK</em> gesetzt. Ab jetzt können wir nicht mehr ganz so einfach auf auf <em>RED </em>testen, da 00011000 nicht 000010000 ist. Um auf einen Wert zu prüfen, benötigen wir den UND Operator.</p>
<pre class="brush:as3">if (_type&amp;RED &gt; 0)
{
// ist rot
}
else
{
// ist nicht rot
}

if (_type&amp;BOOK &gt; 0)
{
// hat Buch
}</pre>
<p>Schauen wir uns mal die Binärzahlen an, was mit der UND verknüpfung passiert:</p>
<pre>00011000  // BOOK|RED  Dez: 24
00001000  // RED       Dez:  4
--------
00001000  // RED       Dez: 4</pre>
<p>Dadurch, dass man die Bits UND verknüpft, fallen alle nicht überinstimmenden Bits weg und wir bekommen als Ergebnis das UND verknüpfte oder 0, wenn dies nicht gesetzt wurde. Siehe folgendes Beispiel</p>
<pre>00011000  // BOOK|RED  Dez: 24
00000001  //GREEN      Dez:  1
--------
00000000  //           Dez:  0</pre>
<p>Es gibt viele verschiedene Kombinationen mit denen man prüfen kann. Möchte man wissen, ob der Umschlag überhaupt eine Farbe hat.</p>
<pre>00011000  // BOOK|RED               Dez: 24
00001111  // GREEN|BLUE|YELLOW|RED  Dez: 15
00001000  // RED                    Dez:  4</pre>
<p>Beide if &#8211; Anweisungen sind binär gesehen identisch</p>
<pre class="brush:as3">if (_type &amp;(GREEN|BLUE|YELLOW|RED) &gt; 0)
...

if (_type&amp;(0xF) &gt;0)
...</pre>
<p>0xF ist eine Hexadezimalzahl, man könnte sie auch mit führender 0 schreiben 0x0F und ist in Binär 00001111</p>
<p><strong>Merke:</strong></p>
<p><strong>Mehrere Bits werden mit ODER gesetzt und mit UND überprüft.<br />
BIT|BIT und BIT&amp;BIT<br />
</strong></p>
<p>Wenn wir einen blauen Umschlag mit einer CD und einer Rechnung haben, wollen aber gerne die Rechnung entfernen, so müssen wir einfach den Bit für die Rechnung löschen. Gelöscht wird mit dem Einerkomplement.</p>
<pre class="brush:as3">_type = CD|BLUE|INVOICE;
_type &amp;=~INVOICE; // ist das gleiche wie _type = _type&amp;~INVOICE;</pre>
<p>Schauen wir uns das Ganze in Binär an</p>
<pre>11000000000000000000010  // CD|BLUE|INVOICE
01000000000000000000000  //  INVOICE
10111111111111111111111  // ~INVOICE (invertiert)
</pre>
<pre>_type &amp;=~INVOICE
11000000000000000000010  // _type
10111111111111111111111  // UND verknüpfen ~INVOICE
--------------------------------------
10000000000000000000010  // CD|BLUE</pre>
<p>Hier sehen wir sehr schön, dass das Bit für INVOICE entfernt wurde, bzw. auf 0 gesetzt wurde.</p>
<p>Zum Schluss zeige ich noch wie man höhere Bits eines Bereiches löschen kann. Wir haben zum Beispiel die beiden höchsten Bits gesetzt und wollen gerne die vier höchsten Bits löschen, also müssen wir eine UND Verknüpfung durchführen, in dem die obersten Bits auf 0 gesetzt sind.</p>
<p>_type = BLUE|INVOICE|PRIVATE|COMMERCIAL;<br />
_type &amp;= 0x0FFFFFFF;</p>
<pre>11000000001000000000000000000010  // BLUE|INVOICE|PRIVATE|COMMERCIAL
00001111111111111111111111111111  // 0x0FFFFFFF oder ~(PRIVATE|PUBLIC|INTERN|COMMERCIAL)
00000000001000000000000000000010 // BLUE|INVOICE</pre>
<p>_type &amp;=~(PRIVATE|PUBLIC|COMMERCIAL|INTERN) würde zum gleichen Ergebnis führen.</p>
<p><strong>Merke:</strong></p>
<p><strong>Bits werden gelöscht in dem der Einerkomplement UND verknüpft wird<br />
BIT &amp; ~BIT</strong></p>
<p>Wollt ihr zwei Typen vertauschen, also a nach b und b nach a kopieren, gelingt euch das am schnellsten ohne temporäre Variablen anzulegen, mit dem exclusive ODER.</p>
<pre class="brush:as3">_type1 = BLUE;
_type2 = RED;

_type1 ^= _type2;
_type2 ^= _type1;
_type1 ^= _type2;</pre>
<p>In Binär sieht das so aus, ihr nehmt Stift und Zettel und schreibt die Binärzahlen auf und rechnet dies wie in der Theorie gezeigt aus.</p>
<h3>TIPS:</h3>
<p>Wenn ihr die Eins Zweiundreisig mal links schiebt (1&lt;&lt;32)  fängt es wieder bei 1 an, da ein Integer nur 32 Bit hat.</p>
<p>Das exclusive ODER tauschen funktioniert mit jedem Integer.</p>
<pre class="brush:as3">var a:int = 5;
var b:int = 2;

trace(a + " und " + b) // output: 5 und 2

a ^= b;
b ^= a;
a ^= b;

trace(a + " und " + b) // output: 2 und 5
</pre>
<p>Wen ihr herausfinden wollt, wie oft eine  Zahl nach links geschoben wurde, müssen wir logarithmieren.  Das Schieben nach links ist nichts anderes als y = 2<sup>x</sup>, dann ist x = log<sub>2</sub>(y).</p>
<pre class="brush:as3">1&lt;&lt;2 = 2²
1&lt;&lt;3 = 2³</pre>
<p>Da in den meisten Programmiersprachen nur der logarithmus naturalis (ln) zur Verfügung steht, müssen wir diesen umrechnen.  Unsere Formel lautet dem nach x = log<sub>e</sub>(y) / log<sub>e</sub>(2)</p>
<p>In ActionScript 3 ist unser natürlicher Logarithmus zur Basis e Math.log().</p>
<pre class="brush:as3">var x:int  = Math.log(y)/Math.log(2);</pre>
<p>Da die Klasse Math den Math.log(2) als Konstante ausgerechnet hat, können wir uns ein wenig Rechenzeit sparen und scheiben</p>
<pre class="brush:as3">var x:int = Math.log(y) / Math.LN2;</pre>
<p>Zu Beachten ist auch, dass wir in einigen Fällen Nachkommastellen haben. Das passiert, wenn wir einen ODER verknüpften Wert nehmen. Es gibt verschiedene Möglichkeiten abzurunden, da wir uns  in der Bitmanipulation befinden, benutzen wir doch gleich rechts schieben. Einmal nach rechts schieben entspricht Division durch 2 mit Abrunden.</p>
<pre class="brush:as3">var x:int = Math.log(y) / Math.LN2 &gt;&gt; 0;</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.flashdevelop.de/programmierung/bit-manipulation.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FlashDevelop 3.3.1 RTM</title>
		<link>http://www.flashdevelop.de/allgemein/flashdevelop-3-3-1-rtm.html</link>
		<comments>http://www.flashdevelop.de/allgemein/flashdevelop-3-3-1-rtm.html#comments</comments>
		<pubDate>Sun, 07 Nov 2010 14:28:39 +0000</pubDate>
		<dc:creator>A. Khong</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[FlashDevelop]]></category>

		<guid isPermaLink="false">http://www.flashdevelop.de/?p=649</guid>
		<description><![CDATA[Es zwar schon eine Weile her, die aktuelle Version von FlashDevelop ist derzeit 3.3.1 RTM. Diese behebt einige Bugs aus der 3.3.0 RTM und ist kompatiebel mit RC2 &#8211; 3.3.0 RTM. Das Programm gibt es bei FlashDevelop.org]]></description>
			<content:encoded><![CDATA[<p>Es zwar schon eine Weile her, die aktuelle Version von FlashDevelop ist derzeit 3.3.1 RTM. Diese behebt einige Bugs aus der 3.3.0 RTM und ist kompatiebel mit RC2 &#8211; 3.3.0 RTM.</p>
<p>Das Programm gibt es bei <a title="FlashDevelop 3.3.1 RTM released" href="http://www.flashdevelop.org/community/viewtopic.php?f=11&amp;t=7368&amp;sid=07aba3d4a9df8ac05d00a472c2c8e07f" target="_blank">FlashDevelop.org</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.flashdevelop.de/allgemein/flashdevelop-3-3-1-rtm.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Unterschiede zwischen den drei Includes der SWC in FlashDevelop</title>
		<link>http://www.flashdevelop.de/allgemein/unterschiede-zwischen-den-drei-includes-der-swc-in-flashdevelop.html</link>
		<comments>http://www.flashdevelop.de/allgemein/unterschiede-zwischen-den-drei-includes-der-swc-in-flashdevelop.html#comments</comments>
		<pubDate>Tue, 24 Aug 2010 20:52:53 +0000</pubDate>
		<dc:creator>A. Khong</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[FlashDevelop]]></category>
		<category><![CDATA[SWC]]></category>

		<guid isPermaLink="false">http://www.flashdevelop.de/?p=606</guid>
		<description><![CDATA[Wie ihr sicher bemerkt habt, gibt es drei verschiedene Möglichkeiten eine SWC einzubinden. Nach dem die SWC mit Add To Library dem Projekt hinzugefügt wurde, gibt es die Optionen Library (inlcude referenced classs) Include library (include completely) External libratry (not included) Zu Punkt 1: Hier werden nur die Klassen importiert, die auch tatsächlich genutzt werden. [...]]]></description>
			<content:encoded><![CDATA[<p>Wie ihr sicher bemerkt habt, gibt es drei verschiedene Möglichkeiten eine SWC einzubinden.</p>
<p>Nach dem die SWC mit <em>Add To Library </em>dem Projekt hinzugefügt wurde, gibt es die Optionen</p>
<ol>
<li>Library (inlcude referenced classs)</li>
<li>Include library (include completely)</li>
<li>External libratry (not included)</li>
</ol>
<p><span id="more-606"></span>Zu Punkt 1:<br />
Hier werden nur die Klassen importiert, die auch tatsächlich genutzt werden. Es ist nicht möglich dynamisch Klassen zu nutzen, die vorher noch nicht referenziert wurden. Habe ich zum Beispiel zwei Verlinkungen in der SWC, einmal <em>assets.ball</em> und <em>assets.korb</em>. Wenn ich nun im Code <em>new assets.korb();</em> schreibe aber niemals new<em> assets.korb(); </em>so würde ich eine Fehlermeldung bekommen, wenn ich<em> loaderInfo.applicationDomain.getDefinition(&#8220;assets.korb&#8221;); </em>benutzen würde.<em> </em>Der Grund ist, da die Klasse zuvor nicht referenziert wurde. Nur ein <em>import assets.korb;</em> würde auch nicht ausreichen.</p>
<p>Zu Punkt 2:<br />
Mit dieser Option wird alles aus der SWC importiert, egal ob es benutzt oder nicht benutzt wird. Hier stehen alle Klassen aus der SWC zur Verfügung.</p>
<p>Zu Punkt 3:<br />
Hier wird die SWC nicht importiert und dient lediglich der Autovervollständigung. Die SWF muss zwingend vom Programm nachgeladen werden, ansonsten gibt es eine Fehlermeldung, da alle Klassen der SWC nicht vorhanden sind.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.flashdevelop.de/allgemein/unterschiede-zwischen-den-drei-includes-der-swc-in-flashdevelop.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wie realisiert man ein Bubble Spiel objektorientiert</title>
		<link>http://www.flashdevelop.de/actionscript-3/wie-realisiert-man-ein-bubble-spiel-objektorientiert.html</link>
		<comments>http://www.flashdevelop.de/actionscript-3/wie-realisiert-man-ein-bubble-spiel-objektorientiert.html#comments</comments>
		<pubDate>Sun, 15 Aug 2010 20:58:20 +0000</pubDate>
		<dc:creator>A. Khong</dc:creator>
				<category><![CDATA[ActionScript 3]]></category>
		<category><![CDATA[Anleitung]]></category>
		<category><![CDATA[FlashDevelop]]></category>
		<category><![CDATA[Projekt]]></category>
		<category><![CDATA[Spiel]]></category>

		<guid isPermaLink="false">http://www.flashdevelop.de/?p=586</guid>
		<description><![CDATA[An dieser Stelle möchte ich euch zeigen, wie man ein Puzzlespiel schnell und einfach erstellen kann. Das Puzzle Spiel soll ein Feld mit verschiedenfarbigen Kugeln haben, mit Klick auf einer dieser Kugeln, sollen die gleichfarbigen Nachbarkugeln entfernt werden. Einstellbare Größen sind Feldbreite und Feldhöhe, minimale Farbkette und maximale Farben pro Feldaufbau. Ist ein Feld komplett [...]]]></description>
			<content:encoded><![CDATA[<p>An dieser Stelle möchte ich euch zeigen, wie man ein Puzzlespiel schnell und einfach erstellen kann. Das Puzzle Spiel soll ein Feld mit verschiedenfarbigen Kugeln haben, mit Klick auf einer dieser Kugeln, sollen die gleichfarbigen Nachbarkugeln entfernt werden. Einstellbare Größen sind Feldbreite und Feldhöhe, minimale Farbkette und maximale Farben pro Feldaufbau. Ist ein Feld komplett abgebaut, startet das neue Level mit mehr Farben, andernfalls beginnt das Spiel von vorne.</p>
<p>Nun müssen wir überlegen, was für Klassen wir brauchen. Wir haben ein Feld und Kugeln, mehr nicht, daher bietet sich an, jeweils eine Klasse für das Feld und eine für die Kugel zu erstellen.  Dann benötigen wir noch einen Levelzyklus und eine Event-Klasse. Somit ergibt eine Struktur wie folgt (kurzer Anriss, eine genau Struktur kann in der jeweiligen Klassendatei eingesehen werden:<span id="more-586"></span></p>
<p><strong>Main.as<br />
</strong>Hauptprogramm zur Steuerung der Level und ein paar Anzeigen, Punktestand und Level.<br />
Mögliche Methoden:</p>
<ul>
<li>zur Aktualisierung der Anzeige</li>
<li>erstellen neuer Level</li>
</ul>
<p><strong>Field.as</strong><br />
Aufbau des Feldes und Steuerung der Kugeln, also für die Spielelogik.<br />
Mögliche Methoden:</p>
<ul>
<li>Feld erstellen</li>
<li>suchen nach Kombinationen</li>
<li>Mauseingabe verarbeiten</li>
<li>Atome hinzufügen und entfernen</li>
<li>Ereignisse auslösen für Levelende und Abbau von Atomen. Natürlich könnte man noch mehr Ereignisse auslösen, das sollte aber fürs erste reichen</li>
</ul>
<p><strong>Atom.as</strong><br />
Die Kugel, ich nenne das kleinste Teil mal Atom, muss ja nicht unbedingt eine Kugel sein.<br />
Mögliche Methoden:</p>
<ul>
<li>Anzeige der Grafik</li>
<li>Positionieren der Grafik</li>
</ul>
<p><strong>FieldEvent.as</strong><br />
Für die Ereignisse, die von Field geworfen werden. Diese erbt von <em>Event</em>, der Event Klasse von Flash. Dies müssen wir, da der <em>EventDispatcher</em>, mit dem wir Ereignisse werfen können, nur <em>Events </em>verarbeiten kann.</p>
<p>Für ein einfaches Spiel reichen uns diese vier Klassen.</p>
<p>Wir verzichten auch auf ein Grafikasset und Zeichnen uns die Textfelder und Kugeln per ActionScript 3.0, nur für die Soundeffekte benötigen wir eine Flashdatei.</p>
<p>Ich habe das ganze mit FlashDevelop realisiert, wie man ein Projekt einrichtet wurde zuvor unter &#8220;<a title="Anleitung Teil 1 : ActionScript 3 Projekt mit FlashDevelop erstellen" href="http://www.flashdevelop.de/programmierung/anleitung-teil-1-actionscript-3-projekt-mit-flashdevelop-erstellen.html">Anleitung Teil 1 : ActionScript 3 Projekt mit FlashDevelop erstellen</a>&#8221; beschrieben.</p>
<h3>Die fertigen Klassen</h3>
<p>Main.as</p>
<pre class="brush:as3">public class Main extends Sprite
	{

		/* Punkte */
		private var _score:int;

		/* Spielfeld */
		private var _field:Field;

		/* Zähler für abgebaute Atome pro Feldaufbau*/
		private var _deleteCount:int;

		public function Main():void
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}

		private function init(e:Event = null):void
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			// entry point

			// Verschiebung der Ansicht
			Atom.OFFSET_X = 5;
			Atom.OFFSET_Y = 0;

			// Minimale Anzahl der Kette
			Field.MIN_CHAIN = 2;
			// Maximale Anzahl der Farben
			Field.MAX_COLOR = 1;

			// Feld erstellen
			_field = new Field(17, 15);

			//Listener hinzufügen
			_field.addEventListener(FieldEvent.ATOMS_DELETED, updateHUD);
			_field.addEventListener(FieldEvent.NO_MORE_MOVES, onNoMoreMoves);

			// Auf Bühne legen
			addChild(_field);

			// Texfeld für die Punkte erstellen
			var tf:TextField = new TextField();
			tf.x = 10;
			tf.y = 255;
			tf.defaultTextFormat = new TextFormat("Verdana", 12, 0x000000, true);
			tf.name = "score";
			addChild(tf);

			// Punkte aktualisieren
			score = 0;

			// Atomzähler auf 0 setzen
			_deleteCount = 0;
		}

		/**
		 * Wird von FieldEvent aufgerufen
		 * @param	evt		FieldEvent
		 */
		private function updateHUD(evt:FieldEvent):void
		{
			// Punkte addieren
			score += (evt.amount * evt.amount);

			// Atomzähler setzen
			_deleteCount += evt.amount;
		}

		/**
		 * Wird von FieldEvent aufgerufen wenn keine Züge mehr möglich sind
		 * @param	evt			FieldEvent
		 * @param	count		für den setTimeout
		 */
		private function onNoMoreMoves(evt:FieldEvent, count:int = 0):void
		{
			// Nach Textfeld für den Countdown und Level suchen
			var ctf:TextField = getChildByName("counter_txt") as TextField;
			var tf:TextField = getChildByName("level_info_txt") as TextField;

			// Drei Sekunden Zähler
			if (count < 3)
			{
				if (ctf == null) // Textfeld für Countdown erstellen, falls nicht vorhanden
				{
					ctf = new TextField();
					ctf.defaultTextFormat = new TextFormat("Verdana", 20, 0xFF8000, true);

					ctf.autoSize = TextFieldAutoSize.CENTER;
					ctf.multiline = true;
					ctf.x = 150;
					ctf.y = 150;
					ctf.name = "counter_txt";
					ctf.filters = new Array(new BevelFilter(), new DropShadowFilter(10, 45, 0x4B4B4B, .5, 10, 10));
					addChild(ctf);
				}

				if (tf == null) // Textfeld für Level erstellen, falls nicht vorhanden
				{
					tf = new TextField();
					tf.defaultTextFormat = new TextFormat("Verdana", 20, 0xFF8000, true);

					tf.autoSize = TextFieldAutoSize.CENTER;
					tf.multiline = true;
					tf.x = 150;
					tf.y = 130;
					tf.name = "level_info_txt";
					tf.filters = new Array(new BevelFilter(), new DropShadowFilter(10, 45, 0x4B4B4B, .5, 10, 10));
					addChild(tf);
				}

				// Auswertung nur beim ersten Aufruf
				if (count == 0)
				{
					// Nach drei Aufrufe Feld zurücksetzen
					if (_deleteCount == _field.fieldWidth * _field.fieldHeight)
					{
						// Alle Atome abgebaut
						// Nächstes Level mit mehr Farben, maximale Farben, dann von vorne
						Field.MAX_COLOR = ++Field.MAX_COLOR > Atom.COLOR.length ? 1 : Field.MAX_COLOR;

						tf.text = "Level " + Field.MAX_COLOR + " ...";
					}
					else
					{
						// nicht alle Atome abgebaut
						tf.text = "Nicht geschafft, " + score + " Punkte";

						score = 0;
						Field.MAX_COLOR = 1;
					}
				}

				ctf.text = "Weiter in " + (3 - count) + " Sekunden";

				// nach einer Sekunde noch mal aufrufen
				setTimeout(onNoMoreMoves, 1000, evt, ++count);
				return;
			}

			removeChild(ctf);
			removeChild(tf);
			evt.target.reset();

			_deleteCount = 0;
		}

		/**
		 * Get und Set für Punkte
		 */
		public function set score(value:int):void
		{
			_score = value;
			var tf:TextField = getChildByName("score") as TextField;
			tf.text = _score + " Punkte";
		}

		public function get score():int
		{
			return _score;
		}

	}
</pre>
<p>Field.as</p>
<pre class="brush:as3">	public class Field extends MovieClip
	{
		/* Minimale Kette */
		public static var MIN_CHAIN:int = 2;

		/* Maximale Farben */
		public static var MAX_COLOR:int = -1;

		/* Feld Array länge max. Anzahl der Atome*/
		private var _field:Array;

		/* Feldgröße, Anzahl Atome horizontal und vertikal */
		private var _width:int;
		private var _height:int;

		/* Ausgewählte Kette */
		private var _selectedChain:Array;

		/* Angeklickets Atom */
		private var _clickedAtom:Atom;

		/**
		 * Konstruktor Feld
		 * @param	width		Atome horizontal
		 * @param	height		Atome vertikal
		 */
		public function Field(width:int, height:int)
		{

			// Feldhintergrund
			graphics.beginFill(0xffffff);
			graphics.drawRect(0, 0, 300, 300)
			graphics.endFill();

			// Feld maximale Atomanzahl
			_field = new Array(width * height);

			// Größe setzen
			_width = width;
			_height = height;

			// Atome erstellen
			for (var x:int = 0; x &lt; width; x++)
			{
				for (var y:int = 0; y &lt; height; y++)
				{
					var atom:Atom = new Atom(x, y, MAX_COLOR);
					addAtomAt(x, y, atom);
				}
			}

			// Listener für die Maus erstellen
			addEventListener(MouseEvent.MOUSE_DOWN, handleMouse);
			addEventListener(MouseEvent.MOUSE_UP, handleMouse);

		}

		/**
		 * Kobinationen suchen
		 * @param	x				ab Position x
		 * @param	y				ab Position y
		 * @param	depth			Rekursionstiefe
		 * @param	combination		Gefundene Kombinationen
		 * @param	checked			Bereits geprüfte Atome
		 * @return					Kombination
		 */
		public function findCombinations(x:int, y:int, depth:int = 0, combination:Array = null, checked:Dictionary = null):Array
		{
			// Leere Kombination erstellen
			if (combination == null)
				combination = new Array();

			// Für bereits geprüfte steine.
			if (checked == null)
				checked = new Dictionary(true);

			// prüfen ob im zulässigem Bereich
			if (!isInBounds(x, y)) return null;

			// Zuprüfendes Atom holen
			var atom:Atom = getAtomAt(x, y);

			// Wenn leere Position beenden
			if (atom == null)
				return combination;

			// Atom als überprüft merken
			checked[atom] = atom;

			// Atom in die Kobination einfügen
			combination.push(atom);

			if (atom != null)
			{
				// In alle Richtungen suchen
				var a1:Atom = getAtomAt(x + 1, y) ;
				var a2:Atom = getAtomAt(x - 1, y) ;
				var a3:Atom = getAtomAt(x    , y + 1) ;
				var a4:Atom = getAtomAt(x    , y - 1) ;

				// Für Suche in X-Richtung rechts
				// Wenn Atom in Suchrichung existiert (Feldposition nicht leer)
				if (a1 != null)
				{
					// dann, wenn das Atom in Suchrichtung die gleiche Farbe hat und wenn das Atom noch nicht geprüft wurde
					if (a1.color == atom.color &amp;&amp; checked[a1] == undefined)
					{
						// weiter in X-Richtung nach rechts suchen.
						findCombinations(x + 1, y    , depth + 1, combination, checked);
					}
				}

				// Kürzere schreibweise in die anderen Richtungen
				if (a2 != null) if (a2.color == atom.color &amp;&amp; checked[a2] == undefined ) findCombinations(x - 1, y    , depth + 1, combination, checked);
				if (a3 != null) if (a3.color == atom.color &amp;&amp; checked[a3] == undefined ) findCombinations(x    , y + 1, depth + 1, combination, checked);
				if (a4 != null) if (a4.color == atom.color &amp;&amp; checked[a4] == undefined ) findCombinations(x    , y - 1, depth + 1, combination, checked);
			}

			// Depth = 0, wenn es der erste Aufruf war (nullte Rekursion) und wenn die Kobination nicht die minimale Kette hat wird null zurück gegeben (nichts gefunden)
			if (depth == 0 &amp;&amp; combination.length &lt; MIN_CHAIN)
			{
				combination = null;
			}

			// Ansosnten die gefundenen Atome zurückgeben
			return combination;
		}

		/**
		 * Wird vom MouseEvent aufgerufen
		 * @param	evt		MausEvent
		 */
		public function handleMouse(evt:MouseEvent):void
		{
			// Nacht type schauen
			switch (evt.type)
			{
				case MouseEvent.MOUSE_DOWN:
						/// Maus gedrückt und das Ziel ein Atom ist
						if (evt.target is Atom)
						{
							// Gedrücktes Atom merken
							_clickedAtom = evt.target as Atom;

							if (_selectedChain == null) // Wenn keine aktieve Kombination
							{
								// Klicksound abspielen
								new click().play();
								// Atom als ausgewählt markieren
								_clickedAtom.selected = true;
								// Kombination Auswählen
								selectCombination();
							}
							else
							{
								// Wenn eine Kombination ausgewählt ist
								//Flag für Atome entfernt
								var combiRemoved:Boolean = false;

								// Für alle Atome in Kombination
								for (var i:int = 0; i &lt; _selectedChain.length; i++)
								{
									// Atom nicht mehr ausgewählt markieren
									Atom(_selectedChain[i]).selected = false;

									// Wenn das das geklickte Atom in der Kobination ist, wurde ein weiteres mal auf die Kobination geklickt
									if (_selectedChain[i] == _clickedAtom)
									{
										// Dann Kombination auflösen und Atome löschen
										combiRemoved = true;
										removeAndDeleteAtoms(_selectedChain);

										// Löschsound abspielen
										new push().play();
									}
								}

								// Ausgewählte Kobination auf null setzen
								_selectedChain = null;

								// Wenn Kombination nicht gelöscht, dann wurde eine andere Kombination gewählt
								if (!combiRemoved)
								{
									// Klicksound abspielen
									new click().play();
									// Neue Kombination auswählen
									selectCombination();
								}
							}
						}

					break;

				case MouseEvent.MOUSE_UP:
					// Wenn die Maus losgelassen wurde, keine Kombination und Atom ausgewählt ist
					if (_selectedChain == null &amp;&amp; _clickedAtom != null)
					{
						// Das Atom auf normal setzen
						_clickedAtom.selected = false;
					}
					break;

			}
		}

		/**
		 * Eine Kombination auswählen
		 */
		public function selectCombination():void
		{
			// Nach Kombination suchen, anhand des ausgewählten Atoms
			_selectedChain = findCombinations(_clickedAtom.fieldX, _clickedAtom.fieldY);

			// Wenn Kombination gefunden
			if (_selectedChain != null)
			{
				// Alle Atome in der Kombination als ausgewählt markieren
				for (var i:int = 0; i &lt; _selectedChain.length; i++)
				{
					Atom(_selectedChain[i]).selected = true;
				}
			}
		}

		/**
		 * GET und SET für Feldgröße
		 */
		public function get fieldHeight():int
		{
			return _height
		}

		public function get fieldWidth():int
		{
			return _width;
		}

		/**
		 * Holt ein Atom an einer gegebenen Position
		 * @param	x		Feld X
		 * @param	y		Feld Y
		 * @return			Atom oder null
		 */
		public function getAtomAt(x:int, y:int):Atom
		{
			// Bei ungültiger Position null
			if (!isInBounds(x, y)) return null;

			return _field[x + (y * fieldWidth)];
		}

		/**
		 * Fügt ein Atom an eienr gegebenen Feldpositon ein
		 * @param	x		Feld X
		 * @param	y		Feld Y
		 * @param	atom	Atom
		 */
		public function addAtomAt(x:int, y:int, atom:Atom):void
		{
			// Ungültige Position abfangen
			if (!isInBounds(x, y)) return;

			// Atom suchen
			_field[x + (y * fieldWidth)] = atom;

			// Atom gefunden
			if (atom != null)
			{
				// Positionieren und hinzufügen
				atom.fieldX = x;
				atom.fieldY = y;
				atom.move();
				addChild(atom);
			}
		}

		/**
		 * Löscht ein Atom an einer gegebenen Position und überschreibt diese mit null
		 * @param	x		Feld X
		 * @param	y		Feld Y
		 * @return			Gelöschte Atom
		 */
		public function removeAtomAt(x:int, y:int):Atom
		{
			// Ungültige Position abfangen
			if (!isInBounds(x, y)) return null;

			// Atom holen
			var a:Atom = getAtomAt(x, y);

			// Atom gefunden
			if (a != null)
			{
				// Atom löschen
				removeChild(a);
				// Position mit null überschreiben
				addAtomAt(x, y, null);
			}

			// Gelöschtes Atom zurückgeben
			return a;
		}

		/**
		 * Löscht und entfern mehrere Atome
		 * @param	atoms		Atom Array
		 */
		public function removeAndDeleteAtoms(atoms:Array):void
		{
			// Für alle Atome im Array
			for (var i:int = 0; i &lt; atoms.length; i++)
			{
				// Atom löschen
				var a:Atom = removeAtomAt(atoms[i].fieldX, atoms[i].fieldY);

				// Wenn Atom gelöscht
				if (a != null)
				{
					// Frei gewordene Position melden zum nachrücken
					invokeFreePosistion(a.fieldX, a.fieldY);
				}
			}

			// Ereignis werfen, dass eine Kobination gelöscht wurde mit Kobinationslänge
			dispatchEvent(new FieldEvent(FieldEvent.ATOMS_DELETED, atoms.length));

			// Wenn es keine Kobinationen mehr gibt Ende melden
			if (hasMoreMoves() == null)
				dispatchEvent(new FieldEvent(FieldEvent.NO_MORE_MOVES));
		}

		/**
		 * Verarbeitet freigewordene Positionen. Aufrüken von Oben nach Unten und von Links nach Rechts
		 * @param	x		Feld X
		 * @param	y		Feld Y
		 */
		public function invokeFreePosistion(x:int, y:int):void
		{
			// Ungültige Positionnen abfangen
			if (!isInBounds(x, y)) return;

			// Atom von Oben
			var a:Atom = getAtomAt(x, y - 1);

			if (a != null) // Atom von Oben gefunden
			{
				// Atom löschen
				removeAtomAt(a.fieldX, a.fieldY);

				// Und an neue tiefere Position einfügen
				addAtomAt(x, y, a);

				// Nächstes Atom zum Nachrücken suchen
				invokeFreePosistion(x, y - 1);
			}
			else // Kein Atom gefunden, Atome nach rechts
			{
				// Atom in Linksrichtung suchen
				a = getAtomAt(x - 1, y);

				// Atom gefunden
				if (a != null)
				{
					// Atom entfernen
					removeAtomAt(a.fieldX, a.fieldY);

					// An neue Position setzen
					addAtomAt(x, y, a);

					// Weier nach links suchen
					invokeFreePosistion(x -1, y);
				}
			}
		}

		/**
		 * Überprüft ob x und y im gültigem Bereich sind
		 * @param	x		Feld X
		 * @param	y		Feld Y
		 * @return			Gültig true, ungültig false
		 */
		public function isInBounds(x:int, y:int):Boolean
		{
			if (x &lt; 0 || y &lt; 0 || x &gt;= fieldWidth || y &gt;= fieldHeight)
				return false;

			return true;
		}

		/**
		 * Überprüft anch weiteren Kombinationen
		 * @return	Gefundene Kobination oder null
		 */
		public function hasMoreMoves():Array
		{
			// Kombination
			var combi:Array = null;

			// Durch alle Atome im Feld
			for (var x:int = 0; x &lt; fieldWidth; x += MIN_CHAIN)
			{
				for (var y:int = 0; y &lt; fieldHeight; y += MIN_CHAIN) 				{ 					// Nach Kobination suchen 					combi = findCombinations(x, y); 					 					// Kombination gefunden dann Funktion beenden und Kobination zurückgeben  					if (combi != null) 					{ 						if (combi.length &gt; 0)
						{
							return combi;
						}
					}
				}
			}

			// keine Kombinationen mehr
			return null;
		}

		/**
		 * Feld zurücksetzen
		 */
		public function reset():void
		{
			// Alle Atome löschen
			for (var i:int = 0; i &lt; _field.length; i++)
			{
				var a:Atom = _field[i] as Atom;
				if (a != null) removeAtomAt(a.fieldX, a.fieldY);
			}

			// Feld mit neuen Atomen befüllen
			for (var x:int = 0; x &lt; width; x++)
			{
				// Reihe für Reihe
				setTimeout(addOneLine, x * 200, x);
			}
		}

		/**
		 * Fügt eine Reihe vertikal an gegebener Position ein
		 * @param	x	Feld X
		 */
		private function addOneLine(x:int):void
		{
			// Für komplette Spalte
			for (var y:int = 0; y &lt; height; y++)
			{
				var atom:Atom = new Atom(x, y, MAX_COLOR);
				addAtomAt(x, y, atom);
			}
		}

	}
</pre>
<p>FieldEvent.as</p>
<pre class="brush:as3">public class FieldEvent extends Event
	{
		public static const ATOMS_DELETED:String = "onAtomsDeleted";
		public static const NO_MORE_MOVES:String = "onNoMoreMoves";

		/* Atomzähler */
		public var amount:int;

		public function FieldEvent(type:String, amount:int = 0)
		{
			super(type, true);

			this.amount = amount;
		}

	}
</pre>
<p>Atom.as</p>
<pre class="brush:as3">	public class Atom extends MovieClip
	{
		/* Farbtabelle */
		public static const COLOR:Array = [0xff0000, 0x00ff00, 0x0000ff, 0xffff00, 0xff00ff, 0x00ffff];

		/* Atom größe*/
		public static const SIZE:int = 8;

		/* Verschiebung auf x und y der Bühne*/
		public static var OFFSET_X:Number = 0;
		public static var OFFSET_Y:Number = 0;

		/* X und Y Position im Feld*/
		private var _x:int;
		private var _y:int;

		/* Atomfarbe */
		private var _color:int;

		/**
		 * Konstruktor für ein Atom
		 * @param	x			x Position
		 * @param	y			y Position
		 * @param	maxColor	Maximale Farben
		 */
		public function Atom(x:int, y:int, maxColor:int)
		{
			// x und y der Feldposition setzen nicht x und y der Bühne
			_x = x;
			_y = y;

			// Farbe setzen
			_color = getRandomColor(maxColor);

			// Zeichenen
			draw();

			// Auf Bühnenposition bewegen
			move();

			// Hand an der Maus anzeigen
			buttonMode = true;
			useHandCursor = true;
		}

		/**
		 * Atom zeichnen
		 */
		public function draw():void
		{
			// Wir zeichnen hier eine Kugel
			var g:Graphics = graphics;
			g.lineStyle(1, 0x000000, .2);
			g.beginFill(_color, 8);
			g.drawCircle(0, 0, SIZE);
			g.endFill();
			filters = new Array(new BevelFilter(2));
		}

		/**
		 * An Bühnenposition bringen
		 */
		public function move():void
		{
			// x und y setzen
			x = _x * width + (OFFSET_X + SIZE);
			y = _y * height + (OFFSET_Y + SIZE);
		}

		/**
		 * Zufallsfarbe holen
		 * @param	amout	Anzahl der Farben
		 * @return			HEX Farbwert
		 */
		public function getRandomColor(amout:int = -1):uint
		{
			// Überprüfen ob im zulässigem Farbbereich
			if (amout &gt; COLOR.length || amout == -1)
				amout = COLOR.length;

			// Farbe zurückgeben
			return COLOR[Math.floor(Math.random() * amout)];
		}

		/**
		 * Atom als String
		 * @return		String
		 */
		override public function toString():String
		{
			return "[Atom x=" + _x + ", y=" + _y + ", color=" + _color + "]";
		}

		/**
		 * GET und SET X Feldposition
		 */
		public function get fieldX():int
		{
			return _x;
		}

		public function set fieldX(value:int):void
		{
			_x = value;
		}

		/**
		 * GET und SET Y Feldposition
		 */
		public function get fieldY():int
		{
			return _y;
		}

		public function set fieldY(value:int):void
		{
			_y = value;
		}

		/**
		 * GET Farbe
		 */
		public function get color():uint
		{
			return _color;
		}

		/**
		 * SET Ausgewählt
		 */
		public function set selected(value:Boolean):void
		{
			if (value)
			{
				// Wenn ausgewählt ein paar Filder setzen und Alpha runterschrauben
				filters = new Array(new BevelFilter(2), new GlowFilter(0x000000));
				alpha = .4;
			}
			else
			{
				// Nicht ausgewählt normale Ansicht
				filters = new Array(new BevelFilter(2));
				alpha = 1;
			}
		}
	}
</pre>
<p>Auf Angabe der Pakete habe ich im Artikel verzichtet.</p>
<h3>Das Spiel</h3>

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="swfobj_0" width="300" height="300" align="center">
      <param name="movie" value="http://www.flashdevelop.de/wp-content/uploads/2010/08/Balls.swf" />
      <param name="align" value="center" />
      <!--[if !IE]>-->
      <object type="application/x-shockwave-flash" data="http://www.flashdevelop.de/wp-content/uploads/2010/08/Balls.swf" width="300" height="300" align="center">
      <!--<![endif]-->
        
      <!--[if !IE]>-->
      </object>
      <!--<![endif]-->
    </object>

<h3>Die Sourcen</h3>
<p><a rel="attachment wp-att-590" href="http://www.flashdevelop.de/actionscript-3/wie-realisiert-man-ein-bubble-spiel-objektorientiert.html/attachment/balls-2">Balls Flash Game Sourcen</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.flashdevelop.de/actionscript-3/wie-realisiert-man-ein-bubble-spiel-objektorientiert.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Anleitung Teil 3 : Apache Ant mit FlashDevelop</title>
		<link>http://www.flashdevelop.de/programmierung/anleitung-teil-3-apache-ant-mit-flashdevelop.html</link>
		<comments>http://www.flashdevelop.de/programmierung/anleitung-teil-3-apache-ant-mit-flashdevelop.html#comments</comments>
		<pubDate>Thu, 12 Aug 2010 08:00:40 +0000</pubDate>
		<dc:creator>A. Khong</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[ActionScript 3]]></category>
		<category><![CDATA[Anleitung]]></category>
		<category><![CDATA[ant]]></category>
		<category><![CDATA[FlashDevelop]]></category>
		<category><![CDATA[mxmlc]]></category>

		<guid isPermaLink="false">http://www.flashdevelop.de/?p=548</guid>
		<description><![CDATA[Nun beschreibe ich einen Weg, das Projekt mit Apache Ant zu veröffentlichen. Wir benötigen dafür Ant &#8220;Apache-Ant (http://ant.apache.org/)&#8221;. Ich verwende momentan Apache Ant 1.8.1. Apache Ant vorbereiten Als erstes wird Ant installiert, bzw. es muss nur entpackt werden, zum Beispiel in C:\Programme\. Damit Ant ohne Pfadangabe gestartet werden kann, tragen wir diesen in die Systemvariablen [...]]]></description>
			<content:encoded><![CDATA[<p>Nun beschreibe ich einen Weg, das Projekt mit Apache Ant zu veröffentlichen.</p>
<p>Wir benötigen dafür Ant &#8220;<a title="Apache-Ant" href="http://ant.apache.org/">Apache-Ant (http://ant.apache.org/</a>)&#8221;. Ich verwende momentan Apache Ant 1.8.1.</p>
<h3>Apache Ant vorbereiten</h3>
<p>Als erstes wird Ant installiert, bzw. es muss nur entpackt werden, zum Beispiel in <em>C:\Programme\</em>. Damit Ant ohne Pfadangabe gestartet werden kann, tragen wir diesen in die Systemvariablen ein.<br />
Dazu klicken wir mit der rechten Maustaste auf<em> Arbeitsplatz -&gt; Eigenschaften</em> und auf die Registrierkarte <em>Erweitert</em>. Nun sollte das Fenster wie im folgendem Bild aussehen, dort gehen wir auf <em>Umgebungsvariablen</em>.<span id="more-548"></span><br />
<a href="http://www.flashdevelop.de/wp-content/uploads/2010/08/umgebungsvariablen1.jpg" rel="lightbox[548]" title="umgebungsvariablen Ant 1"><img class="aligncenter size-medium wp-image-454" title="umgebungsvariablen Ant 1" src="http://www.flashdevelop.de/wp-content/uploads/2010/08/umgebungsvariablen1-236x300.jpg" alt="" width="236" height="300" /></a></p>
<p>Ein weiteres Fenster öffnet sich, dort suchen wir unter Systemvariablen den Eintrag <em>Path</em> und machen einen Doppelklick drauf.</p>
<p><a href="http://www.flashdevelop.de/wp-content/uploads/2010/08/umgebungsvariablen2.jpg" rel="lightbox[548]" title="umgebungsvariablen Ant 2"><img class="aligncenter size-medium wp-image-455" title="umgebungsvariablen Ant 2" src="http://www.flashdevelop.de/wp-content/uploads/2010/08/umgebungsvariablen2-236x300.jpg" alt="" width="236" height="300" /></a></p>
<p>Jetzt muss nur noch der Eintrag unter<span style="color: #888888;"> <em>Wert der Variablen:</em></span> mit <span style="color: #888888;"><em>;C:\Programme\apache-ant-1.8.1\bin\</em></span> erweitert und mit <em>OK </em>bestätigt werden.</p>
<p><a href="http://www.flashdevelop.de/wp-content/uploads/2010/08/umgebungsvariablen3.jpg" rel="lightbox[548]" title="umgebungsvariablen Ant 3"><img class="aligncenter size-medium wp-image-456" title="umgebungsvariablen Ant 3" src="http://www.flashdevelop.de/wp-content/uploads/2010/08/umgebungsvariablen3-236x300.jpg" alt="" width="236" height="300" /></a></p>
<h4>FlashDevelop vorbereiten</h4>
<p>Da wir später ein Release-Build per Knopfdruck erstellen wollen,   müssen wir ein Button in die <em>ToolBar.xml</em> eintragen. Diese liegt im Installationsverzeichnis von FlashDevelop, für gewöhnlich in <em>C:\Programme</em>.</p>
<p><a href="http://www.flashdevelop.de/wp-content/uploads/2010/08/fd_toolbar_xml.jpg" rel="lightbox[548]" title="FlashDevelop ToolBar XML"><img class="aligncenter size-medium wp-image-470" title="FlashDevelop ToolBar XML" src="http://www.flashdevelop.de/wp-content/uploads/2010/08/fd_toolbar_xml-300x244.jpg" alt="" width="300" height="244" /></a></p>
<p>In dieser Datei muss nun der folgende Code vor <em>&lt;/toolbar&gt;</em> eingefügt werden.</p>
<pre class="brush:xml">&lt;seperator /&gt;
 &lt;button label="Ant Build (Release)" click="RunProcessCaptured" image="487" tag="c:\windows\system32\cmd.exe;/c $(Quote)ant -buildfile $(Quote)$(ProjectDir)/ant/build.xml$(Quote) release$(Quote)" /&gt;</pre>
<p>Nach einem Neustart von FlashDevelop sollte dann ein neuer Button zu sehen sein.<a href="http://www.flashdevelop.de/wp-content/uploads/2010/08/anticon1.jpg"><br />
</a><a href="http://www.flashdevelop.de/wp-content/uploads/2010/08/anticon1.jpg" rel="lightbox[548]" title="Ant Icon in FD Toolbar"><img class="aligncenter size-full wp-image-477" title="Ant Icon in FD Toolbar" src="http://www.flashdevelop.de/wp-content/uploads/2010/08/anticon1.jpg" alt="" width="239" height="139" /></a></p>
<ol>
<li><em>label</em> wird als Tooltip angezeigt.</li>
<li>Was beim Klicken passiert steht in <em>click</em>, hier soll ein Prozess  ausgeführt werden.</li>
<li><em>image=&#8221;487&#8243;</em> bedeutet, dass das Icon 487 aus der Iconsammlung genommen wird.</li>
<li><em>tag</em> sagt dem <em>RunProcessCaptured</em> was er ausführen soll. Er soll die cmd.exe mit dem Befehl <em>&#8220;ant -buildfile &#8220;$(ProjectDir)/build/build.xml&#8221; release</em>. In etwa so: cmd.exe starte bitte bitte ant mit der build.xml und führe das <em>target</em> release aus. $(Quote) ist ein Anführungszeichen und $(ProjectDir) der absolute Pfad zum Projekt für FlashDevelop.</li>
</ol>
<p>Möchte man per Knopfdruck noch ein anderes <em>target </em>starten, so müsste ein Weiterer Knopf hinzugefügt werden. Wer gerne mein Plugin benutzen möchte kann sich dies unter <a title="Ant Plugin für FlashDevelop" href="http://www.flashdevelop.de/programmierung/ant-plugin-fuer-flashdevelop.html">http://www.flashdevelop.de/programmierung/ant-plugin-fuer-flashdevelop.html</a> anschauen und installieren, somit bleibt einem der ganze Schritt <em>FlashDevelop vorbereiten</em> erspart.</p>
<h3>Das Projekt Stechen mit Ant erweitern</h3>
<p>Warum wollen wir das Projekt überhaupt mit Ant erstellen, wenn FlashDevelop das auch kann?</p>
<p><em>trace </em>Ausgaben könnten Informationen preisgeben, die der Anwender missbrauchen könnte, um sich z. B. Vorteile zu verschaffen, daher müssten wir diese vorher löschen. Der <em>DEBUGMODE </em>muss für den Release von <em>true </em>auf <em>false </em>und wieder zurück geändert werden. Unsere Versionsnummer braucht eine Erhöhung. Dies und noch viel mehr kann Ant für uns übernehmen.</p>
<p>D. h. Ant soll für <em>Stechen</em>:</p>
<ol>
<li><em>DEBUGMODE </em>auf <em>false </em>stellen.</li>
<li><em>trace </em>Ausgaben löschen.</li>
<li>Versionsnummer erhöhen.</li>
<li>Release Version erstellen und als ZIP speichern.</li>
<li>Debug Version erstellen und starten.</li>
</ol>
<p>Also erstellen wir zu erst ein neues Verzeichnis und nennen es <em>ant, </em>dort legen wir alle Dateien für Ant hinein.<em> E</em>ine<em> build.xml (New XML File&#8230;)</em>, eine <em>build.property </em><em>(New Empty File&#8230;) </em>und <em>eine build.number.<br />
</em></p>
<p>Vorab: hier findet ihr die Anleitung von Apache Ant <a title="Apache Ant Anleitung" href="http://ant.apache.org/manual" target="_blank">http://ant.apache.org/manual</a></p>
<h3>build.xml</h3>
<p>Ein Ant Projekt besteht immer aus einer XML Datei, wir haben unsere build.xml genannt.</p>
<pre class="brush:xml">&lt;?xml version="1.0" encoding="utf-8" ?&gt;
&lt;!-- Jedes Ant Script wird von einem Project Tag umschlossen.
	Dem geben wir den Namen Stechen und als default Target debug.
	Das Hauptverzeichnis soll das gesamte Projektverzeichnis sein, also ../.
--&gt;
&lt;project name="Stechen" default="debug" basedir="../"&gt;

&lt;!--
Vordefinierte Variablen können in Dateien ausgelagert werden.
Variablen werden mit ${name xyz} angesprochen.
Geladen oder erstellt werden diese mit dem Tag property,
sie können aber auch als Parameter übergeben werden.
Mit file geben wir an dass eine Datei geladen werden soll.
Wir wollen die build.property im Hauptverzeichnis unter ant laden.
--&gt;
	&lt;property file="${basedir}/ant/build.property" /&gt;

&lt;!--
Dann erstellen wir noch drei weitere Variablen, die jeweils
den Pfad zu bin, lib und src angeben, ausgehend vom Hauptverzeichnis.
--&gt;
	&lt;property name="bin" value="${basedir}/bin" /&gt;
	&lt;property name="lib" value="${basedir}/lib" /&gt;
	&lt;property name="src" value="${basedir}/src" /&gt;

&lt;!--
Nun beginnen wir mit dem ersten Target und nennen ihn debug.
Eine kleine Beschreibung mit description vergeben wir auch noch.
debug soll:
1. die Buildnummer erhöhen
2. das Projekt kompilieren
3. die SWF starten
--&gt;
	&lt;target name="debug" description="Erstellt eine Debug Version"&gt;

&lt;!--
Mit dem Tag antcall sagen wir dem debug er soll einen anderes Target ausführen.
Man kann sich dies wie Funktionsaufrufe vorstellen. Hier wollen wir gerne buildnumber
ausführen und übergeben noch einen Parameter mit dem namen increment und dem Wert build.
Dieser kann später im Target buildnumber genutzt werden.
--&gt;
		&lt;antcall target="buildnumber"&gt;
			&lt;param name="increment" value="build" /&gt;
		&lt;/antcall&gt;

&lt;!--
Nun starten wir compile und übergeben drei Variablen, dessen Bedeutung später erläutert werden.
--&gt;
		&lt;antcall target="compile"&gt;
			&lt;param name="debugmode" value="true" /&gt;
			&lt;param name="srcpath" value="${src}" /&gt;
			&lt;param name="benchmark" value="false" /&gt;
		&lt;/antcall&gt;

&lt;!--
Mit exec können wir andere Programme starten.
executable gibt das zu startende Programm an.
failonerror besagt, dass dies bei Fehlern abgebrochen werden soll.
Mit arg wird dem Programm alles übergeben, was in line steht.
Aufgelöst würde hier stehen &lt;arg line="../bin/Stechen.swf"
--&gt;
		&lt;exec executable="${flashPlayerDebug}" failonerror="true"&gt;
			&lt;arg line="${bin}/${outputfile}" /&gt;
		&lt;/exec&gt;
	&lt;/target&gt;

&lt;!--
Unser release Target soll bevor es ausgeführt wird noch clean ausführen, dies besagt depends.
--&gt;
	&lt;target name="release" depends="clean" description="Erstellt eine Release Version"&gt;

&lt;!--
buildnumber ausführen für patch Nummer
--&gt;
		&lt;antcall target="buildnumber"&gt;
			&lt;param name="increment" value="patch" /&gt;
		&lt;/antcall&gt;

&lt;!--
Die soeben mit buildnumber geänderte Datei muss nun noch in das temporäre Verzeichnis kopiert werden.
Dateien kopiert man mit copyfile.
src ist die Datei, die kopiert werden soll.
dest ist das Ziel.
Mit forceoverwrite überscheiben wir die bestehende Datei.
--&gt;
		&lt;copyfile src="${src}/BuildVersion.as" dest="${basedir}/tmp/BuildVersion.as" forceoverwrite="true" /&gt;

&lt;!--
Nun kompilieren wir die Dateien im tmp Verzeichnis, welches wir mit clean erstellt haben.
--&gt;
		&lt;antcall target="compile"&gt;
			&lt;param name="debugmode" value="false" /&gt;
			&lt;param name="srcpath" value="${basedir}/tmp" /&gt;
			&lt;param name="benchmark" value="true" /&gt;
		&lt;/antcall&gt;

&lt;!--
Anschließend kann das temporäre Verzeichnis gelöscht werden, mit delete.
--&gt;
		&lt;delete dir="${basedir}/tmp" includeEmptyDirs="true" /&gt;
	&lt;/target&gt;

&lt;!--
compile soll das Projekt mit dem Adobe Flex Compiler kompilieren. Den Source Path übergeben wir mit dem antcall, debugmode und benchmark ebenfalls.
Eine detaillierte Beschreibung bekommt ihr, in dem ihr im cmd [mxmlc -help list details] oder [mxmlc -help list aliases details] eingebt.
-sp alle benötigten Sourcen, das src oder tmp Verzeichnis und der Tweener.
-include-libraries unsere benötigten SWC's, hier nur die assets.swc
Dann kommen Angaben zur SWF, ja könnten in die build.property ausgelagert werden.
Zum Schluss noch den Einstiegspunkt angeben und mit -o die Ausgabedatei Stechen.swf
--&gt;
	&lt;target name="compile"&gt;
		&lt;exec executable="${mxmlc}" failonerror="true"&gt;
			&lt;arg line="
						-sp '${srcpath}' ${addClassPaths} 

						-include-libraries '${lib}/assets.swc'

						-default-size 300 400
						-default-frame-rate 31
						-default-background-color 0xFFFFFF
						-debug=${debugmode}
						-incremental=false
						-benchmark=${benchmark}
						-target-player=10.0.0

						'${srcpath}/Main.as'
						-o '${bin}/${outputfile}'
						"/&gt;
		&lt;/exec&gt;
	&lt;/target&gt;

&lt;!--
clean soll:
1. src Verzeichnis zwischenspeichern, für die Änderungen.
2. DEBUGMODE auf false setzen
3. trace Ausgaben löschen
4. Projekt als ZIP speichern
--&gt;
	&lt;target name="clean"&gt;
		&lt;property name="tmp" value="${basedir}/tmp" /&gt;

&lt;!--
Zur Sicherheit altes tmp löschen.
--&gt;
		&lt;delete dir="${basedir}/tmp" includeEmptyDirs="true" /&gt;

&lt;!--
Verzeichnis kopieren von dir nach todir.
--&gt;
		&lt;copy todir="${tmp}"&gt;
			&lt;fileset dir="${src}" /&gt;
		&lt;/copy&gt;

&lt;!--
Mit replace können Zeichenketten gesucht und ersetzt werden.
In der Datai file und Kodierung encoding.
token wird gesucht und mit value ersetzt.
--&gt;
		&lt;replace file="${tmp}/Main.as" encoding="UTF-8" token="DEBUGMODE:Boolean = true" value="DEBUGMODE:Boolean = false" /&gt;

&lt;!--
Mit replaceregexp können reguläre Ausdrücke benutzt werden.
Wir wollen alle trace Ausgaben löschen, suchen also mit dem Ausdruck in match nach trace(....) und ersetzen diesen mit replace.
flags -g sucht und ersetzt in der ganzen Datei.
fileset dir bedeutet nichts anderes als im gesamten tmp Verzeichnis zu suchen.
--&gt;
		&lt;replaceregexp match="trace\(.*\)" replace="" flags="-g"&gt;
			&lt;fileset dir="${basedir}/tmp" /&gt;
		&lt;/replaceregexp&gt;

&lt;!--
build.number auslesen.
Mit zip ein ZIP File erstellen, unter destfile bin/release/Stechen_(versionsnummer).zip.
basedir wird gezipt.
exludes werden ausgeschlossen, unsere Releaseversionen. Debug habe ich wohl nicht mehr gemacht.
INFO: mit dem Tag ftp könnte man auch Dateien auf einem Server schieben.
--&gt;
		&lt;property file="${basedir}/ant/build.number" /&gt;
		&lt;zip destfile="${bin}/release/${ant.project.name}_${major}.${minor}.${patch}-${build}.zip" basedir="${bin}" excludes="release/**,debug/**" /&gt;

	&lt;/target&gt;

&lt;!--
buildnumber soll für release die patch Nummer erhöhen und im debug die build Nummer.
--&gt;
	&lt;target name="buildnumber"&gt;

&lt;!--
propertyfile build.number laden.
entry nimmt einen Eintrag aus der Datei, der mit key angegeben wird. Wir übergeben diesen als param und haben die Variable increment genannt.
Mit type setzen wir den Datentype des Eintrages fest, wir brauchen ein Integer.
default setzt den Wert auf 0 falls keiner vorhanden ist.
Dann wollen wir mit operation + den Wert um eins erhöhen.
--&gt;
		&lt;propertyfile file="${basedir}/ant/build.number"&gt;
			&lt;entry key="${increment}" type="int" default="0" operation="+" /&gt;
		&lt;/propertyfile&gt;

&lt;!--
Die neuen Versionsnummern auslesen und wie gehabt, unsere BuildVersion.as aktualisieren.
--&gt;
		&lt;property file="${basedir}/ant/build.number" /&gt;
		&lt;replaceregexp file="${src}/BuildVersion.as"
							match="VERSION:String = '(.*)'"
							replace="VERSION:String = '${major}.${minor}.${patch}-${build}'"
							byline="true"  /&gt;
	&lt;/target&gt;

&lt;/project&gt;
</pre>
<h3>build.property</h3>
<p>Die <em>build.property</em> ist eine normale Textdatei und nicht sonderlich spannend. Ant liest diese aus und verwendet die Variablen.</p>
<pre class="brush:bash">#Name der Ausgabedatei
outputfile = Stechen.swf

#Zusätzliche Klassenpfade
addClassPaths = 'c:/Dokumente und Einstellungen/akhon/Eigene Dateien/Classes/greensock-tweening-platform-as3/'

#Flash Player, Debug Player und die Version
flashPlayer = c:/Programme/Adobe/Adobe Flash CS4/Players FlashPlayer.exe
flashPlayerDebug = c:/Develop/flashplayer_10_sa_debug.exe
playerVersion = 10

#Der Pfad zum Flex SDK
flexSDK = c:/Develop/flex_sdk_3.4.1.10084
#Adobe Flex Compiler
#Auch hier können Variablen benutzt werden
mxmlc = ${flexSDK}/bin/mxmlc.exe
</pre>
<h3>build.number</h3>
<p>Die Nummern werden von Ant ausgelesen und in die BuildVersion.as eingefügt. Erhöht werden in diesem Projekt nur <em>patch </em>und <em>build</em></p>
<pre class="brush:bash">#Thu, 12 Aug 2010 09:38:54 +0200
#Build Number
#Tue Aug 10 21:23:55 CEST 2010
major=0
minor=0
patch=1
build=9
</pre>
<h3>ProjektDateien</h3>
<p><a rel="attachment wp-att-563" href="http://www.flashdevelop.de/programmierung/anleitung-teil-3-apache-ant-mit-flashdevelop.html/attachment/stechen-ant">Projekt Stechen mit Ant runterladen</a></p>
<ul>
<li><a title="Anleitung Teil 1 : ActionScript 3 Projekt mit FlashDevelop erstellen" href="../programmierung/anleitung-teil-1-actionscript-3-projekt-mit-flashdevelop-erstellen.html">Anleitung Teil 1 : ActionScript 3 Projekt mit FlashDevelop erstellen</a></li>
<li><a title="Anleitung Teil 2 : Kartenspiel Stechen mit FlashDevelop" href="../programmierung/anleitung-teil-2-kartenspiel-stechen-mit-flashdevelop.html">Anleitung Teil 2 : Kartenspiel Stechen mit FlashDevelop</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.flashdevelop.de/programmierung/anleitung-teil-3-apache-ant-mit-flashdevelop.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

