<?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>Nuss... E Agora?!? &#187; Action Script 3.0</title>
	<atom:link href="http://www.nusseagora.blog.br/category/action-script-3-0/feed" rel="self" type="application/rss+xml" />
	<link>http://www.nusseagora.blog.br</link>
	<description></description>
	<lastBuildDate>Fri, 04 Feb 2011 12:56:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.5</generator>
		<item>
		<title>Curso de Actionscript 3.0</title>
		<link>http://www.nusseagora.blog.br/curso-de-actionscript-3-0</link>
		<comments>http://www.nusseagora.blog.br/curso-de-actionscript-3-0#comments</comments>
		<pubDate>Wed, 17 Feb 2010 11:35:38 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Action Script 3.0]]></category>
		<category><![CDATA[Leitura recomendada]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Actionscript 3.0]]></category>
		<category><![CDATA[curso]]></category>

		<guid isPermaLink="false">http://nusseagora.blog.br/?p=950</guid>
		<description><![CDATA[O Everton tem publicado uma série de artigos no Abrindo o Jogo com a premissa de ensinar a programar de forma correta em Actionscript. É uma ótima iniciativa e tenho certeza que grande parte dos leitores daqui do Nuss... E Agora?!? vão se interessar. A série é tão completa que tem material ensinando a configurar [...]]]></description>
			<content:encoded><![CDATA[<p>O Everton tem publicado uma <a href="http://blog.abrindoojogo.com.br/cursos/" target="_blank">série de artigos no Abrindo o Jogo</a> com a premissa de ensinar a programar de forma correta em Actionscript. É uma ótima iniciativa e tenho certeza que grande parte dos leitores daqui do Nuss... E Agora?!? vão se interessar. A série é tão completa que tem <a href="http://blog.abrindoojogo.com.br/cursos/curso-actionscrpt-3-0-modulo-3/" target="_blank">material ensinando a configurar o Flash Develop</a> (a ferramenta utilizada no curso para o desenvolvimento) e até uma <a href="http://groups.google.com.br/group/abrindo-o-jogo---actionscript-30?hl=pt-BR" target="_blank">lista de discussão para tirar suas dúvidas</a>. Eu já faço parte da lista e espero encontrar você também por lá!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nusseagora.blog.br/curso-de-actionscript-3-0/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Portal da Adobe de desenvolvimento de jogos em Actionscript 3.0</title>
		<link>http://www.nusseagora.blog.br/portal-da-adobe-de-desenvolvimento-de-jogos-em-actionscript-3-0</link>
		<comments>http://www.nusseagora.blog.br/portal-da-adobe-de-desenvolvimento-de-jogos-em-actionscript-3-0#comments</comments>
		<pubDate>Fri, 25 Dec 2009 07:05:54 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Action Script 3.0]]></category>
		<category><![CDATA[Leitura recomendada]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Actionscript 3.0]]></category>
		<category><![CDATA[Adobe]]></category>
		<category><![CDATA[desenvolvimento de jogos]]></category>
		<category><![CDATA[jogo]]></category>

		<guid isPermaLink="false">http://nusseagora.blog.br/?p=871</guid>
		<description><![CDATA[O portal é o Adobe Flash Platform Game Technology Center. Ele conta com artigos, tutoriais e códigos em Actionscript 3.0, tanto no Flash quanto no Flex, além de reunir links para outros portais voltados para o desenvolvimento de jogos em SWF, me lembrando muito o que o Gamasutra é para C/C++/OpenGL. Ótimo passo da Adobe [...]]]></description>
			<content:encoded><![CDATA[<p>O portal é o <a href="http://www.adobe.com/devnet/games/" target="_blank">Adobe Flash Platform Game Technology Center</a>. Ele conta com artigos, tutoriais e códigos em Actionscript 3.0, tanto no Flash quanto no Flex, além de reunir links para outros portais voltados para o desenvolvimento de jogos em SWF, me lembrando muito o que o Gamasutra é para C/C++/OpenGL.</p>
<p>Ótimo passo da Adobe que tem por padrão publicar artigos de altíssimo nível. O portal promete derrubar os mitos por trás da programação em actionscript e trazer uma nova era para o desenvolvimento nas ferramentas, o que torna-o extremamente recomendado tanto para quem já tem experiência quanto para quem está perdido e não sabe por onde começar.</p>
<p style="text-align: right;"><em>Valeu ao pessoal da <a href="http://www.loodo.com.br/" target="_blank">Loodo</a> pela dica no <a href="http://twitter.com/Loodo" target="_blank">twitter</a></em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.nusseagora.blog.br/portal-da-adobe-de-desenvolvimento-de-jogos-em-actionscript-3-0/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Padrão de Projetos Observer: Implementando mísseis teleguiados – parte 2</title>
		<link>http://www.nusseagora.blog.br/padrao-de-projetos-observer-implementando-misseis-teleguiados-parte-2</link>
		<comments>http://www.nusseagora.blog.br/padrao-de-projetos-observer-implementando-misseis-teleguiados-parte-2#comments</comments>
		<pubDate>Sun, 29 Nov 2009 13:00:35 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Action Script 3.0]]></category>
		<category><![CDATA[Análise de Sistemas]]></category>
		<category><![CDATA[Padrões de Projeto]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Actionscript 3.0]]></category>
		<category><![CDATA[Observer]]></category>
		<category><![CDATA[Orientação a Objetos]]></category>

		<guid isPermaLink="false">http://nusseagora.blog.br/?p=839</guid>
		<description><![CDATA[Como prometido na 1ª parte do artigo sobre o padrão de projetos Observer, hoje vamos implementá-lo. O nosso escopo é bem simples: temos um jato que foge de mísseis teleguiados. Durante a perseguição, o jato deve poder mudar de direção e os mísseis devem responder a essa mudança adequadamente para não perderem seu alvo. Primeiramente, [...]]]></description>
			<content:encoded><![CDATA[<p>Como prometido na <a href="http://nusseagora.blog.br/padrao-de-projetos-observer-implementando-misseis-teleguiados-parte-1/" target="_self">1ª parte do artigo sobre o padrão de projetos Observer</a>, hoje vamos implementá-lo. O nosso escopo é bem simples: <strong>temos um jato que foge de mísseis teleguiados. Durante a perseguição, o jato deve poder mudar de direção e os mísseis devem responder a essa mudança adequadamente para não perderem seu alvo.</strong></p>
<p><strong><span id="more-839"></span></strong>Primeiramente, nossa implementação do Observer terá 2 interfaces:</p>
<p>-        <em>IObserver</em>, implementada por todos os observadores que devem responder às mudanças no Sujeito</p>
<p>-        <em>ISubject.</em> Implementada pelo Sujeito Observado.</p>
<p><em> </em></p>
<p>Trabalhar com essas interfaces simplifica muito a manutenção do código graças ao <a href="http://nusseagora.blog.br/principio-da-substituicao-de-liskov/" target="_blank">princípio da substituição de Liskov</a> como veremos no final do artigo. Por enquanto, continuaremos com a implementação.</p>
<p>Nossa interface <em>IObserver </em>terá somente o método <em>Atualizar(direcao:String):void. </em>Esse é o único método que todos os outros observadores do meu sistema deverão ter. <em>"E o que ele faz, Tiago?"</em> Esse é o método que atualiza a direção do Observador baseado na direção que o Sujeito Observado tomar em um dado instante.</p>
<pre class="brush:java">package Observer

{
	public interface IObserver
	{
		function Atualizar(direcao:String):void;
	}
}</pre>
<p>Nossos Sujeitos, porém, terão outras funcionalidades: <em>ISubject</em> deverá ter um método para registrar novos observadores e um outro para notificá-los sobre as mudanças de direção.</p>
<pre class="brush:java">package Observer

{
	import Observer.IObserver;

	public interface ISubject
	{
		function RegistrarObservador(observador:IObserver):void;
		function NotificarObservador():void;
	}
}</pre>
<p>Esse é nosso jato, um sujeito observado pelos mísseis teleguiados. Notem que, por ser um sujeito, ele obrigatoriamente deve implementar a interface <em>ISubject</em> que criamos e, consequentemente, também seus métodos.</p>
<pre class="brush:java">package Observer
{

	public class TJato implements ISubject
	{
		private var _observadores:Array;
		private var _direcao:String;

		public function TJato(direcao:String)
		{
		this._observadores = new Array();
		this._direcao = direcao;
		}

/***************************************************************

Adiciona um observador à coleção de observadores do sujeito  ...

... observado, para que ele possa notificá-los quando seu    ...

... estado mudar.

Por ser passado um objeto IObservador, TODA E QUALQUER...

... CLASSE pode se tornar um observador, desde que ...

... implemente a interface IObserver.

****************************************************************/

		public function RegistrarObservador(observador:IObserver):void
		{
			// Adiciono um observador à lista...
			this._observadores.push(observador);

			// ... e aviso a todo mundo quem foi registrado
			trace ("observador registrado: "+ observador);
		}

/***************************************************************

Varre a coleção de observadores, enviando à eles o novo estado.

... Utiliza a metodologia de empurrar dados observados.

****************************************************************/

		public function NotificarObservador():void
		{
			for(var i:int=0; i&lt;this._observadores.length; i++)
			this._observadores[i].Atualizar(this._direcao);
		}

/***************************************************************

Retorna a direção para onde o Jato está voando

****************************************************************/

		public function RetornarDirecao():String
		{
			return this._direcao;
		}

/***************************************************************

Modifica a direção do Jato para uma nova direção

****************************************************************/

		public function ModificarDirecao(direcao:String):void
		{
			this._direcao=direcao;
			this.NotificarObservador();
		}
	}
}</pre>
<p>O míssil terá somente esses 2 métodos. Note que eles são passivos, fazendo com que o funcionamento da classe dependenda exclusivamente do que é passado para ela.</p>
<pre class="brush:java">package Observer
{

	public class TMissil implements IObserver
	{
		private var _direcao:String;

		public function TMissil(direcao:String)
		{
			this._direcao = direcao;
		}

/***************************************************************
Atualiza a direção para onde o Míssil está indo
****************************************************************/

		public function Atualizar(direcao:String):void
		{
			this._direcao = direcao;
		}

/***************************************************************
Retorna a direção para onde o Míssil está voando
****************************************************************/

		public function RetornarDirecao():String
		{
			return this._direcao;
		}
	}
}</pre>
<p>Por fim, nossa classe principal, a TMain. Nela vamos realizar uma sequência de testes da funcionalidade do Observer.</p>
<pre class="brush:java">package
{
	import flash.display.MovieClip;
	import Observer.IObserver;
	import Observer.ISubject;
	import Observer.TJato;
	import Observer.TMissil;
	import Observer.THelicoptero;

	public class TMain extends MovieClip
	{
		private var _jato:TJato;
		private var _missil1:TMissil;
		private var _missil2:TMissil;

		private var _helicoptero:THelicoptero;

		public function TMain()
		{
			//Inicia a direção do Jato e dos mísseis
			this._jato = new TJato("CIMA");
			this._missil1 = new TMissil("BAIXO");
			this._missil2 = new TMissil("PARADO");

			//Exibe a direção dos objetos na tela
			trace( "Direção do jato: "
				  + this._jato.RetornarDirecao() );
			trace( "Direção do míssil 1: "
				  + this._missil1.RetornarDirecao() );
			trace( "Direção do míssil 2: "
				  + this._missil2.RetornarDirecao() );

			//Como os mísseis devem observar o ...
			//... comportamento do jato,...
			//... eles são registrados como...
			//... observadores do jato.

			trace("---------------------------------------------------------");

			trace ("Registrando observadores");
			this._jato.RegistrarObservador(this._missil1);
			this._jato.RegistrarObservador(this._missil2);

			trace("---------------------------------------------------------");

			trace("modificando a direção do jato prá BAIXO");

			//Altera a direção do jato...
			this._jato.ModificarDirecao("BAIXO");

			//... e exibe a direção dos objetos na tela
			trace( "Direção do jato: "
				  + this._jato.RetornarDirecao() );
			trace( "Direção do míssil 1: "
				  + this._missil1.RetornarDirecao() );
			trace( "Direção do míssil 2: "
				  + this._missil2.RetornarDirecao() );

			/*
			Caso um desenvolvedor queira estender a ...
			... funcionalidade do programa ...
			... adicionando um novo tipo de
			... observador, ele pode fazê-lo sem   ...
			... a necessidade de mexer no código atual.
			Para isso, basta ...
			... adicionar sua nova classe ...
			... (THelicoptero, nesse caso), fazê-la ...
			... implementar a interface IObserver ...
			... e adicioná-lo à lista de ...
			... chamadas de objetos de perseguição.
			Veja no exemplo abaixo:
			*/

			trace("---------------------------------------------------------");
			trace("Registrando observadores");

			//O Helicóptero entra na perseguição ...
			this._helicoptero = new THelicoptero("LESTE");
			// ... sendo registrado também como observador
			this._jato.RegistrarObservador(this._helicoptero);

			trace("---------------------------------------------------------");

			//Altera a direção do jato...
			trace("modificando a direção do jato prá CIMA");
			this._jato.ModificarDirecao("CIMA");

			//... e exibe a direção dos objetos na tela
			trace( "Direção do jato: "
				  + this._jato.RetornarDirecao() );
			trace( "Direção do míssil 1: "
				  + this._missil1.RetornarDirecao() );
			trace( "Direção do míssil 2: "
				  + this._missil2.RetornarDirecao() );
			trace( "Direção do helicóptero: "
				  + this._helicoptero.RetornarDirecao() );
		}
	}
}</pre>
<p>A saída desse código é a seguinte:</p>
<pre>Direção do jato: CIMA
Direção do míssil 1: BAIXO
Direção do míssil 2: PARADO
---------------------------------------------------------
Registrando observadores
observador registrado: [object TMissil]
observador registrado: [object TMissil]
---------------------------------------------------------
modificando a direção do jato prá BAIXO
Direção do jato: BAIXO
Direção do míssil 1: BAIXO
Direção do míssil 2: BAIXO
---------------------------------------------------------
Registrando observadores
observador registrado: [object THelicoptero]
---------------------------------------------------------
modificando a direção do jato prá CIMA
Direção do jato: CIMA
Direção do míssil 1: CIMA
Direção do míssil 2: CIMA
Direção do helicóptero: CIMA</pre>
<p><em>"Mas Tiago... Que helicóptero foi aquele ali no meio do código?" </em>Ah é... enquanto estávamos fazendo o código, um outro desenvolvedor achou que helicópteros também são maneiros em perseguições e resolveu implementar um. Notaram como foi fácil adicioná-lo? Bastou que ele implementasse a <em>IObserver</em> que o princípio de Liskov tomou conta do resto. Caso eu queria mais de um Sujeito observado, minha nova classe implementará <em>ISubject</em>. Dessa forma, <strong>adicionar observadores ou sujeitos não implica em modificação alguma no código que já estava pronto.</strong></p>
<p><em>“Outra coisa: e se um observador não quiser mais ser avisado sobre as mudanças do sujeito?”</em> Para isso, a <em>IObserver</em> deverá ter um método <em>removerObservador (observador:IObserver) : void; </em>que vai varrer a lista de observadores e retirá-lo de lá. Isso fica como exercício para quem quiser continuar estudando o padrão.</p>
<p>Na próxima - e última - parte do artigo, disponibilizarei o projeto em AS3.0 e o diagrama de Classes disso tudo ae. Então, até a próxima!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nusseagora.blog.br/padrao-de-projetos-observer-implementando-misseis-teleguiados-parte-2/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Padrão de Projetos Observer: Implementando mísseis teleguiados – parte 1</title>
		<link>http://www.nusseagora.blog.br/padrao-de-projetos-observer-implementando-misseis-teleguiados-parte-1</link>
		<comments>http://www.nusseagora.blog.br/padrao-de-projetos-observer-implementando-misseis-teleguiados-parte-1#comments</comments>
		<pubDate>Sun, 15 Nov 2009 23:13:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Action Script 3.0]]></category>
		<category><![CDATA[Padrões de Projeto]]></category>
		<category><![CDATA[Actionscript 3.0]]></category>
		<category><![CDATA[Análise de Sistemas]]></category>
		<category><![CDATA[Orientação a Objetos]]></category>

		<guid isPermaLink="false">http://nusseagora.blog.br/?p=830</guid>
		<description><![CDATA[Imagine a cena: Você resolve passear com seu filho, prometendo a ele mostrar uma surpresa no final do trajeto. Como qualquer menino inquieto que se preze, ele passa os primeiros 15 minutos do passeio perguntando “Já chegou? Já chegou? Já chegou? Já chegou? Já chegou?”. Esperto como só você seria, resolve cortar as perguntas do [...]]]></description>
			<content:encoded><![CDATA[<p>Imagine a cena: Você resolve passear com seu filho, prometendo a ele mostrar uma surpresa no final do trajeto. Como qualquer menino inquieto que se preze, ele passa os primeiros 15 minutos do passeio perguntando <em>“Já chegou? Já chegou? Já chegou? Já chegou? Já chegou?”</em>. Esperto como só você seria, resolve cortar as perguntas do garoto com uma única resposta: <em>“Quando chegar, eu te aviso”</em>.</p>
<p>Apesar de simples, isso é tudo que você precisa saber antes de ler sobre o padrão Observer (Observador).</p>
<p><span id="more-830"></span></p>
<p>No exemplo anterior temos todas as entidades do padrão Observer bem definidas. Seu filho é o <em>Observador</em>, aquele que está ali ansioso, esperando seu aviso de quando é que a tal surpresa vai chegar. Já você é o que chamamos de <em>Sujeito Observado</em>, quem detém a informação da surpresa, a função de identificar quando ela já pode ser mostrada e avisar a seu observador que chegou a hora dele vê-la.</p>
<p>Como podemos ver, os <strong>Observadores</strong> se registram no <strong>Sujeito Observado</strong>, esperando só o momento de reagir às mudanças no <strong>Sujeito</strong>. Outro exemplo claro da lógica do padrão Observador é assinar os feeds de um site ou uma revista qualquer: todos os assinantes são avisados quando os novos artigos são publicados, bastando esperar para que isso aconteça.</p>
<p>O funcionamento do padrão é simples, mas os ganhos com ele são muito grandes. Com ele você consegue poupar o processador de inúmeras requisições frustradas (como todos os <em>“Já chegou?”</em> antes de realmente ter chegado), deixando para avisar a todos aqueles que se registraram como observadores quando o evento esperado ocorrer. Até que isso ocorra, eles ficam lá, quietinhos, sem encher o saco de ninguém...</p>
<p>O padrão é tão importante que, em muitos casos, seu uso é completamente transparente, sendo já embutido aos frameworks. No Actionscript 3.0, por exemplo, quando utilizamos um eventListerner, não estamos fazendo nada mais que utilizar o padrão. A seguinte linha...</p>
<pre class="brush:java">_botao.addEventListener(MouseEvent.CLICK, aoClicar);</pre>
<p>... na realidade, está registrando o objeto <em>_botao</em> como observador dos eventos do AS3.0. Quando o evento <em>MouseEvent.CLICK</em> ocorrer, <em>_botao</em> engatilhará o método <em>aoClicar</em>.</p>
<p><em>“Ta Tiago, mas o que os mísseis teleguiados tem a ver com isso?”</em> Como não poderia ser diferente, na próxima parte do artigo vocês terão um exemplo de como implementar o Observer, brincando com esses mísseis teleguiado. Até lá!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nusseagora.blog.br/padrao-de-projetos-observer-implementando-misseis-teleguiados-parte-1/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Marios, Máquinas de Estados e o Padrão de Projetos State &#8211; Parte 2</title>
		<link>http://www.nusseagora.blog.br/marios-maquinas-de-estados-padrao-de-projetos-state-parte-2</link>
		<comments>http://www.nusseagora.blog.br/marios-maquinas-de-estados-padrao-de-projetos-state-parte-2#comments</comments>
		<pubDate>Sun, 27 Sep 2009 01:41:47 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Action Script 3.0]]></category>
		<category><![CDATA[Análise de Sistemas]]></category>
		<category><![CDATA[Padrões de Projeto]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[máquina de estados]]></category>
		<category><![CDATA[Mario]]></category>

		<guid isPermaLink="false">http://nusseagora.blog.br/?p=725</guid>
		<description><![CDATA[Antes de continuarem lendo, recomendo que dêem uma parada no artigo sobre o Princípio da Substituição de Liskov. Entender como podemos trocar uma classe mãe por uma filha (ou, no caso do State, uma Interface por uma Implementação) é quase todo o segredo por trás desse padrão de projetos e vai tornar muito maior o [...]]]></description>
			<content:encoded><![CDATA[<p><span style="float: left"><!--rec6--></span>
<p style="margin-left: 70pt; text-align: justify">Antes de continuarem lendo, recomendo que dêem uma parada no artigo sobre o <a href="http://nusseagora.blog.br/principio-da-substituicao-de-liskov/">Princípio da Substituição de Liskov</a>. Entender como podemos trocar uma classe mãe por uma filha (ou, no caso do State, uma Interface por uma Implementação) é quase todo o segredo por trás desse padrão de projetos e vai tornar muito maior o entendimento do que vem pela frente. E não se esqueçam de voltar para o State quando terminarem de ler sobre Liskov!</span></p>
<p><span id="more-725"></span>Para iniciar o State, comecemos encapsulando todos os métodos que identificamos no artigo anterior como alteradores de estados e propagar esses métodos para nossos estados.</p>
<p>"<em>Não entendi nada, Tiago</em>". É simples: colocando na interface os métodos em comum aos estados, farei com que cada um desses estados tenha obrigatoriamente aqueles métodos principais da lógica da máquina de estados. Falando neles, a lista compreende:</p>
<ul>
<li> PegarCogumelo()</li>
<li> PegarEstrela()</li>
<li> PegarFlorDeFogo()</li>
<li> ReceberDano()</li>
</ul>
<p>Nossa interface fica simples assim:</p>
<pre class="brush:java">package Mario
{
	public interface IMario
	{
		function PegarCogumelo():IMario;
		function PegarEstrela():IMario;
		function PegarFlorDeFogo():IMario;
		function ReceberDano():IMario;
		function RetornarTipo():String;
	}
}</pre>
<p>Vejam que todo método vai, obrigatoriamente, retornar um objeto IMario. Para debug, coloquei também um método extra, o “RetornarTipo()”. Ele pode ser chamado pelo código para ver em qual estado o Mario está naquele momento. Após a criação da interface, precisamos agora implementá-la, criando nossos estados. Para quem não se lembra, são:</p>
<ul>
<li>Mario</li>
<li>Super Mario</li>
<li>Mario Flor de Fogo</li>
<li>Mario Invencível</li>
<li>Mario Morto</li>
</ul>
<p>Cada um desses estados é uma classe que implementa nossa interface <strong>IMario</strong>. Vamos então criar um? Prestem bastante atenção ao código:</p>
<pre class="brush:java">package Mario
{
	import Mario.IMario;

	public class TMario implements IMario
	{

		public function TMario(){}

		public function PegarCogumelo():IMario
		{
			trace("-- Mario pega um cogumelo!" +
				"Agora ele é um Super Mario --");
			return new TSuperMario();
		}

		public function PegarEstrela():IMario
		{
			trace("-- Mario pega um starman!" +
				"Agora ele é um Mario Invencível --");
			return new TMarioInvencivel();
		}

		public function PegarFlorDeFogo():IMario
		{
			trace("-- Mario pega uma fire flower!" +
				"Agora ele é um Mario Flor de Fogo --");
			return new TMarioFlorDeFogo();
		}

		public function ReceberDano():IMario
		{
			trace("-- Mario encosta em um" +
				"inimigo e morre! --");
			return new TMarioMorto();
		}

		public function RetornarTipo():String
		{
			return "normal";
		}
	}
}</pre>
<p>Notem que cada método que faz Mario mudar de Estado ou forma retorna seu novo Estado. Lembram da <strong>IMario</strong> com seus métodos que retornam objetos <strong>IMario</strong>? Então... Como os métodos nela<strong> </strong>tem que ser padrão para todos os estados mas são implementados de forma diferente nesses estados, utilizamos o tal Princípio da Substituição de Liskov (você leu, né?). Não entendeu? Bem,  quando nosso método retorna um IMario estamos dizendo para o compilador que o método vai retornar um objeto <strong>IMario</strong> ou um objeto que implemente <strong>IMario</strong>. Utilizando esse princípio, os métodos de mudança de estado poderão retornar qualquer estado que implemente IMario.</p>
<p>Interessante, não? Nosso código fica extremamente manutenível, tornando a adição de um novo estado uma coisa muito fácil. Compare agora com o funcionamento de TSuperMario:</p>
<pre class="brush:java">package Mario
{
	import Mario.IMario;

	public class TSuperMario implements IMario
	{
		public function TSuperMario(){}

		public function PegarCogumelo():IMario
		{
			trace("-- Super Mario pega um cogumelo," +
				"mas nada acontece com ele --");
			return this;
		}

		public function PegarFlorDeFogo():IMario
		{
			trace("-- Mario pega uma fire flower!" +
			        "Agora ele é um Mario Flor de Fogo --");
			return new TMarioFlorDeFogo();
		}

		public function PegarEstrela():IMario
		{
			trace("-- Super Mario pega uma estrela!" +
				"Agora ele é Mario Invencível --");
			return new TMarioInvencivel();
		}

		public function ReceberDano():IMario
		{
			trace("-- Super Mario encosta em um inimigo." +
				"Ele volta a ser Mario --");
			return new TMario();
		}

		public function RetornarTipo():String
		{
			return "super";
		}
	}
}</pre>
<p>Viram? Alguns métodos (como <strong>PegarCogumelo() </strong>e <strong>ReceberDano() </strong>), nesse estado, retornam objetos diferentes, mas que implementam a mesma interface! Temos até um <strong>return this</strong> significando que o objeto não mudou de estado naquele método, mas como <strong>this</strong> também implementa a interface <strong>IMario</strong>, não dá problema algum. Começaram a ver a tabela da 1ª parte sendo implementada, não?</p>
<p>Para poupar espaço, não colocarei o código de todos os estados. Basta ter a implementação de um para entendermos como as coisas estão acontecendo. Além disso, o projeto em Actionscript 3.0 está disponível para download no final do artigo. O importante agora é nos focarmos na nossa classe principal, a TMain.</p>
<pre class="brush:java">public class TMain extends MovieClip
	{
		public function TMain()
		{
			var mario:IMario;

			//Qual é o estado inicial do Mario? ...
			// ... troque-o e veja.que o programa...
			// ... se comportará de forma...
			// ... completamente diferente!
			mario = new TMario();

			// O Mario (ainda no estado anterior)
			// pega um cogumelo
			mario = mario.PegarCogumelo();

			// O Mario (ainda no estado anterior) ...
			//  ... recebe dano
			mario = mario.ReceberDano();

			// O Mario (ainda no estado anterior) ...
			//  ... pega outro cogumelo
			mario = mario.PegarCogumelo();

			// O Mario (ainda no estado anterior) ...
			//  ...  pega uma Fire Flower
			mario = mario.PegarFlorDeFogo();

			// O Mario (ainda no estado anterior) ...
			//  ...  pega um starman
			mario = mario.PegarEstrela();

			// O Mario (ainda no estado anterior) ...
			//  ...  encosta em um inimigo
			mario = mario.ReceberDano();

			// O Mario (ainda no estado anterior) ...
			//  ...  encosta em um inimigo
			mario = mario.ReceberDano();

			// O Mario (ainda no estado anterior) ...
			//  ...  encosta em um inimigo
			mario = mario.ReceberDano();

			trace("-- No final, o Mario é um mario "
     				 + mario.RetornarTipo() +" --");
		}
	}
}</pre>
<p>Na nossa main, basta criar um objeto do tipo inicial (no exemplo acima comecei o "jogo" como <strong>TMario</strong>) e, no decorrer do percurso, realizar as chamadas aos métodos respectivos. O código acima retorna para mim:</p>
<pre>-- Mario pega um cogumelo! Agora ele é um Super Mario --
-- Super Mario encosta em um inimigo. Ele volta a ser Mario --
-- Mario pega um cogumelo! Agora ele é um Super Mario --
-- Mario pega uma fire flower! Agora ele é um Mario Flor de Fogo --
-- Mario pega um starman! Agora ele é um Mario Invencível --
-- Mario Invencível encosta em um inimigo, mas nada acontece com ele --
-- Mario Invencível encosta em um inimigo, mas nada acontece com ele --
-- Mario Invencível encosta em um inimigo, mas nada acontece com ele --
-- No final, o Mario é um mario invencível --</pre>
<p><em>"Tá Tiago, esse trabalho todo prá q?"</em> Esse trabalho todo traz os seguintes benefícios:</p>
<ol>
<li>O código fica muito mais simples de entender sem ifs e cases aninhados uns dentro dos outros.</li>
<li>Simplifica a adição de um novo estado simplesmente fazendo com que ele implemente a interface base.</li>
<li>Modifica o funcionamento do sistema sem que haja a necessidade de prévia programação.</li>
</ol>
<p><em>"Não entendi a 3a coisa da lista, Tiago. Como assim 'modifica o funcionamento'?" </em>Se você trocaro estado inicial ou a chamada a um método, toda a linha de funcionamento do programa poderá ser modificada com o mínimo esforço. Olha o que acontece, por exemplo, se eu não quiser que o Mario pegue a estrela:</p>
<pre>-- Mario pega um cogumelo! Agora ele é um Super Mario --
-- Super Mario encosta em um inimigo. Ele volta a ser Mario --
-- Mario pega um cogumelo! Agora ele é um Super Mario --
-- Mario pega uma fire flower! Agora ele é um Mario Flor de Fogo --
-- Mario encosta em um inimigo! Ele vira um Mario --
-- Mario encosta em um inimigo e morre! --
-- No final, o Mario é um mario morto --</pre>
<p>Ou então, mais engraçado, caso ele comece já invencível:</p>
<pre>-- Mario Invencível pega um cogumelo! Ele continua sendo o Mario Invencível--
-- Mario Invencível encosta em um inimigo, mas nada acontece com ele --
-- Mario Invencível pega um cogumelo! Ele continua sendo o Mario Invencível--
-- Mario pega uma fire flower! Ele continua sendo o Mario Invencível --
-- Mario Invencível pega uma estrela, mas nada acontece com ele --
-- Mario Invencível encosta em um inimigo, mas nada acontece com ele --
-- Mario Invencível encosta em um inimigo, mas nada acontece com ele --
-- Mario Invencível encosta em um inimigo, mas nada acontece com ele --
-- No final, o Mario é um mario invencível --</pre>
<p>Como podemos ver, nosso "jogo" está flexível para qualquer possível acontecimento no decorrer de uma fase: basta que o evento esteja previamente mapeado pela nossa máquina de estados. Existem outras implementações do padrão State, sendo a mais comum o encapsulamento do estado dentro da classe <strong>TMario</strong>. Essa implementação é um pouco mais complexa, mas faz com que trabalhemos o tempo todo com um objeto do tipo <strong>TMario </strong>(e não uma interface <strong>IMario</strong> que, no decorrer da execução do programa, muda seu tipo dependendo do estado atual). No fim, o resultado é o mesmo.</p>
<p>Na próxima parte, vou mostrar para vocês como fica o <a href="http://nusseagora.blog.br/raios-e-uml-parte-3/" target="_blank">Diagrama de Transição de Estados</a> disso aí. E, para fechar, não se esqueçam de pegar o código em Actionscript 3.0 aqui:</p>
<p style="text-align: right;">[download id="2"]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nusseagora.blog.br/marios-maquinas-de-estados-padrao-de-projetos-state-parte-2/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>O Princípio da Substituição de Liskov</title>
		<link>http://www.nusseagora.blog.br/principio-da-substituicao-de-liskov</link>
		<comments>http://www.nusseagora.blog.br/principio-da-substituicao-de-liskov#comments</comments>
		<pubDate>Thu, 03 Sep 2009 13:42:34 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Action Script 3.0]]></category>
		<category><![CDATA[Downloads]]></category>
		<category><![CDATA[Padrões de Projeto]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Princípio da Substituição de Liskov]]></category>

		<guid isPermaLink="false">http://nusseagora.blog.br/?p=627</guid>
		<description><![CDATA[Antes de continuarmos pelos padrões de projeto, acho importante ter aqui uma explicação sobre o Princípio da Substituição de Liskov. Ele é comum nas boas práticas de programação orientada a objetos e seus conceitos aparecem muito ao utilizar diversos padrões de projeto, principalmente no uso de Interfaces em padrões como o State (estado), o Strategy (Estratégia) [...]]]></description>
			<content:encoded><![CDATA[<p><span style="float: left"><!--rec6--></span></p>
<p style="margin-left: 70pt; text-align: justify">Antes de continuarmos pelos padrões de projeto, acho importante ter aqui uma explicação sobre o Princípio da Substituição de Liskov. Ele é comum nas boas práticas de programação orientada a objetos e seus conceitos aparecem muito ao utilizar diversos padrões de projeto, principalmente no uso de Interfaces em padrões como o <a href="http://nusseagora.blog.br/marios-maquinas-de-estados-padrao-de-projetos-state-parte-2/" target="_blank">State</a> (estado), o Strategy (Estratégia) ou os diversos tipos de Factories (Fábricas). Apesar de sua popularidade, ainda sim costuma dar um nó na cabeça de quem está começando.</p>
<p><span id="more-627"></span>Historicamente falando, O princípio foi introduzido em 1993 (muito recente, como podem ver) por <a title="Barbara Liskov" href="http://pt.wikipedia.org/wiki/Barbara_Liskov">Barbara Liskov</a> e Jeannette Wing no artigo <em>Family Values: A Behavioral Notion of Subtyping</em>. Segundo ele:</p>
<p><em> </em></p>
<blockquote><p><em>Se q(x) é uma propriedade demonstrável dos objetos x de tipo T. Então q(y) deve ser verdadeiro para objetos y de tipo S onde S é um subtipo de T.</em></p></blockquote>
<p><em> </em></p>
<p><em>“Mas hein?!?”</em> Apesar de parecer complicado, não é. Traduzindo isso para uma linguagem mais simples:</p>
<blockquote><p><em>Se você pode chamar um método q de uma classe TMae, pode também chamar o método q de uma classe TFilha com herança de TMae.</em></p></blockquote>
<p><em> </em></p>
<p><em>“Bom, melhorou bastante. Mas você não pode explicar melhor não, Tiago?”</em> Se uma classe herda de outra classe, cria-se a relação de “é um”. Explicar isso à fundo é material para um outro artigo, mas basta dizer que quando a classe <strong>TFilha</strong> herdou os métodos de <strong>TMae</strong>, ela passou a ser uma <strong>TMae</strong> estendida, melhorada (daí algumas linguagens utilizarem a palavra <strong>extends</strong> para definir herança): ela tem TUDO que uma <strong>TMae</strong> tem, além das coisas que só <strong>TFilha</strong> tem.</p>
<p>Se <strong>TFilha</strong> tem tudo que a <strong>TMae</strong> tem, as chamadas por <strong>TMae</strong> podem receber uma <strong>TFilha</strong> sem o menor problema. Entendamos o código abaixo:</p>
<p>Primeiro criamos uma classe TMae:</p>
<pre class="brush:java">package Classes
{
	public class TMae
	{
		public function TMae()
		{
		}

		public function Voce(): void
		{
			trace ("Eu sou uma TMae");
		}
	}
}</pre>
<p>Como <strong>TMae</strong> precisa de uma filha, vamos criá-la herdando de sua mãe:</p>
<pre class="brush:java">package Classes
{
	import Classes.TMae;

	public class TFilha extends TMae
	{
		public function TFilha(): void
		{
			super(); // Chama o construtor da classe TMae
  		}

		public override function Voce():void
		{
			trace ("Eu sou uma TFilha");
		}

		public function Mae():void
		{
			// chama o método Voce() da classe mãe
			super.Voce();
		}
	}
}</pre>
<p>Vale lembrar que TFilha pode ter seus extras, como fiz com o método Mae(), que exibe a mãe de filha, o método <em>Voce()</em> de <em>super</em>. Para colocar isso tudo para funcionar, precisamos da classe TMain:</p>
<pre class="brush:java">package
{
	import flash.display.MovieClip;
	import Classes.TMae;
	import Classes.TFilha;

	public class TMain extends MovieClip
	{
		public function TMain(): void
		{
			var mae: TMae = new TMae();
			var filha: TFilha = new TFilha();

			trace ("======= MAE =======");
			this.testarLiskov(mae);

			trace ("======= FILHA =======");
			this.testarLiskov(filha);

			trace ("======= MAE DA FILHA =======");
			filha.Mae();

			//trace ("======= MAE DA MAE? =======");
			//mae.Mae();
		}

		public function testarLiskov(obj:TMae)
		{
			obj.Voce();
		}
	}
}</pre>
<p>A saída disso é a seguinte:</p>
<pre>	======= MAE =======
	Eu sou uma TMae
	======= FILHA =======
	Eu sou uma TFilha
	======= MAE DA FILHA =======
	Eu sou uma TMae</pre>
<p>Para terminar, lembrem-se que o Princípio da Substituição de Liskov <strong>não é comutativo</strong>. Ou seja: <strong>podemos trocar a TMae por uma TFilha, mas não uma TFilha por uma TMae</strong>. Se <strong>TFilha</strong> pode possuir mais métodos e atributos  que <strong>TMae, não temos como chamá-los diretamente por TMae. </strong>Para confirmar, basta descomentar a linha <em>mae.Mae()</em> e ver que o compilador não consegue encontrar o método <em>Mae()</em> em TMae (claro, ele é de TFilha!).</p>
<p style="text-align: right;">Saiba mais sobre o <a href="http://pt.wikipedia.org/wiki/Princ%C3%ADpio_da_substitui%C3%A7%C3%A3o_de_Liskov" target="_blank">Princípio na Wikipédia</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nusseagora.blog.br/principio-da-substituicao-de-liskov/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Decorando um jogo com o padrão de projetos Decorator – Parte 2</title>
		<link>http://www.nusseagora.blog.br/decorando-um-jogo-com-o-padrao-de-projetos-decorator-%e2%80%93-parte-2</link>
		<comments>http://www.nusseagora.blog.br/decorando-um-jogo-com-o-padrao-de-projetos-decorator-%e2%80%93-parte-2#comments</comments>
		<pubDate>Sun, 26 Jul 2009 20:52:36 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Action Script 3.0]]></category>
		<category><![CDATA[Análise de Sistemas]]></category>
		<category><![CDATA[Downloads]]></category>
		<category><![CDATA[Padrões de Projeto]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[UML]]></category>
		<category><![CDATA[Actionscript 3.0]]></category>
		<category><![CDATA[Decorator]]></category>
		<category><![CDATA[jogo]]></category>

		<guid isPermaLink="false">http://nusseagora.blog.br/?p=461</guid>
		<description><![CDATA[Para fechar o artigo anterior, como foi prometido, segue abaixo o diagrama do padrão de projetos Decorator. Apesar da longa explicação e do funcionamento diferente, o diagrama é bem simples: A única coisa diferente nesse diagrama é o fato de TDecoratorBonus possuir, além da herança de TArma,  o atributo _arma do tipo TArma, fazendo assim [...]]]></description>
			<content:encoded><![CDATA[<p><span style="float: left"><script src="http://rec6.via6.com/link.php?action=widget&amp;url=http://nusseagora.blog.br/decorando-um-jogo-com-o-padrao-de-projetos-decorator-%25e2%2580%2593-parte-2%2F" type="text/javascript"></script></span></p>
<p style="margin-left: 70pt; text-align: justify">Para fechar o artigo anterior, como foi prometido, segue abaixo o diagrama do padrão de projetos Decorator. Apesar da longa explicação e do funcionamento diferente, o diagrama é bem simples:</p>
<p style="margin-left: 70pt; text-align: justify"><span id="more-461"></span></p>
<div id="attachment_478" class="wp-caption aligncenter" style="width: 510px"><img class="size-full wp-image-478" title="diagramaDecorator" src="http://nusseagora.dominiotemporario.com/wp-content/uploads/2009/07/diagramaDecorator.jpg" alt="diagramaDecorator" width="500" height="237" /><p class="wp-caption-text">Diagrama do padrão de projetos Decorator</p></div>
<p style="text-align: left;">A única coisa diferente nesse diagrama é o fato de <em>TDecoratorBonus</em> possuir, além da herança de TArma,  o atributo <em>_arma</em> do tipo <em>TArma</em>, fazendo assim que surjam as 2 setas. Além disso, basta não se esquecer que <em>TEfeito</em> e <em>TEncantamento</em> têm, por herança de <em>TDecoratorBonus</em>, seus próprios atributos <em>_arma</em></p>
<p style="text-align: left;">O código do padrão (Action Script 3.0 com projeto Flash CS3) pode ser encontrado aqui: [download id="1"]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nusseagora.blog.br/decorando-um-jogo-com-o-padrao-de-projetos-decorator-%e2%80%93-parte-2/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Decorando um jogo com o padrão de projetos Decorator &#8211; Parte 1</title>
		<link>http://www.nusseagora.blog.br/decorando-um-jogo-com-o-padrao-de-projetos-decorator-parte-1</link>
		<comments>http://www.nusseagora.blog.br/decorando-um-jogo-com-o-padrao-de-projetos-decorator-parte-1#comments</comments>
		<pubDate>Mon, 20 Jul 2009 23:16:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Action Script 3.0]]></category>
		<category><![CDATA[Análise de Sistemas]]></category>
		<category><![CDATA[Game Design]]></category>
		<category><![CDATA[Padrões de Projeto]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[UML]]></category>
		<category><![CDATA[Actionscript 3.0]]></category>
		<category><![CDATA[Decorator]]></category>
		<category><![CDATA[jogo]]></category>
		<category><![CDATA[World of Warcraft]]></category>
		<category><![CDATA[WoW]]></category>

		<guid isPermaLink="false">http://nusseagora.blog.br/?p=403</guid>
		<description><![CDATA[Você e 4 amigos, uma esquadrilha de netherdrakes, helicópteros, grifos e hipogrifos, girando por Oshu’gun enquanto procuram o gigante comedor de dragões Durn the Hungerer. Apesar da ameaça, vocês estão confiantes em seu grupo. O entardecer de Nagrand mostra a silhueta do gigante no horizonte e vocês sabem que a hora chegou. A luta foi [...]]]></description>
			<content:encoded><![CDATA[<p><span style="float: left"><!--rec6--></span></p>
<p style="margin-left: 70pt; text-align: justify"><em>Você e 4 amigos, uma esquadrilha de netherdrakes, helicópteros, grifos e hipogrifos, girando por Oshu’gun enquanto procuram o gigante comedor de dragões Durn the Hungerer. Apesar da ameaça, vocês estão confiantes em seu grupo. O entardecer de Nagrand mostra a silhueta do gigante no horizonte e vocês sabem que a hora chegou.</em></p>
<p><em>A luta foi perfeita: o gigante arrasou com o grupo nos 20s mais estilosos que qualquer monstro do World of Warcraft  já viu. Depois de 15min de brigas sobre quem tem a culpa, alguém descobre que o grupo não estava tão preparado assim. Todos então  resolvem melhorar seus equipamentos... Mas como?</em></p>
<p>Apresento-lhes a morte do grande gigante, o padrão Decorator.</p>
<p><span id="more-403"></span>Vários jogos permitem a seus jogadores um vasto leque de personalização. Eles permitem que configuremos os personagens para que eles sejam o mais parecido possível com a gente em muito mais que só altura e cor de cabelos. Tais jogos permitem que configuremos também a forma com que esse personagem reage ao mundo de jogo, definindo coisas como a velocidade, o tipo de magia que ele usa ou o quanto sustenta de dano. Alguns jogos permitem até que você configure os itens que eles usam. Assim é o <em>World of Warcraft</em>, a febre do momento no mundo dos RPGS massivos (os <em>MMORPGS</em>).</p>
<p>Para vencer os desafios no WoW, os jogadores podem utilizar encantamentos, gemas, itens e diversos efeitos diferentes para aumentar suas características. Se foi isso que faltou no grupo, é isso que daremos a ele.</p>
<p>Comecemos pegando uma das armas dos jogadores. Essa arma exemplo será a classe TArma abaixo:</p>
<pre class="brush:java">package Efeitos
{
	public class TArma
	{
		protected var _nome:String; // Damos um nome qualquer e …
		protected var _efeito:String; // … um efeito…

		public function TArma()
		{
			// ... mas setamos para os valores normais ...
			// ... afinal de contas, a arma não tem nada de especial ...
			// ... ainda
			this._nome = "Arma sem Bônus";
			this._efeito = "";
		}

		public function retornaNome():String
		{ return this._nome; }

		public function retornaEfeito():String
		{ return this._efeito; }
	}
}</pre>
<p>Essa arma é o que os personagens têm no momento e, como já sabemos, isso não é o suficiente. <em>Que tal incluirmos esses tais efeitos e </em><em>encantamentos? Assim estaríamos adicionando a força necessária que os personagens precisam, não Tiago? É só criar uns métodos retornaEncantamento() como você fez e pronto.</em></p>
<p>Não só poderíamos adicionar tais características como várias outras características à arma. O problema é o futuro: a cada vez que um ou vários novos bônus aparecessem no nosso jogo, fossem modificados ou simplesmente excluídos do jogo (o que acontece com muita frequência), teríamos que atualizar essa classe <em>Tarma</em>, bem como TODO O CÓDIGO fazendo as chamadas a esses bônus, no caso deles simplesmente não existirem mais . Isso a torna alvo de alterações cíclicas, o que é longe de ser legal. A idéia aqui é encapsular essas alterações, aplicando-as como um skin ou tema à arma.</p>
<p>Para conseguirmos tal estrutura, usaremos o padrão Decorator: iremos “enfeitar” a arma com quantos bônus especiais precisarmos, aproveitando que ela já possui algo engatilhado para isso (afinal de contas, o método <em>retornaEfeito()</em> não está lá à toa) . Para isso, precisamos inicialmente criar a classe TDecoratorBonus:</p>
<pre class="brush:java">package Efeitos
{
	//import Status.TStatus;

	public class TDecoratorBonus extends TArma
	{
		protected var _arma:TArma; // O Decorador possui uma instância de TArma.

		/***************************************************************
		Construtor da classe. Tem os atributos da TArma a ser decorada ...
		... por ser um tipo de arma.
		****************************************************************/
		public function TDecoratorBonus()
		{
			this._nome = "sem nome";
			this._efeito="";
		}
		/***************************************************************
		Esse método sobrescreve (overrides) o método retornaNome() da ...
		... classe TArma.
		****************************************************************/
		public override function retornaNome():String
		{ return this._nome; }
	}
}</pre>
<p>Essa classe é o coração do nosso decorador: ela é a responsável pela estrutura de encapsulamento dos diversos efeitos. A principal estrela dessa clase é, sem dúvidas, o atributo <em>protected var _arma:TArma</em>. Sua função é guardar a camada de efeitos no caso dessa camada ser envolvida por outra camada. <em>Não entendi nada, Tiago.Como assim camada envolvida por outra camada?</em> Bom, se você pensar bem, estou falando de camadas como aquelas bonecas russas chamadas <a href="http://pt.wikipedia.org/wiki/Matrioshka" target="_blank">matrioshka</a> que guardam outras bonecas idênticas dentro: essa instância seria uma "âncora" para que pudéssemos ir para a "boneca de dentro". Essa boneca de dentro, por sua vez, também tem sua boneca de dentro até o ponto em que não haja mais bonecas dentro.</p>
<p>Cada uma dessas bonecas é, no nosso exemplo, uma das camadas de bônus do padrão decorador, como a classe abaixo:</p>
<pre class="brush:java">package Efeitos
{
	public class TEfeito extends TDecoratorBonus
	{

		/***************************************************************
		Construtor da classe recebe um objeto TArma. Ele é jogado para ...
		... a instância this._arma, encapsulando assim mais um nível para ...
		... a recursividade do padrão.
		****************************************************************/
		public function TEfeito(arma:TArma)
		{
			//Os seguintes atributos vieram por herança de TDecoratorBonus;
			this._arma = arma;
			this._efeito = "+10";
		}

		/***************************************************************
		Método que sobrescreve o retornaEfeito da classe TDecoratorBonus, ...
		... chamando ele próprio na instância this._arma da classe. Dessa ...
		... forma, o método inicia uma cadeia de chamadas que termina ...
		... na classe mais interna, a que não possui uma instância de ...
		... _arma.
		****************************************************************/
		public override function retornaEfeito():String
		{
			// Por ser um padrão de recursividade, é obrigatório que...
			// ... chamemos this._arma.retornaEfeito(). Só assim o ...
			// ... método continuará chamando os efeitos encapsulados.
			return (this._efeito + " " + this._arma.retornaEfeito());
		}
	}
}</pre>
<p>Para fazer as camadas de bônus funcionarem, entra em ação uma coisa chamada <em>recursividade</em>: de forma simplificada (e, quem sabe, um dia eu escreva de forma completa), recursividade é a capacidade de um método ou função chamar a si mesma por várias vezes, retornando resultados para ela própria. Por enquanto, basta saber que o método <em>retornaEfeito() </em>é recursivo por chamae <em>retornaEfeito() </em>novamente, mas agora na camada de dentro (que, como já sabemos, é o atributo <em>this._arma</em>). A camada interna, por sua vez, chama <em>retornaEfeito() </em>de sua <em>this._arma</em>, que chama <em>retornaEfeito() </em>de sua <em>this._arma</em>, que chama <em>retornaEfeito() </em>de sua... Isso só acaba quando chegamos na arma inicial, a <em>TArma</em>, cujo método <em>retornaEfeito() </em>não chama outro <em>retornaEfeito() </em>e sim, exibe seu <em>this._efeito</em>.</p>
<p>Nesse momento, cada <em>retornaEfeito()</em> chamado retorna seu <em>this._efeito </em>para o método <em>retornaEfeito() </em>que o chamou, que concatena com seu próprio <em>this._efeito </em>e retorna para o método <em>retornaEfeito() </em>que o chamou, que concatena com seu próprio <em>this._efeito </em>e retorna para o método <em>retornaEfeito() </em>que o chamou, que concatena com seu próprio <em>this._efeito </em>e retorna... O fim desse ciclo se dá quando não houver mais retornos a chamadas a <em>retornaEfeito()</em>, o que no nosso exemplo acontece na classe <em>TMain</em> mais à frente.</p>
<p>Essa estrutura fica assim:</p>
<div id="attachment_406" class="wp-caption aligncenter" style="width: 407px"><img class="size-full wp-image-406" title="camadasDoDecorator" src="http://nusseagora.dominiotemporario.com/wp-content/uploads/2009/07/camadasDoDecorator.jpg" alt="Camadas" width="397" height="482" /><p class="wp-caption-text">Camadas</p></div>
<p>Com o padrão conseguimos criar uma arma genérica que possui ao seu redor várias camadas de efeitos e que funciona do exato mesmo jeito que uma arma que não possui efeito algum. Além disso, podemos ter diferentes tipos de efeitos, cada um implementado por uma classe diferente. Vou criar agora um TEncantamento:</p>
<pre class="brush:java">package Efeitos
{
	import Efeitos.TDecoratorBonus;

	public class TEncantamento extends TDecoratorBonus
	{

		public function TEncantamento(arma:TArma)
		{
			this._arma = arma;
			this._efeito = "Mongoose";
		}

		public override function retornaEfeito():String
		{
			return (this._arma.retornaEfeito() + " " + this._efeito);
		}
	}
}</pre>
<p>Por fim, basta decorarmos a arma:</p>
<pre class="brush:java">package
{
	import flash.display.MovieClip;
	import Efeitos.TDecoratorBonus;
	import Efeitos.TEncantamento;
	import Efeitos.TEfeito;
	import Efeitos.TArma;

	public class TMain extends MovieClip
	{
		public function TMain()
		{
			// Criamos uma arma qualquer ...
			var arma = new TArma();

			trace ("Antes dos efeitos"); // ... e exibimos seus bônus iniciais.
			trace ( arma.retornaEfeito() );
			trace ();
			trace("---------------------------------------");
			trace ();

			// Agora o padrão entra em ação. Criamos um efeito TEfeito que ...
			// encapsula a arma atual e é passado para ela mesma. Agora ...
			// arma tem dentro de si um TEfeito.
			// Efeito +10
			arma = new TEfeito(arma);

			// Pegamos agora a TEfeito e jogamos dentro de TEncantamento, ...
			// ... passando novamente para a arma. Agora ela tem um ...
			// TEncantamento que tem um TEfeito.
			arma = new TEncantamento(arma);

			// ... que vai dentro de mais um TEfeito ...
			arma = new TEfeito(arma);

			// ... que termina dentro de outro TEfeito
			arma = new TEfeito(arma);

			// Ao realizarmos a chamada a arma.retornaEfeito(), o próprio ...
			// ... método se encarrega de chamar retornaEfeito() das ...
			// ... instâncias encapsuladas, de forma recursiva.

			trace ( arma.retornaEfeito() );
		}
	}
}</pre>
<p>No próximo artigo eu disponibilizo o projeto (Flash CS3) e os arquivos das classes (Action Script 3.0). Falo também do diagrama de classes dessa brincadeira toda. Até lá, caso alguém tenha qualquer dúvida, basta perguntar.</p>
<p><em>No final de uma longa batalha, O gigante finalmente tomba. Seu colossal corpo vai agora servir de alimento para as criaturas que das quais sua linhagem alimentou-se durante eras. Os heróis retornam para suas montarias e tudo volta a ser tranqüilo, graças ao padrão Decorator.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.nusseagora.blog.br/decorando-um-jogo-com-o-padrao-de-projetos-decorator-parte-1/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Wiiflash: Desenvolvendo como gente grande</title>
		<link>http://www.nusseagora.blog.br/wiiflash-desenvolvendo-como-gente-grande</link>
		<comments>http://www.nusseagora.blog.br/wiiflash-desenvolvendo-como-gente-grande#comments</comments>
		<pubDate>Mon, 01 Jun 2009 10:02:04 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Action Script 3.0]]></category>
		<category><![CDATA[Artigos Exteriores]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[jogo]]></category>
		<category><![CDATA[Wii]]></category>
		<category><![CDATA[Wiiflash]]></category>

		<guid isPermaLink="false">http://nusseagora.blog.br/?p=532</guid>
		<description><![CDATA[Essa é uma dica rápida para quem quer desenvolver para um videogame de última geração. No ByteArray você o WiiFlash, uma biblioteca em Action Script 3.0 que liga faz a comunicação entre seu Wiimote e o Adobe Flash, Flex ou Air. Graças à comunicação do Wiimote (e seus metaperiféricos Nunchuk, Wii Balance Board...),  basta reconhecê-lo [...]]]></description>
			<content:encoded><![CDATA[<p><span style="float: left"><!--rec6--></span></p>
<p style="margin-left: 70pt; text-align: justify">Essa é uma dica rápida para quem quer desenvolver para um videogame de última geração. No <a href="http://www.bytearray.org/" target="_blank">ByteArray</a> você o <a href="http://wiiflash.bytearray.org/" target="_blank">WiiFlash</a>, uma biblioteca em Action Script 3.0 que liga faz a comunicação entre seu Wiimote e o Adobe Flash, Flex ou Air.</p>
<p><span id="more-532"></span>Graças à comunicação do Wiimote (e seus metaperiféricos Nunchuk, Wii Balance Board...),  basta reconhecê-lo como um dispositivo Bluetooth no seu PC, rodar o WiiFlash Server e pronto, começar a desenvolver. O problema maior aqui é a documentação toda em inglês, o que pode afastar aqueles que têm dificuldades na língua... Vejam como uma ótima oportunidade para começar a estudá-la!</p>
<p><a href="http://wiiflash.bytearray.org/?page_id=50" target="_blank">Aqui</a> você baixa o Wiiflash com o código fonte, caso queira modificá-lo ou até mesmo adicionar novas funcionalidades à biblioteca.  Na <a href="http://code.google.com/p/wiiflash/">página do Google Project</a> Hosting do WiiFlash você encontra exemplos de como é simples trabalhar com o joystick. Falando nele, <a href="http://wiiflash.bytearray.org/?page_id=25" target="_blank">esse link </a>explica como fazer seu PC reconhecê-lo, podendo trabalhar com mais de 1 ao mesmo tempo.</p>
<p>Esse vídeo em inglês ensina o necessário para que você inicie seu desenvolvimento. Só fique de olho pois ele foi feito em um Mac... Ou seja: nada de Windows Explorer ou Menu Iniciar.</p>
<p>O site <a href="http://www.wiiplayable.com/" target="_blank">wiiplayable</a> possui uma grande lista de jogos em Flash que podem ser jogados diretamente pelo Wii através do Opera.</p>
<p>Abaixo, uma lista de exemplos de uso do wiiflash:</p>
<ul>
<li><a href="http://wiiflash.bytearray.org/?p=160" target="_blank">Simulação de Vôo</a></li>
<li><a href="http://wiiflash.bytearray.org/?p=182" target="_blank">Wiispray</a></li>
<li><a href="http://www.youtube.com/watch?v=tsAt2CASHUM" target="_blank">Wiirimbau</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.nusseagora.blog.br/wiiflash-desenvolvendo-como-gente-grande/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>MVC e o Linkage: O que se deve ou não fazer? (parte 3)</title>
		<link>http://www.nusseagora.blog.br/mvc-e-o-linkage-o-que-se-deve-ou-nao-fazer-parte-3</link>
		<comments>http://www.nusseagora.blog.br/mvc-e-o-linkage-o-que-se-deve-ou-nao-fazer-parte-3#comments</comments>
		<pubDate>Thu, 01 Nov 2007 16:40:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Action Script 3.0]]></category>
		<category><![CDATA[Análise de Sistemas]]></category>
		<category><![CDATA[Padrões de Projeto]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Actionscript 3.0]]></category>
		<category><![CDATA[Linkage]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Padrões de Arquitetura]]></category>
		<category><![CDATA[UML]]></category>
		<category><![CDATA[Unified Modelling Language]]></category>

		<guid isPermaLink="false">http://nusseagora.blog.br/?p=32</guid>
		<description><![CDATA[É gente, depois de um bom tempo enrolado com problemas e mais problemas (aparentemente, até o meu MAC foi clonado), eu consigo finalmente disponibilizá esse código (com a ajuda do Douglas, claro). É o que dizem: "antes tarde do que nunca". Falando sobre o código em si, tanto eu quanto o Mário achamos que ele [...]]]></description>
			<content:encoded><![CDATA[<div style="text-align:justify;">É gente, depois de um bom tempo enrolado com problemas e mais problemas (aparentemente, até o meu MAC foi clonado), eu consigo finalmente disponibilizá esse código (com a ajuda do Douglas, claro). É o que dizem: "antes tarde do que nunca". Falando sobre o código em si, tanto eu quanto o <a href="http://vovoviuarede.blogspot.com/">Mário</a> achamos que ele ficou um cado complexo por causa da Controladora usando o Singleton. Pensei seriamente em tirar esse Singleton, mas resolvi deixá ela assim mesmo para que vocês tenham mais um exemplo do uso do padrão num programa. Basta deixar claro que o Singleton <strong>NÃO É NECESSÁRIO</strong> para o exemplo.</p>
<p>Vocês vão notar que eu deixei até as rotinas de debug (como o trace quando se passa o cursor sobre a bola) dentro da estrutura MVC. Além disso, vão também ver que cada camada do nosso Jogo está num pacote homônimo. Conseqüentemente, a estrutura de pastas também reflete essa lógica, organizando de forma muito melhor os arquivos.</p>
<p>Os comentários não estão muito explicados, mas quem tiver ainda alguma dúvida DEVE recorrer às partes <a href="http://nusseagora.blog.br/mvc-e-o-linkage-o-que-se-deve-ou-nao-fazer-parte-1/">1</a> e <a href="http://nusseagora.blog.br/mvc-e-o-linkage-o-que-se-deve-ou-nao-fazer-parte-2/">2</a> do artigo sobre o MVC, agora vendo como tudo acontece no código.</p>
<p>Bom, espero que isso ajude a vocês (especialmente ao <a href="http://www.aryel-tupinamba.com/blog/">Aryel </a>que pediu o código). Qualquer dúvida, é só comentar!<br />
Até a próxima!</div>
<div style="text-align:right;"><span style="font-size:85%;">Faça o download do código aqui![download id="4"]</span></div>
]]></content:encoded>
			<wfw:commentRss>http://www.nusseagora.blog.br/mvc-e-o-linkage-o-que-se-deve-ou-nao-fazer-parte-3/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

