<?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>Blog Espeo Software &#187; flash</title>
	<atom:link href="http://blog.espeo.pl/tag/flash/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.espeo.pl</link>
	<description>O technologii i biznesie naszym zdaniem</description>
	<lastBuildDate>Mon, 05 Jul 2010 12:16:55 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Actionscript i tworzenie bibliotek zasobów</title>
		<link>http://blog.espeo.pl/2009/02/04/actionscript-i-tworzenie-bibliotek-zasobow/</link>
		<comments>http://blog.espeo.pl/2009/02/04/actionscript-i-tworzenie-bibliotek-zasobow/#comments</comments>
		<pubDate>Wed, 04 Feb 2009 12:21:22 +0000</pubDate>
		<dc:creator>Paweł Gdula</dc:creator>
				<category><![CDATA[technologia]]></category>
		<category><![CDATA[action script]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[flex]]></category>

		<guid isPermaLink="false">http://http://blog.espeo.pl/?p=27</guid>
		<description><![CDATA[Nie trudno wyobrazić sobie sytuację, kiedy w naszej aplikacji Flash/Flex chcielibyśmy wyprowadzić pewne zasoby na zewnątrz programu w celu łatwej ich podmiany/update. Przykładem może być np. pole w naszej nowej super grze, lub sprite przeciwnika z tej samej mega produkcji. Taki element programu będzie opisywany zarówno przez jego wizualna reprezentację jak i przez zestaw parametrów.
W [...]]]></description>
			<content:encoded><![CDATA[<p>Nie trudno wyobrazić sobie sytuację, kiedy w naszej aplikacji Flash/Flex chcielibyśmy wyprowadzić pewne zasoby na zewnątrz programu w celu łatwej ich podmiany/update. Przykładem może być np. pole w naszej nowej super grze, lub sprite przeciwnika z tej samej mega produkcji. Taki element programu będzie opisywany zarówno przez jego wizualna reprezentację jak i przez zestaw parametrów.</p>
<p>W naszej aplikacji nie chcemy znać definicji tych obiektów, chcemy załadować kontener swf zawierający taki obiekt do głównej aplikacji i uzyskać dostęp do zasobów. Do dzieła!</p>
<p>Nasza prosta aplikacja będzie miała za zadanie wzywanie bohaterów którzy uratują świat przed nieuniknioną zagładą. Przygotujmy interface dla takiego bohatera:</p>
<pre>package pl.espeo.hero
{
    import flash.display.Bitmap;

    public interface IHero
    {
         function getName():String;

         function getImage():Bitmap;
    }
}</pre>
<p>Jak widać jedyne co nasz bohater będzie potrafił to powiedzieć jak się nazywa i dać nam swoją pamiątkową fotografię. Dodajmy klasę po której nasi poszczególni bohaterowie będą dziedziczyć:</p>
<div style="overflow:auto;">
<pre>package pl.espeo.hero
{
	import flash.display.Bitmap;
	import flash.display.Sprite;

	public class SuperHero extends implements IHero
	{
		protected var heroName:String;

		protected var heroImage:Bitmap;

		public function SuperHero(heroName:String, heroImage:Bitmap)
		{
			super();
			this.heroName = heroName;
			this.heroImage = heroImage;

		}

		public function getName():String
		{
			return heroName;
		}

		public function getImage():Bitmap
		{
			return heroImage;
		}
	}
}</pre>
</div>
<p>Czas przedstawić  naszych zbawców. Pierwszy z nich to nikt inny jak Rambo:</p>
<div style="overflow:auto;">
<pre>package
{

	import pl.espeo.hero.SuperHero;

	public class Hero extends SuperHero
	{
		[Embed(source="assets/rambo.jpg")]
		private var EmbedImage:Class;

		public function Hero()
		{
			super('Rambo', new EmbedImage());
		}
	}
}</pre>
</div>
<p>Tak przygotowanego bohatera kompilujemy do pliku swf. To samo robimy z naszym następnym bohaterem, Kapitanem Planetą:</p>
<div style="overflow:auto;">
<pre>package
{

	import pl.espeo.hero.SuperHero;

	public class Hero extends SuperHero
	{
		[Embed(source="assets/captain_planet.jpg")]
		private var EmbedImage:Class;

		public function Hero()
		{
			super('Captain Planet', new EmbedImage());
		}
	}
}</pre>
</div>
<p>Mamy więc naszych bohaterów, czas przygotować dla nich podium oraz opracować sposób komunikacji z nimi. Aby nasza komunikacja przebiegała poprawnie, oraz aby nie przywołać zwykłego śmiertelnika w naszej aplikacji będziemy potrzebowali interfacu pl.espeo.hero.IHero. Czas przygotować formę komunikacji z naszym bohaterem:</p>
<div style="overflow:auto;">
<pre>package pl.espeo.hero
{
	import flash.display.Loader;
	import flash.events.Event;
	import flash.events.EventDispatcher;
	import flash.net.URLRequest;

	public class HeroSummoner extends EventDispatcher
	{
		public static const CAPTAIN_PLANET:String = 'CaptainPlanet';

		public static const RAMBO:String = 'Rambo';

		private var loader:Loader = new Loader();

		public function HeroSummoner()
		{
			loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaderCompleteEventHandler);
		}

		public function callHero(heroName:String):void
		{
			loader.load(new URLRequest('assets/' + heroName + '.swf'));
		}

		private function loaderCompleteEventHandler(event:Event):void
		{
			var Hero:Class = event.target.applicationDomain.getDefinition('Hero') as Class;
                        var heroEvent:HeroEvent = new HeroEvent(HeroEvent.SUMMONED);
                        heroEvent.hero = new Hero();
                        dispatchEvent(heroEvent);
		}
	}
}</pre>
</div>
<p>dzięki tak przygotowanej klasie, zostaniemy poinformowani eventem  HeroEvent że nasz bohater jest już na miejscu.</p>
<div style="overflow:auto;">
<pre>package pl.espeo.hero
{
	import flash.events.Event;

	public class HeroEvent extends Event
	{
		public static const SUMMONED:String = 'pl.espeo.hero.HeroEventSummoned';

		public var hero:IHero;

		public function HeroEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
		{
			super(type, bubbles, cancelable);
		}

	}
}</pre>
</div>
<p>Tak może to wyglądać w aplikacji flex:</p>
<div style="overflow:auto;">
<pre>&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" initialize="init()"&gt;
  &lt;mx:Script&gt;
    &lt;![CDATA[
       import pl.espeo.hero.HeroEvent;
       import pl.espeo.hero.HeroSummoner;
       import mx.collections.ArrayCollection;
       import pl.espeo.hero.IHero;

       public static const NO_HERO:uint = 0;

       [Bindable]
       private var heroes:ArrayCollection = new ArrayCollection([{label:'There is no hero!', data:NO_HERO},
								 {label:'First hero', data:HeroSummoner.CAPTAIN_PLANET},
     								 {label:'Second hero', data:HeroSummoner.RAMBO}]);

       private var heroSummoner:HeroSummoner = new HeroSummoner();

       private function init():void
       {
          heroSummoner.addEventListener(HeroEvent.SUMMONED, welcomeMyHero);
       }

       private function summonHero(event:Event):void
       {
            var hero:* = ComboBox(event.target).selectedItem.data;

            if (hero == NO_HERO)
            {
            	return;
            }

            heroSummoner.callHero(hero);
	}

        private function welcomeMyHero(event:HeroEvent):void
	{
  	   heroPanel.status = event.hero.getName();
	   heroImage.source = event.hero.getImage();
	}
      ]]&gt;
    &lt;/mx:Script&gt;
  &lt;mx:HBox&gt;
    &lt;mx: Panel id="heroPanel" x="10" y="10" width="400" height="400" layout="absolute"&gt;
      &lt;mx:Image id="heroImage" x="0" y="0"&gt;&lt;/mx:Image&gt;
    &lt;/mx: Panel&gt;
    &lt;mx:ComboBox id="heroesList" dataProvider="{heroes}" change="{summonHero(event)}"/&gt;
  &lt;/mx:HBox&gt;
&lt;/mx:Application&gt;</pre>
</div>
<p>Dzięki tak przygotowanym obiektom możemy zbudować elastyczny system z zasobami zamkniętymi w łatwych do podmiany plikach. Dodając do tego prosty program narzędziowy wykorzystujący kompilator mxmlc możemy stworzyć furtkę, dzięki której przygotowanie kolejnych elementów nie będzie wymagało ingerencji programisty.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.espeo.pl/2009/02/04/actionscript-i-tworzenie-bibliotek-zasobow/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
