<?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>Daniela Araujo &#187; BitmapData</title>
	<atom:link href="http://blog.nyan.com.br/pt/tag/bitmapdata/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.nyan.com.br/pt</link>
	<description>Flash, ActionScript e eu.</description>
	<lastBuildDate>Fri, 27 Aug 2010 04:25:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Adeus duplicateMovieClip, mas cadê o clone?</title>
		<link>http://blog.nyan.com.br/pt/2009/03/29/adeus-duplicatemovieclip-mas-cade-o-clone/</link>
		<comments>http://blog.nyan.com.br/pt/2009/03/29/adeus-duplicatemovieclip-mas-cade-o-clone/#comments</comments>
		<pubDate>Mon, 30 Mar 2009 02:43:24 +0000</pubDate>
		<dc:creator>Daniela</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[bitmap]]></category>
		<category><![CDATA[BitmapData]]></category>
		<category><![CDATA[clone]]></category>

		<guid isPermaLink="false">http://blog.nyan.com.br/pt/?p=164</guid>
		<description><![CDATA[No ActionScript 3 não existe o duplicateMovieClip e a DisplayObject não implementa nenhum método de clone (espero que isso não dure muito). Ué, mas qual é o problema? É simples. As vezes não é necessária apenas uma nova instância de um objeto, mas uma que carregue consigo o estado do objeto original. Para isso serve [...]]]></description>
			<content:encoded><![CDATA[<p>No ActionScript 3 não existe o <code>duplicateMovieClip</code> e a <code>DisplayObject</code> não implementa nenhum método de <code>clone</code> (espero que isso não dure muito). Ué, mas qual é o problema? É simples. As vezes não é necessária apenas uma nova instância de um objeto, mas uma que carregue consigo o <strong>estado</strong> do objeto original. Para isso serve (ou serviria) o método <code>clone</code>. Na prática, em um dado momento, elas são iguais e são diferentes. Isso quer dizer que elas possuem <a href="?p=166" target="_self">referência a endereços de memória distintos</a> e se uma delas sofrer alteração  a outra se manterá intacta. Ou seja, no momento em que a instância <code>clone</code> é criada ambas possuem o mesmo <strong>estado</strong>, mas não a mesma <strong>identidade</strong>.</p>
<p>Onde isso faz falta?</p>
<p>Suponha que você queira manter 2 imagens iguais aparecendo na tela para simular um efeito de espelho ou que você precise mostrar um thumb e uma imagem grande e esta imagem é carregada dinâmicamente. Você não pode simplesmente dar <code>addChild</code> uma segunda vez, pois o seu objeto vai se mover. Sim, ele vai sumir do lugar antigo e aparecer no novo lugar, mas por quê? Não era para ser uma referência na memória? Sim, continua sendo, mas&#8230; Todo <code>DisplayObject</code> possui uma propriedade <code>parent</code> que faz referência ao <code>DisplayObjectContainer</code> onde ele foi adicionado. Sempre que o método <code>addChild</code> é chamado o valor da propriedade <code>parent</code> é alterado e consequentemente o <code>DisplayObject</code> deixa de estar no lugar anterior, porque afinal de contas ele só tem um pai.</p>
<p>Para <code>Bitmap</code> felizmente existe um jeitinho, mas para outros <code>DisplayObject</code>, não. Mas o que um <code>Bitmap</code> tem de tão especial? Um objeto <code>Bitmap</code> tem em sua <strong>composição</strong> um objeto <code>BitmapData</code>, e este por sua vez tem o método <code>clone</code> implementado. É na propriedade <code>bitmapData</code> que estão armazenadas todas as características da imagem. Segue um exemplo com um <code>Bitmap</code> gerado pelo código, mais especificamente um quadrado vermelho, veja como é simples:</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">// criando um bitmap (quadrado)</span>
<span style="color: #000000; font-weight: bold;">var</span> bitmap:Bitmap = <span style="color: #000000; font-weight: bold;">new</span> Bitmap<span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> BitmapData<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">100</span>, <span style="color: #cc66cc;">100</span>, <span style="color: #000000; font-weight: bold;">false</span>, 0xBB0000<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #808080; font-style: italic;">// adicionando bitmap no palco</span>
<span style="color: #0066CC;">this</span>.<span style="color: #006600;">addChild</span><span style="color: #66cc66;">&#40;</span>bitmap<span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #808080; font-style: italic;">// criando um novo bitmap com o clone do bitmap data</span>
<span style="color: #000000; font-weight: bold;">var</span> bitmapClone:Bitmap = <span style="color: #000000; font-weight: bold;">new</span> Bitmap<span style="color: #66cc66;">&#40;</span>bitmap.<span style="color: #006600;">bitmapData</span>.<span style="color: #006600;">clone</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #808080; font-style: italic;">// modificando o posicionamento p/ enxergarmos os 2 elementos</span>
bitmapClone.<span style="color: #006600;">x</span> = <span style="color: #cc66cc;">100</span>;
bitmapClone.<span style="color: #006600;">y</span> = <span style="color: #cc66cc;">100</span>;
&nbsp;
<span style="color: #808080; font-style: italic;">// adicionando o clone no palco</span>
<span style="color: #0066CC;">this</span>.<span style="color: #006600;">addChild</span><span style="color: #66cc66;">&#40;</span>bitmapClone<span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>Se uma imagem é carregada dinamicamente o processo é exatamente o mesmo, já que todo objeto <code>Bitmap</code> possui em sua composição um <code>BitmapData</code> sendo ele carregado externamente ou não. Então aproveitamos o que a imagem já tem. Segue um exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">// declara e instancia um objeto loader</span>
<span style="color: #000000; font-weight: bold;">var</span> loader:Loader = <span style="color: #000000; font-weight: bold;">new</span> Loader<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #808080; font-style: italic;">// adiciona listener para o carregmento da imagem</span>
loader.<span style="color: #006600;">contentLoaderInfo</span>.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span>Event.<span style="color: #006600;">COMPLETE</span>, handleLoadComplete<span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #808080; font-style: italic;">// define uma url para carregamento</span>
<span style="color: #000000; font-weight: bold;">var</span> urlRequest:URLRequest = <span style="color: #000000; font-weight: bold;">new</span> URLRequest<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;http://www.nyan.com.br/ico/it.png&quot;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #808080; font-style: italic;">// inicia o processo de carregamento</span>
loader.<span style="color: #0066CC;">load</span><span style="color: #66cc66;">&#40;</span>urlRequest<span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #808080; font-style: italic;">// handle para o evento de complete</span>
<span style="color: #000000; font-weight: bold;">function</span> handleLoadComplete<span style="color: #66cc66;">&#40;</span>event:Event<span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> 
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #808080; font-style: italic;">// cria referencia para a imagem carregada</span>
	<span style="color: #000000; font-weight: bold;">var</span> image:Bitmap = loader.<span style="color: #006600;">content</span> as Bitmap;	
&nbsp;
	<span style="color: #808080; font-style: italic;">// adiciona a imagem no palco</span>
 	<span style="color: #0066CC;">this</span>.<span style="color: #006600;">addChild</span><span style="color: #66cc66;">&#40;</span>image<span style="color: #66cc66;">&#41;</span>;
&nbsp;
	<span style="color: #808080; font-style: italic;">// cria um novo bitmap e adiciona um clone </span>
	<span style="color: #808080; font-style: italic;">// do BitmapData contido no Bitmap carregado</span>
	<span style="color: #000000; font-weight: bold;">var</span> imageCopy:Bitmap = <span style="color: #000000; font-weight: bold;">new</span> Bitmap<span style="color: #66cc66;">&#40;</span>image.<span style="color: #006600;">bitmapData</span>.<span style="color: #006600;">clone</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
	<span style="color: #808080; font-style: italic;">// adicionando copia no palco</span>
	<span style="color: #0066CC;">this</span>.<span style="color: #006600;">addChild</span><span style="color: #66cc66;">&#40;</span>imageCopy<span style="color: #66cc66;">&#41;</span>;
	<span style="color: #808080; font-style: italic;">// mudando posicionamento para enxergarmos</span>
	imageCopy.<span style="color: #006600;">x</span> = <span style="color: #cc66cc;">100</span>;
&nbsp;
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>Tem mais uma coisa interessante nisso: se você declarar um novo <code>Bitmap</code>, atribuindo a ele um <code>BitmapData</code> existente mas sem chamar o método <code>clone</code>, também vai funcionar. A diferença é que se você fizer qualquer alteração no <code>bitmapData</code> através de qualquer um dos <code>Bitmaps</code>, ambos serão alterados, o que não acontece quando invocamos o método <code>clone</code>, pois ele sempre retorna uma nova instância. Este é um bom exemplo pra entender a diferença entre instâncias e referências.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nyan.com.br/pt/2009/03/29/adeus-duplicatemovieclip-mas-cade-o-clone/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
