<?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 do Renato, o Louro</title>
	<atom:link href="http://blog.renatolouro.com.br/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.renatolouro.com.br</link>
	<description>Programação, Desenvolvimento de Jogos, Computação Gráfica etc!</description>
	<lastBuildDate>Fri, 19 Aug 2011 12:35:06 +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>Hits entre Programadores! TOP 6 Músicas Nerds!</title>
		<link>http://blog.renatolouro.com.br/2011/08/hits-entre-programadores-top-6-musicas-nerds/</link>
		<comments>http://blog.renatolouro.com.br/2011/08/hits-entre-programadores-top-6-musicas-nerds/#comments</comments>
		<pubDate>Fri, 19 Aug 2011 12:29:02 +0000</pubDate>
		<dc:creator>renatolouro</dc:creator>
				<category><![CDATA[Posts Rápidos]]></category>
		<category><![CDATA[humor]]></category>
		<category><![CDATA[vídeo]]></category>

		<guid isPermaLink="false">http://blog.renatolouro.com.br/?p=1156</guid>
		<description><![CDATA[Post rápido para animar a sexta feira. Uma pequena lista com as músicas que todos os programadores deveriam conhecer! xD 6o Lugar &#8211; And So You Code Esta encontrei por puro acaso. Eu iria fazer um top 5 e esta me fez criar um 6o lugar. Merece uma menção honrosa. 5o Lugar &#8211; Banda Djafu [...]]]></description>
			<content:encoded><![CDATA[
<p>Post rápido para animar a sexta feira. Uma pequena lista com as músicas que  todos os programadores deveriam conhecer! xD<br />
<span id="more-1156"></span></p>
<h3>6o Lugar &#8211; And So You Code</h3>
<p>Esta encontrei por puro acaso. Eu iria fazer um top 5 e esta me fez criar um 6o lugar. Merece uma menção honrosa.<br />
<iframe width="420" height="345" src="http://www.youtube.com/embed/Eq3CuMDXaPs" frameborder="0" allowfullscreen></iframe></p>
<h3>5o Lugar &#8211; Banda Djafu feat Dj Pacote TCP</h3>
<p>Bem&#8230; A letra é melhor do que o vídeo. <img src='http://blog.renatolouro.com.br/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  Mas vale a conferida!<br />
<iframe width="560" height="345" src="http://www.youtube.com/embed/oK05JSrD_gI" frameborder="0" allowfullscreen></iframe></p>
<h3>4o Lugar &#8211; Write in C</h3>
<p>Foi um clássico no início dos anos 90. Isto explica a ausência de Java e outras linguagens mais novas.<br />
<iframe width="560" height="345" src="http://www.youtube.com/embed/1S1fISh-pag" frameborder="0" allowfullscreen></iframe></p>
<h3>3o Lugar &#8211; Lady Java</h3>
<p>Ótima! Dispensa comentários. Este vídeo já é um clássico na internet e não poderia deixar de posta-lo.<br />
<iframe width="560" height="345" src="http://www.youtube.com/embed/Mk3qkQROb_k" frameborder="0" allowfullscreen></iframe></p>
<h3>2o Lugar &#8211; Code Monkey</h3>
<p>Não sei o que é melhor aqui: Letra, música ou vídeo?<br />
<iframe width="420" height="345" src="http://www.youtube.com/embed/5W_wd9Qf0IE" frameborder="0" allowfullscreen></iframe></p>
<h3>1o Lugar &#8211; Eduardo e Monica nerd</h3>
<p>Na minha opinião a melhor de todas! Muito bom o trabalho!<br />
Para ver a tirinha original:<br />
<a href="http://hacktoon.com/nerdson/os-nerds-tambem-amam-4/">http://hacktoon.com/nerdson/os-nerds-tambem-amam-4/</a><br />
<iframe width="560" height="345" src="http://www.youtube.com/embed/n5fcNYha6Jw" frameborder="0" allowfullscreen></iframe></p>
<h3>Um brinde</h3>
<p>Um outro clássico dos anos 90. Infelizmente não achei a versão musicada. Mas, para não passar em branco, segue a letra:</p>
<p>É pau, é bug<br />
É o fim do programa<br />
É um erro fatal<br />
É o começo do drama </p>
<p>É o Turbo Pascal<br />
Diz que falta um begin<br />
Não me mostra onde,<br />
e capota no fim </p>
<p>É dois, é três<br />
É o quatro-oito-meia<br />
Instrução ilegal<br />
QEMM bloqueia </p>
<p>É o erro no boot<br />
É um disco mordido<br />
Hard disk estragado<br />
Ai meu Deus tô fodido&#8230; </p>
<p>São as barras de espaço<br />
Exibindo um borrão<br />
E a promessa de vídeo<br />
Voando pro chão </p>
<p>É o computador<br />
Me fazendo de otário<br />
Não compila o programa<br />
Salva só o comentário </p>
<p>É ping; é pong<br />
O meu micro reboota<br />
O scan não remove o<br />
Vírus filho da puta </p>
<p>O Windows não entra<br />
Nem volta para o DOS<br />
Não funciona Reset<br />
Detona o CMOS </p>
<p>Abort, Retry<br />
Disco mal-formatado<br />
PCTools não resolve<br />
Norton trava o teclado </p>
<p>É a impressora sem fita<br />
Engolindo o papel<br />
Meu trabalho moído<br />
Cuspido pro céu </p>
<p>São as aulas de março<br />
Mostrando o que são<br />
As promessas de micros<br />
Da Computação. </p>
<p>Autor Desconhecido </p>
<p>&#8212;&#8212;</p>
<p>Abraços!<br />
Renato Louro</p>


<!-- Begin SexyBookmarks Menu Code -->
<div class="sexy-bookmarks sexy-bookmarks-expand sexy-bookmarks-bg-caring">
<ul class="socials">
		<li class="sexy-delicious">
			<a href="http://del.icio.us/post?url=http://blog.renatolouro.com.br/2011/08/hits-entre-programadores-top-6-musicas-nerds/&amp;title=Hits+entre+Programadores%21+TOP+6+M%C3%BAsicas+Nerds%21" rel="nofollow" title="Share this on del.icio.us">Share this on del.icio.us</a>
		</li>
		<li class="sexy-digg">
			<a href="http://digg.com/submit?phase=2&amp;url=http://blog.renatolouro.com.br/2011/08/hits-entre-programadores-top-6-musicas-nerds/&amp;title=Hits+entre+Programadores%21+TOP+6+M%C3%BAsicas+Nerds%21" rel="nofollow" title="Digg this!">Digg this!</a>
		</li>
		<li class="sexy-myspace">
			<a href="http://www.myspace.com/Modules/PostTo/Pages/?u=http://blog.renatolouro.com.br/2011/08/hits-entre-programadores-top-6-musicas-nerds/&amp;t=Hits+entre+Programadores%21+TOP+6+M%C3%BAsicas+Nerds%21" rel="nofollow" title="Post this to MySpace">Post this to MySpace</a>
		</li>
		<li class="sexy-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://blog.renatolouro.com.br/2011/08/hits-entre-programadores-top-6-musicas-nerds/&amp;t=Hits+entre+Programadores%21+TOP+6+M%C3%BAsicas+Nerds%21" rel="nofollow" title="Share this on Facebook">Share this on Facebook</a>
		</li>
		<li class="sexy-twitter">
			<a href="http://twitter.com/home?status=Hits+entre+Programadores%21+TOP+6+M%C3%BAsicas+Nerds%21+-+http://bit.ly/nhsXpO+" rel="nofollow" title="Tweet This!">Tweet This!</a>
		</li>
		<li class="sexy-comfeed">
			<a href="http://blog.renatolouro.com.br/2011/08/hits-entre-programadores-top-6-musicas-nerds/feed" rel="nofollow" title="Subscribe to the comments for this post?">Subscribe to the comments for this post?</a>
		</li>
		<li class="sexy-linkedin">
			<a href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http://blog.renatolouro.com.br/2011/08/hits-entre-programadores-top-6-musicas-nerds/&amp;title=Hits+entre+Programadores%21+TOP+6+M%C3%BAsicas+Nerds%21&amp;summary=Post%20r%C3%A1pido%20para%20animar%20a%20sexta%20feira.%20Uma%20pequena%20lista%20com%20as%20m%C3%BAsicas%20que%20%20todos%20os%20programadores%20deveriam%20conhecer%21%20xD%0D%0A%0D%0A6o%20Lugar%20-%20And%20So%20You%20Code%0D%0AEsta%20encontrei%20por%20puro%20acaso.%20Eu%20iria%20fazer%20um%20top%205%20e%20esta%20me%20fez%20criar%20um%206o%20lugar.%20Merece%20uma%20men%C3%A7%C3%A3o%20honrosa.%0D%0A%0D%0A%0D%0A5o%20Lugar%20-%20Banda%20Djafu%20f&amp;source=Blog do Renato, o Louro" rel="nofollow" title="Share this on Linkedin">Share this on Linkedin</a>
		</li>
		<li class="sexy-google">
			<a href="http://www.google.com/bookmarks/mark?op=add&amp;bkmk=http://blog.renatolouro.com.br/2011/08/hits-entre-programadores-top-6-musicas-nerds/&amp;title=Hits+entre+Programadores%21+TOP+6+M%C3%BAsicas+Nerds%21" rel="nofollow" title="Add this to Google Bookmarks">Add this to Google Bookmarks</a>
		</li>
		<li class="sexy-orkut">
			<a href="http://promote.orkut.com/preview?nt=orkut.com&amp;tt=Hits+entre+Programadores%21+TOP+6+M%C3%BAsicas+Nerds%21&amp;du=http://blog.renatolouro.com.br/2011/08/hits-entre-programadores-top-6-musicas-nerds/&amp;cn=Post%20r%C3%A1pido%20para%20animar%20a%20sexta%20feira.%20Uma%20pequena%20lista%20com%20as%20m%C3%BAsicas%20que%20%20todos%20os%20programadores%20deveriam%20conhecer%21%20xD%0D%0A%0D%0A6o%20Lugar%20-%20And%20So%20You%20Code%0D%0AEsta%20encontrei%20por%20puro%20acaso.%20Eu%20iria%20fazer%20um%20top%205%20e%20esta%20me%20fez%20criar%20um%206o%20lugar.%20Merece%20uma%20men%C3%A7%C3%A3o%20honrosa.%0D%0A%0D%0A%0D%0A5o%20Lugar%20-%20Banda%20Djafu%20f" rel="nofollow" title="Promote this on Orkut">Promote this on Orkut</a>
		</li>
		<li class="sexy-blogger">
			<a href="http://www.blogger.com/blog_this.pyra?t&amp;u=http://blog.renatolouro.com.br/2011/08/hits-entre-programadores-top-6-musicas-nerds/&amp;n=Hits+entre+Programadores%21+TOP+6+M%C3%BAsicas+Nerds%21&amp;pli=1" rel="nofollow" title="Blog this on Blogger">Blog this on Blogger</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>
<!-- End SexyBookmarks Menu Code -->


]]></content:encoded>
			<wfw:commentRss>http://blog.renatolouro.com.br/2011/08/hits-entre-programadores-top-6-musicas-nerds/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Graphol: Por uma nova linguagem</title>
		<link>http://blog.renatolouro.com.br/2011/07/graphol-por-uma-nova-linguagem/</link>
		<comments>http://blog.renatolouro.com.br/2011/07/graphol-por-uma-nova-linguagem/#comments</comments>
		<pubDate>Sun, 24 Jul 2011 05:05:07 +0000</pubDate>
		<dc:creator>renatolouro</dc:creator>
				<category><![CDATA[Programação]]></category>

		<guid isPermaLink="false">http://blog.renatolouro.com.br/?p=1143</guid>
		<description><![CDATA[Já faz tempo que eu digo que iria criar uma nova linguagem de programação. E já havia dito que seu nome seria Graphol. Mesmo aqui neste blog, já favia mencionado o nome Graphol no post Siga um Louco. Creio que tenha sido a primeira vez que falei publicamente sobre Graphol, embora nunca tenha entrado em [...]]]></description>
			<content:encoded><![CDATA[
<p>Já faz tempo que eu digo que iria criar uma nova linguagem de programação. E já havia dito que seu nome seria Graphol. Mesmo aqui neste blog, já favia mencionado o nome Graphol no post <a href="http://blog.renatolouro.com.br/2010/04/siga-um-louco/">Siga um Louco</a>. Creio que tenha sido a primeira vez que falei publicamente sobre Graphol, embora nunca tenha entrado em detalhes. Pessoalmente só havia comentado sobre o que seria Graphol para pouquíssimas pessoas. Mas chegou a hora de disponibilizar a ideia para todos.<br />
<span id="more-1143"></span><br />
É claro que entendo que para que algo ter algum lugar ao sol, é importante que ela tenha uma &#8216;defesa de existência&#8217;. Ela deve ser boa em algo. Talvez ser a melhor sob determinado aspecto. Por exemplo:<br />
- Em geral a linguagem é péssima. Mas é a melhor do mundo para se criar softwares de planilhas eletrônicas.<br />
Pronto, está justificado. Pode não vir a ser muito utilizada no futuro mas tem uma razão de existir.<br />
Mas, brincadeiras a parte, eu realmente estou convencido de que podemos &#8211; eu e aqueles que comprarem a idéia &#8211; contribuir com o mundo da programação oferecendo uma linguagem de programação legal de se trabalhar. Uma linguagem que, sob determinados cenários, possa realmente facilitar o desenvolvimento. </p>
<p>E realmente gostaria de fazer isso com a sua ajuda. Quero que esta linguagem seja também sua. Ela está sendo pensada agora. Se você gostar da idéia geral, se achar que realmente pode &#8216;dar samba&#8217;, é a hora de entrar e fazer a diferença. Pense em todas aquelas coisas legais que você sempre quis ver em uma mesma linguagem de programação? Talvez Graphol seja a linguagem que poderá transformar isso em realidade até porque estou te convidando, formalmente, a fazer parte desta idealização. Convido você a conhecer o site onde estamos <a href="http://draft.graphol.com">rascunhando a linguagem Graphol</a>.</p>
<h3>Mas do que se trata a linguagem?</h3>
<p>O próprio nome Graphol já carrega um significado, já mostra à que veio. Acho que deve ser fácil perceber que o nome Graphol vem de graph (grafo). </p>
<p>No meu curso de faculdade eu fui &#8216;poluído&#8217; pela ideia de grafo de várias maneiras. Minha iniciação científica estava relacionada ao emprego de grafos para determinar regras de negócio em sistemas munidos com IA. </p>
<p>No meu projeto final eu criei um CMS onde os conteúdos, os relacionamentos entre os conteúdos, e o relacionamento entre usuários, permissões e conteúdos eram representados por grafos. Pessoas e conteúdos eram nodos e seus relacionamentos eram arestas. Se um usuário altera um conteúdo, significa a criação de uma aresta com a tag &#8216;alteração&#8217; ligando o nodo daquela pessoa ao nodo daquele conteúdo. Para ver todos os documentos alterados por uma pessoa, bastava perguntar ao CMS por todos os nodos ligados àquela pessoa por nós &#8216;alteração&#8217;.</p>
<p>E não muito tempo depois, comecei a pensar que, a exemplo do CMS, como seria legal implementar uma linguagem que, nativamente, atuasse sobre grafos. Uma linguagem orientada a grafos.  &#8220;Graph Oriented Language&#8221;, Linguagem Orientada a Grafos. Um novo paradigma? Talvez.</p>
<p>Fato é que eu estou incubando esta ideia e vontade de realização a quase uma década debatendo sobre o como seria esta linguagem com pouquíssimas pessoas. Acho que com  umas 5. Entre elas @Chavao e @LucasZeta que estão comigo no projeto.</p>
<p>Ainda não tenho nada de fato. Nem uma especificação formal. Mas acredito que tornar pública a ideia e convocar pessoas interessadas pode ser a única forma de fazer algo acontecer. </p>
<p>Mas antes de dizer sobre Graphol, segue alguns problemas que Graphol terá que se preocupar em solucionar para ser uma linguagem respeitada:</p>
<h3>Composição Vs Herança</h3>
<p>Logo quando foi lançada por Simula 67 e redescoberta por Smalltalk-80, a ideia de herança entre classes sempre foi considerada um dos principais recursos para reuso de código e uma das grandes justificativas para a própria orientação a objetos. Mas, com o tempo, percebemos que a ideia de composição/agregação entre objetos é superior em vários aspectos à ideia de herança. Vários programadores passam a preferir a ideia de composição/agregação entre objetos. A maioria dos Designer Partners dão preferência a &#8216;cooperação&#8217; entre objetos e mecanismos para &#8216;delegação de trabalho&#8217; entre os mesmos do que uma relação &#8216;cristalizada&#8217; em tempo de definição de classes que é dado pelo mecanismo herança.</p>
<p>Mas é interessante perceber que a ideia focal na maioria das linguagens orientadas a objetos  é a herança e não a composição. Para isso basta perceber no esforço envolvido para o programador em implementar uma herança entre classes e uma composição entre elas. Imaginemos um caso hipotético onde queremos que uma classe B reuse as funcionalidades da classe A. Na grande maioria das linguagens, quando tratamos de herança, significa colocar um simples complemento na definição de B como, por exemplo, &#8216;Class B extends A&#8217;. Pronto! B passará a ter acesso a todas as funcionalidades da Classe A.</p>
<p>Já, para implementar uma composição, salvo honrosas exceções como o Ruby, normalmente precisamos:<br />
1- Dizer que B implementa a mesma interface que A;<br />
2- Criar um atributo que aponte para um objeto da classe A;<br />
3- Criar uma maneira, talvez no próprio construtor e/ou por uma função set, de informar para classe B qual é o objeto agregado; e<br />
4- Para cada médodo de A teremos que recriá-lo em B, delegando o trabalho para o método respectivo de A de maneira semelhante à: &#8220;function metodo1(arg a, arg b){ super.metodo1(a,b);}&#8221;. Ou seja, se queremos redefinir apenas um único método, e temos vinte e um métodos em A, teremos que criar 20 construções como estas.</p>
<p>Dado as vantagens da composição sobre a herança, a implementação do primeiro deveria no mínimo ser tão fácil de implementar quanto o segundo. </p>
<p>Graphol deveria privilegiar a cooperação entre objetos e delegação de responsabilidade ao invés da implementação estrutural de relações de herança.</p>
<p>Ruby achou um caminho com o &#8216;Forwardable&#8217;. Creio realmente que este seja um caminho. Mas ainda podemos fazer ainda melhor.</p>
<h3>Orientação a Aspectos</h3>
<p>A orientação a objetos é ótima para definir comportamentos análogos verticalmente, isto é, comportamentos herdados via estrutura de herança. Mas, sozinha, não apresenta uma boa solução para tratamento de funcionalidades secundárias que devem se repetir &#8216;horizontalmente&#8217; por esta estrutura. E, ao encontro desta questão, surgiu a orientação a aspectos.<br />
Mas em geral a orientação a aspecto funciona através de uma extensão feita a uma linguagem hospedeira. Por exemplo temos o AspectJ para Java e o AspectC para a linguagem C.</p>
<p>Acredito que seria ótimo se Graphol, por estrutura, pudesse nativamente, suportar a orientação a aspecto, sem necessitar destas extensões a linguagem raiz. Algumas linguagens, com bons recursos de metaprogramação, são capazes disso. Mas estou falando de algo ainda mais natural para a linguagem.</p>
<h3>Programação Concorrente em Geral</h3>
<p>Acho que não há dúvidas que uma nova linguagem deve se preocupar com concorrência. Ela deve facilitar ao máximo a vida do programador neste aspecto. Podemos pensar em forks, threads, corrotinas, semáforos, memória compartilhada. Programar de forma concorrente não é fácil. Não costuma ser natural ao programador. Mas, por outro lado nunca foi tão necessário. A forma usual de aumentar a capacidade computacional tem sido multiplicar núcleos, processadores, nós de uma nuvem etc. Graphol precisa ajudar o programador a tirar proveito disso.</p>
<h3>E, finalmente, o que é Graphol?</h3>
<p><strong>Introdução</strong><br />
Um grafo pode ser perfeitamente usado para modelar vários aspectos da realidade. Nodos modelam objetos/entidades/coisas e as arestas modelam as relações entre elas. Graphol é uma linguagem que permitirá abstrair problemas como grafos, e nos ajudará a tirar vantagens disso. Neste conceito, nodos são pedaços de código. E as arestas ligam estes pedaços de código trazendo certas propriedades a esta relação.</p>
<p>Inicialmente podemos entender os nós como os velhos objetos OO. Não criamos classes, criamos diretamente estes nodos. O function em Javascript é uma boa aproximação do que é um nodo. Uma característica que acho importante é que um nodo possa receber tags. Tags tem várias utilidades. Ajudarão em buscas globais a estes objetos [Para todos os nós com a tag 'documento' faça], assim como fazer as vezes de uma interface: O objeto x tem a tag &#8216;pessoa&#8217;?</p>
<p>Arestas relacionam estes nodos. Alguns também carregarão uma semântica especial, conforme veremos. Arestas também poderiam ter tipos e/ou nomes. Então, poderíamos fazer facilmente a construção:<br />
[Para cada nó 'documento' ligado por uma aresta 'editadoPor' a este nó 'pessoa' em questão faça] </p>
<p><strong>Composição Vs Herança</strong><br />
Determinados tipos de arestas podem unir nós com a semântica semelhante ao &#8216;Forwardable&#8217; do Rubi. Ou seja, uma aresta do tipo &#8216;Forward&#8217; significaria que, não encontrando uma definição interna, deveria procurá-la pelo grafo indicado pelas arestas &#8216;Forward&#8217;. Então poderíamos não ter herança. Poderíamos simplesmente apontar para os nós para qual um dado nó deveria redirecionar dadas requisições. Filtros sobre determinada aresta poderia prover um controle mais refinado sobre um redirecionamento em particular. Penso em várias outras coisas sobre estas relações. Mas aqui não é o melhor veículo para esgotá-las.</p>
<p><strong>Orientação a Aspectos</strong><br />
Arestas do tipo &#8216;doBefore&#8217; por exemplo poderia ligar um nó a outro que deveria ser acionado primeiro sempre um nó fosse acionado. Então poderia ser válido algo como:<br />
[Para todo nó com a tag 'acesso'<br />
   ligue com doBefore ao nó valide_usuario]</p>
<p><strong>Programação Concorrente em Geral</strong><br />
Que tal uma aresta startToStart para indicar que um nó será executado em paralelo sempre que um outro iniciar a execução? Imagine um gráfico de Gant. Poderiamos indicar um lag de tempo para as arestas como, por exemplo &#8216;comece 2 segundos depois&#8217;. Um nó poderia estar amarrado para começar uma execução em paralelo após 2 outros terminarem a execução e um terceiro já ter iniciado. startToStart, startToFinish, FinishToStart, FinishToFinish posso imaginar utilidades para todas com a idéia de procesamento paralelo.</p>
<p><strong>Padrão Observer (Coração do MVC Clássico)</strong><br />
Nós também guardam informação. Acho que uma aresta com a semântica &#8216;doOnUpdate&#8217; poderia ser muito útil.</p>
<p><strong>Metaprogramação</strong><br />
A estrutura de um programa pode ser expressa em termos de árvore que, por sua vez, é um tipo particular de grafo. Bem, estamos criando uma linguagem cujo objetivo é criar/editar grafos. Não parece que fica trivial pensarmos em mecanismos para que um programa Graphol possa fazer referência e/ou alterar sua própria programação naturalmente, isto é, utilizando os mesmos comandos que tratam de nós e arestas que é exatamente o coração da linguagem? Me parece que a programação reflexiva em Graphol poderá ser encarada de forma &#8216;mais natural&#8217; do que ocorre na maioria das linguagens. Os mecanismos para um programa alterar sua própria estrutura serão exatamente os mesmos pelos quais o programa fará qualquer outra coisa.</p>
<h3>Conclusão</h3>
<p>Meu objetivo não é esgotar o assunto aqui, até porque Graphol é uma linguagem que ainda será inventada! Este post é para abrir possibilidades e gerar discussão. Entendam o post como quase um início de bainstorming.<br />
Mas para tentar dar uma melhor ideia de como eu imagino Graphol, sabe conceitualmente o que é uma rede neural? Vários nós recebendo estímulos, ponderando estes estímulos e emitindo o seu próprio estimulo para a camada seguinte? Bem, isso deveria ser trivialmente implementável com Graphol.<br />
Sabe uma planilha eletrônica onde cada célula se atualiza dado o estímulo de algumas outras? Bem, isso também. <img src='http://blog.renatolouro.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Abraços e, por favor, já que você leu tudo e chegou até aqui: opine!<br />
Conheça o <a href="http://draft.graphol.com/manifesto-graphol/">Manifesto Graphol</a>!</p>


<!-- Begin SexyBookmarks Menu Code -->
<div class="sexy-bookmarks sexy-bookmarks-expand sexy-bookmarks-bg-caring">
<ul class="socials">
		<li class="sexy-delicious">
			<a href="http://del.icio.us/post?url=http://blog.renatolouro.com.br/2011/07/graphol-por-uma-nova-linguagem/&amp;title=Graphol%3A+Por+uma+nova+linguagem" rel="nofollow" title="Share this on del.icio.us">Share this on del.icio.us</a>
		</li>
		<li class="sexy-digg">
			<a href="http://digg.com/submit?phase=2&amp;url=http://blog.renatolouro.com.br/2011/07/graphol-por-uma-nova-linguagem/&amp;title=Graphol%3A+Por+uma+nova+linguagem" rel="nofollow" title="Digg this!">Digg this!</a>
		</li>
		<li class="sexy-myspace">
			<a href="http://www.myspace.com/Modules/PostTo/Pages/?u=http://blog.renatolouro.com.br/2011/07/graphol-por-uma-nova-linguagem/&amp;t=Graphol%3A+Por+uma+nova+linguagem" rel="nofollow" title="Post this to MySpace">Post this to MySpace</a>
		</li>
		<li class="sexy-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://blog.renatolouro.com.br/2011/07/graphol-por-uma-nova-linguagem/&amp;t=Graphol%3A+Por+uma+nova+linguagem" rel="nofollow" title="Share this on Facebook">Share this on Facebook</a>
		</li>
		<li class="sexy-twitter">
			<a href="http://twitter.com/home?status=Graphol%3A+Por+uma+nova+linguagem+-+http://bit.ly/nOOJro+" rel="nofollow" title="Tweet This!">Tweet This!</a>
		</li>
		<li class="sexy-comfeed">
			<a href="http://blog.renatolouro.com.br/2011/07/graphol-por-uma-nova-linguagem/feed" rel="nofollow" title="Subscribe to the comments for this post?">Subscribe to the comments for this post?</a>
		</li>
		<li class="sexy-linkedin">
			<a href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http://blog.renatolouro.com.br/2011/07/graphol-por-uma-nova-linguagem/&amp;title=Graphol%3A+Por+uma+nova+linguagem&amp;summary=J%C3%A1%20faz%20tempo%20que%20eu%20digo%20que%20iria%20criar%20uma%20nova%20linguagem%20de%20programa%C3%A7%C3%A3o.%20E%20j%C3%A1%20havia%20dito%20que%20seu%20nome%20seria%20Graphol.%20Mesmo%20aqui%20neste%20blog%2C%20j%C3%A1%20favia%20mencionado%20o%20nome%20Graphol%20no%20post%20Siga%20um%20Louco.%20Creio%20que%20tenha%20sido%20a%20primeira%20vez%20que%20falei%20publicamente%20sobre%20Graphol%2C%20embora%20nunca%20tenha%20en&amp;source=Blog do Renato, o Louro" rel="nofollow" title="Share this on Linkedin">Share this on Linkedin</a>
		</li>
		<li class="sexy-google">
			<a href="http://www.google.com/bookmarks/mark?op=add&amp;bkmk=http://blog.renatolouro.com.br/2011/07/graphol-por-uma-nova-linguagem/&amp;title=Graphol%3A+Por+uma+nova+linguagem" rel="nofollow" title="Add this to Google Bookmarks">Add this to Google Bookmarks</a>
		</li>
		<li class="sexy-orkut">
			<a href="http://promote.orkut.com/preview?nt=orkut.com&amp;tt=Graphol%3A+Por+uma+nova+linguagem&amp;du=http://blog.renatolouro.com.br/2011/07/graphol-por-uma-nova-linguagem/&amp;cn=J%C3%A1%20faz%20tempo%20que%20eu%20digo%20que%20iria%20criar%20uma%20nova%20linguagem%20de%20programa%C3%A7%C3%A3o.%20E%20j%C3%A1%20havia%20dito%20que%20seu%20nome%20seria%20Graphol.%20Mesmo%20aqui%20neste%20blog%2C%20j%C3%A1%20favia%20mencionado%20o%20nome%20Graphol%20no%20post%20Siga%20um%20Louco.%20Creio%20que%20tenha%20sido%20a%20primeira%20vez%20que%20falei%20publicamente%20sobre%20Graphol%2C%20embora%20nunca%20tenha%20en" rel="nofollow" title="Promote this on Orkut">Promote this on Orkut</a>
		</li>
		<li class="sexy-blogger">
			<a href="http://www.blogger.com/blog_this.pyra?t&amp;u=http://blog.renatolouro.com.br/2011/07/graphol-por-uma-nova-linguagem/&amp;n=Graphol%3A+Por+uma+nova+linguagem&amp;pli=1" rel="nofollow" title="Blog this on Blogger">Blog this on Blogger</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>
<!-- End SexyBookmarks Menu Code -->


]]></content:encoded>
			<wfw:commentRss>http://blog.renatolouro.com.br/2011/07/graphol-por-uma-nova-linguagem/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Replicando Personagens com Objetos em Javascript</title>
		<link>http://blog.renatolouro.com.br/2011/06/replicando-personagens-com-objetos-em-javascript/</link>
		<comments>http://blog.renatolouro.com.br/2011/06/replicando-personagens-com-objetos-em-javascript/#comments</comments>
		<pubDate>Thu, 16 Jun 2011 12:52:22 +0000</pubDate>
		<dc:creator>renatolouro</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[Programação de Jogos]]></category>

		<guid isPermaLink="false">http://blog.renatolouro.com.br/?p=1102</guid>
		<description><![CDATA[Na última postagem desta série, Função para Detectar Colisões em Javascript, vimos como criar uma rotina de verificação de colisão entre as DIVs que representava o personagem e a árvore. Porém a solução ainda estava problemática por, principalmente, dois aspectos: 1- As variáveis eram globais o que dificulta a criação de novos personagens (aventureiros/árvores) e [...]]]></description>
			<content:encoded><![CDATA[
<p><a href="http://blog.renatolouro.com.br/wp-content/uploads/2011/06/multi-homem.jpg"><img src="http://blog.renatolouro.com.br/wp-content/uploads/2011/06/multi-homem.jpg" alt="" title="multi-homem" width="245" height="247" class="alignleft size-full wp-image-1113" /></a>Na última postagem desta série, <a href="http://blog.renatolouro.com.br/2011/01/funcao-para-detectar-colisoes/">Função para Detectar Colisões em Javascript</a>, vimos como criar uma rotina de verificação de colisão entre as DIVs que representava o personagem e a árvore. Porém a solução ainda estava problemática por, principalmente, dois aspectos:</p>
<ul>
<li>1- As variáveis eram globais o que dificulta a criação de novos personagens (aventureiros/árvores) e verificar a colisão entre eles; e</li>
<li>2- A rotina de colisão verificava a área inteira da div e, esta área, era maior do que o desenho do personagem. O ideal seria detectar a colisão apenas considerando a área da &#8216;sola do pé&#8217; do aventureiro ou a &#8216;base do tronco&#8217;, da árvore.</li>
</ul>
<p>Em resposta a estes problemas, passei a utilizar o conceito de objetos em Javascript que encapsula os atributos básicos de um personagem (aventureiro/arvore) tornando relativamente fácil a replicação deles,i.e., <code><strong>arvore=new personagem(...);</strong></code>.</p>
<p>Dentro deste objeto também encapsulamos uma área interna de colisão. Assim a área de colisão não é mais obrigatoriamente toda a área da div. O efeito ficou bem melhor do que o apresentado na postagem anterior.</p>
<p>Como última alteração significativa, ao criar um novo objeto personagem, automaticamente o novo objeto é inserido num array de personagens. Com isso fica fácil percorrer todo o array para verificar se um objeto em movimento colidiu com algum outro. Mas, antes de ver como ficou o código, veremos a aplicação em funcionamento:<br />
<span id="more-1102"></span></p>
<div id=divCola>
<div id=divCampo style="border-style:solid; border-width:1px; background-image:url(http://blog.renatolouro.com.br/wp-content/uploads/Anime/terra.png); position:relative; width:580px; height:300px">
<div id=divAnime style="border-style:solid; border-width:0px; position:absolute; top:0px; left:0px;  width:96px; height:96px; background-image:url(http://blog.renatolouro.com.br/wp-content/uploads/Anime/andando.png);"></div>
<div id=divArvore style="border-style:solid; border-width:0px; position:absolute; top:100px; left:150px; width:96px; height:96px; background-image:url(http://blog.renatolouro.com.br/wp-content/uploads/Anime/arvore.png);"></div>
<div id=divAnime2 style="border-style:solid; border-width:0px; position:absolute; top:200px; left:245px;  width:96px; height:96px; background-image:url(http://blog.renatolouro.com.br/wp-content/uploads/Anime/andando.png);"></div>
</div>
<p>Movimentação Aventureiro 1: (w,d,x,a) <br />
Movimentação Aventureiro 2: (u,k,m,h) 
</div>
<p>Legal?<br />
Mas se você brincou um pouco perceberá que ainda temos um problema para definir que div ficará sobre a outra. Por exemplo o tronco e raiz da árvore fica sobre a cabeça de um destes aventureiros, quando posicionamos este aventureiro embaixo da árvore. Sem falar que a div de um dos aventureiros etá sempre sobre a div do outro. Isto causa o efeito de pé de um na cabeça do outro. Mas resolver esta questão será assunto para a próxima postagem da série. No momento vamos analisar o como o código evoluiu até agora.</p>
<p>A primeira grande evolução, é um array de personagens. arrPersonagens se encarregará de guardar numa única estrutura todos os personagens (arvores e aventureiros)</p>
<blockquote><p>
<code><br />
var arrPersonagens=new Array();<br />
</code></p></blockquote>
<p>Todas as variáveis, que antes eram globais, foram reorganizadas. Destas, as variáveis que eram relativas diretamente ao personagem passaram para uma estrutura única chamada personagem. Também passamos para esta mesma estrutura as funções diretamente responsáveis por manipular a mesma.O código desta estrutura está abaixo, bem comentado, com seus atributos e funções internas.</p>
<blockquote><p><code><br />
function personagem(piAreaColX, piAreaColY, piAreaColComp, piAreaColAlt, piFrameAtual, piTiraAtual, psDivPersonagem, piTamSprites)<br />
{<br />
   var id=-1;            //identifica o objeto no arrPersonagens<br />
   this.iPosTop;         //posição Y do início da div do personagem<br />
   this.iPosLeft;        //posição X do início da div do personagem<br />
   this.iAreaColX;       //posição X, relativa a iPosLeft do início da área de colisão<br />
   this.iAreaColY;       //posição Y, relativa a iPosTop do início da área de colisão<br />
   this.iAreaColComp;    //Largura da área de colisão partindo de iAreaColX<br />
   this.iAreaColAlt;     //Largura da área de colisão partindo de iAreaColY<br />
   var iFrameAtual=0;    //A Dupla iTiraAtual,iFrameAtual marcam em conjunto [+]<br />
   var iTiraAtual=0;     //   a imagem corrente do spritesheet<br />
   var divPersonagem;    //Faz referência ao objeto html onde será renderizado o personagem<br />
   var iTamSprites=96;   //Largura e altura de cada imagem do spritesheet e div<br />
   var leftKey;          //Tecla que moverá o personagem para a esquerda<br />
   var rightKey;         //Tecla que moverá o personagem para a direita<br />
   var upKey;            //Tecla que moverá o personagem para cima<br />
   var downKey;          //Tecla que moverá o personagem para baixo<br />
   var sStatus='stoped'; //Status do personagem e animação ('stoped'|'walking')<br />
   var cVoltadoPara='L'; //Direção para onde o personagem está voltado ('N'|'L'|'S'|'O')<br />
   this.bMove=false;     //Informa se um personagem é móvel (aventureiro) ou estático (árvore)</p>
<p>   // Verifica se existe colisão entre o objeto corrente e um outro recebido por parâmetro<br />
   this.colide = function(ppersonagem){...}</p>
<p>   //Informa que o personagem é móvel e informa as teclas de comando<br />
   this.addMov = function( pUpKey, pRightKey, pDownKey, pLeftKey) {...}</p>
<p>   //Modifica o background da div em função da dupla (iTiraAtual,iFrameAtual)<br />
   var paint = function() {...} </p>
<p>   //Realiza a movimentação do personagem se sStatus=='walking'<br />
   this.anime = function() {...}</p>
<p>   //verifica a tecla pressionada e seta iTiraAtual para a animação certa<br />
   this.initAnime = function(keyCode){...}</p>
<p>   //Interrompe a animação setando sStatus='stoped'<br />
   this.stopAnime = function(keyCode) {...}</p>
<p>   /***** Inicializa o Personagem *****/<br />
   divPersonagem=document.getElementById(psDivPersonagem);<br />
   this.iPosTop=parseInt(divPersonagem.style.top);<br />
   this.iPosLeft=parseInt(divPersonagem.style.left);<br />
   this.iAreaColX=piAreaColX;<br />
   this.iAreaColY=piAreaColY;<br />
   this.iAreaColComp=piAreaColComp;<br />
   this.iAreaColAlt=piAreaColAlt;<br />
   iTamSprites=piTamSprites;<br />
   id=arrPersonagens.length;<br />
   arrPersonagens[id]=this;<br />
   paint();<br />
   /***** Fim da Inicialização do Personagem *****/<br />
}<br />
</code></p></blockquote>
<p>Também merece destaque a alteração feita no nosso timeout_trigger. Agora, como ele é responsável por animar vários objetos, ele percorre o arrPersonagens e, caso o personagem tenha movimento (personagem.bMove) é chamada a função de animação do mesmo.</p>
<blockquote><p><code><br />
function timeout_trigger() {<br />
    for(i=0;i<arrPersonagens.length;i++) {<br />
       var personagem    = arrPersonagens[i];<br />
       if(personagem.bMove) personagem.anime();<br />
    }<br />
}<br />
</code></p></blockquote>
<p>Ao final, a criação dos personagens propriamente dita:</p>
<blockquote><p><code><br />
perAventureiro = new personagem(20,60,26,36,0,0,'divAnime', 96);<br />
perAventureiro2 = new personagem(20,60,26,36,0,0,'divAnime2', 96);<br />
perArvore = new personagem(20,60,26,36,0,0,'divArvore', 96);</p>
<p>perAventureiro.addMov(87,68,88,65);<br />
perAventureiro2.addMov(85,75,77,72);<br />
timeout_init();<br />
</code></p></blockquote>
<p>Querendo ver o código completo, fique a vontade para baixar o script <a href="http://blog.renatolouro.com.br/wp-content/uploads/Anime/anime_obj.js" target=_blank>aqui</a>.</p>
<p>Pendências para a próxima postagem:</p>
<ol>
<li>Variar o z-index de acordo com a div do personagem; e</li>
<li>Criar um novo personagem sem precisar, previamente, criar a div para o mesmo no html. Ou seja, automaticamente criar a div utilizando o DOM.</li>
</ol>
<p>Abraços e até a próxima!<br />
<script type="text/javascript" src="http://blog.renatolouro.com.br/wp-content/uploads/Anime/anime_obj.js"></script></p>


<!-- Begin SexyBookmarks Menu Code -->
<div class="sexy-bookmarks sexy-bookmarks-expand sexy-bookmarks-bg-caring">
<ul class="socials">
		<li class="sexy-delicious">
			<a href="http://del.icio.us/post?url=http://blog.renatolouro.com.br/2011/06/replicando-personagens-com-objetos-em-javascript/&amp;title=Replicando+Personagens+com+Objetos+em+Javascript" rel="nofollow" title="Share this on del.icio.us">Share this on del.icio.us</a>
		</li>
		<li class="sexy-digg">
			<a href="http://digg.com/submit?phase=2&amp;url=http://blog.renatolouro.com.br/2011/06/replicando-personagens-com-objetos-em-javascript/&amp;title=Replicando+Personagens+com+Objetos+em+Javascript" rel="nofollow" title="Digg this!">Digg this!</a>
		</li>
		<li class="sexy-myspace">
			<a href="http://www.myspace.com/Modules/PostTo/Pages/?u=http://blog.renatolouro.com.br/2011/06/replicando-personagens-com-objetos-em-javascript/&amp;t=Replicando+Personagens+com+Objetos+em+Javascript" rel="nofollow" title="Post this to MySpace">Post this to MySpace</a>
		</li>
		<li class="sexy-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://blog.renatolouro.com.br/2011/06/replicando-personagens-com-objetos-em-javascript/&amp;t=Replicando+Personagens+com+Objetos+em+Javascript" rel="nofollow" title="Share this on Facebook">Share this on Facebook</a>
		</li>
		<li class="sexy-twitter">
			<a href="http://twitter.com/home?status=Replicando+Personagens+com+Objetos+em+Javascript+-+http://bit.ly/mjSELC+" rel="nofollow" title="Tweet This!">Tweet This!</a>
		</li>
		<li class="sexy-comfeed">
			<a href="http://blog.renatolouro.com.br/2011/06/replicando-personagens-com-objetos-em-javascript/feed" rel="nofollow" title="Subscribe to the comments for this post?">Subscribe to the comments for this post?</a>
		</li>
		<li class="sexy-linkedin">
			<a href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http://blog.renatolouro.com.br/2011/06/replicando-personagens-com-objetos-em-javascript/&amp;title=Replicando+Personagens+com+Objetos+em+Javascript&amp;summary=Na%20%C3%BAltima%20postagem%20desta%20s%C3%A9rie%2C%20Fun%C3%A7%C3%A3o%20para%20Detectar%20Colis%C3%B5es%20em%20Javascript%2C%20vimos%20como%20criar%20uma%20rotina%20de%20verifica%C3%A7%C3%A3o%20de%20colis%C3%A3o%20entre%20as%20DIVs%20que%20representava%20o%20personagem%20e%20a%20%C3%A1rvore.%20Por%C3%A9m%20a%20solu%C3%A7%C3%A3o%20ainda%20estava%20problem%C3%A1tica%20por%2C%20principalmente%2C%20dois%20aspectos%3A%0D%0A%0D%0A%091-%20As%20vari%C3%A1veis%20e&amp;source=Blog do Renato, o Louro" rel="nofollow" title="Share this on Linkedin">Share this on Linkedin</a>
		</li>
		<li class="sexy-google">
			<a href="http://www.google.com/bookmarks/mark?op=add&amp;bkmk=http://blog.renatolouro.com.br/2011/06/replicando-personagens-com-objetos-em-javascript/&amp;title=Replicando+Personagens+com+Objetos+em+Javascript" rel="nofollow" title="Add this to Google Bookmarks">Add this to Google Bookmarks</a>
		</li>
		<li class="sexy-orkut">
			<a href="http://promote.orkut.com/preview?nt=orkut.com&amp;tt=Replicando+Personagens+com+Objetos+em+Javascript&amp;du=http://blog.renatolouro.com.br/2011/06/replicando-personagens-com-objetos-em-javascript/&amp;cn=Na%20%C3%BAltima%20postagem%20desta%20s%C3%A9rie%2C%20Fun%C3%A7%C3%A3o%20para%20Detectar%20Colis%C3%B5es%20em%20Javascript%2C%20vimos%20como%20criar%20uma%20rotina%20de%20verifica%C3%A7%C3%A3o%20de%20colis%C3%A3o%20entre%20as%20DIVs%20que%20representava%20o%20personagem%20e%20a%20%C3%A1rvore.%20Por%C3%A9m%20a%20solu%C3%A7%C3%A3o%20ainda%20estava%20problem%C3%A1tica%20por%2C%20principalmente%2C%20dois%20aspectos%3A%0D%0A%0D%0A%091-%20As%20vari%C3%A1veis%20e" rel="nofollow" title="Promote this on Orkut">Promote this on Orkut</a>
		</li>
		<li class="sexy-blogger">
			<a href="http://www.blogger.com/blog_this.pyra?t&amp;u=http://blog.renatolouro.com.br/2011/06/replicando-personagens-com-objetos-em-javascript/&amp;n=Replicando+Personagens+com+Objetos+em+Javascript&amp;pli=1" rel="nofollow" title="Blog this on Blogger">Blog this on Blogger</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>
<!-- End SexyBookmarks Menu Code -->


]]></content:encoded>
			<wfw:commentRss>http://blog.renatolouro.com.br/2011/06/replicando-personagens-com-objetos-em-javascript/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Tron: O jogo das Light Cycles em Javascript</title>
		<link>http://blog.renatolouro.com.br/2011/02/tron-o-jogo-das-light-cycles-em-javascript/</link>
		<comments>http://blog.renatolouro.com.br/2011/02/tron-o-jogo-das-light-cycles-em-javascript/#comments</comments>
		<pubDate>Sat, 26 Feb 2011 10:11:02 +0000</pubDate>
		<dc:creator>renatolouro</dc:creator>
				<category><![CDATA[Programação de Jogos]]></category>
		<category><![CDATA[aprender programação]]></category>
		<category><![CDATA[javascript html5]]></category>

		<guid isPermaLink="false">http://blog.renatolouro.com.br/?p=1051</guid>
		<description><![CDATA[As “Light Cycles” São aquelas motos futuristas do filme Tron, que deixam um rastro luminoso sólido por onde passam. No filme, ocorre um duelo entre duas destas motos e, o objetivo deste duelo é fazer seu adversário colidir com o rastro luminoso de uma das duas motos. Outra característica desta moto e que elas viram [...]]]></description>
			<content:encoded><![CDATA[
<p><a href="http://blog.renatolouro.com.br/wp-content/uploads/2011/02/tron2testscreeingsdcc_io9.flv.jpg"><img src="http://blog.renatolouro.com.br/wp-content/uploads/2011/02/tron2testscreeingsdcc_io9.flv-300x145.jpg" alt="Tron Legacy Light Cycle" title="tron2testscreeingsdcc_io9.flv" width="300" height="145" class="alignleft size-medium wp-image-1083" /></a>As “Light Cycles” São aquelas motos futuristas do filme Tron, que deixam um rastro luminoso sólido por onde passam. No filme, ocorre um duelo entre duas destas motos e, o objetivo deste duelo é fazer seu adversário colidir com o rastro luminoso de uma das duas motos. Outra característica desta moto e que elas viram sempre num ângulo de 90o.<br />
Aproveitando a biblioteca criada no post  <a href="http://blog.renatolouro.com.br/2011/01/canvas-manipulacao-pixel-a-pixel-pixel-based-em-javascript/">Canvas: Manipulação Pixel a Pixel “Pixel Based” em Javascript</a>, criei este pequeno jogo que ilustra o funcionamento da biblioteca. Então este jogo é para você que quer apenas brincar, ou para você que deseja aprender a programar em javascript utilizando o canvas do html5.</p>
<p><STRONG style="color:#ff0000;">ATENÇÃO: O Jogo Tron não funciona no IE 7 ou 8. Para rodá-lo é necessário utilizar o Firefox, Safari, Chrome, Opera ou o IE 9 beta!</STRONG></p>
<p><span id="more-1051"></span></p>
<p>Os comandos são simples: (Q) e (W) fazem a moto vermelha virar para esquerda ou direita e (O) e (P) viram a moto azul. (Enter) inicia o jog. Quer jogar de novo? Então de (F5), desculpe. <img src='http://blog.renatolouro.com.br/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<p>Lembre-se apenas que os comandos viram para a esquerda e a direita da própria moto! Isto significa que se a moto estiver indo para baixo, o botão da direita irá levar a moto para o lado esquerdo da tela! Fácil não? <img src='http://blog.renatolouro.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Então chame seu colega ao lado e bom jogo!</p>
<div class="area">
<table border=0 cellpadding=0 cellspacing=0>
<tr>
<td>
<script type="text/javascript"><!--
google_ad_client = "ca-pub-7724156431006168";
/* blogo para App JS Blog Louro */
google_ad_slot = "1319336980";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script><script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</td>
</tr>
<tr>
<td>
      <canvas id="arena" width="468px" height="300px" style="background-color:#000000; border-width:0px; border-style: solid; border-color: #00FF00;"><br />
         This text is displayed if your browser does not support HTML5 Canvas.<br />
	  </canvas>
</td>
</tr>
<tr>
<td>
<table style="width:468px; background-color:#000000; border-width:1px; border-style: solid; border-color: #00FF00;">
<tr>
<td style="color:#FF0000;">Moto Vermelha:<br />
 (Q) &#8211; Esquerda; e<br />
(W) &#8211; Direita.</td>
<td style="color:#00FF00;">(ENTER)<br />Inicia o<br />Jogo</td>
<td style="color:#0000FF;">Moto Azul:<br />
 (O) &#8211; Esquerda; e<br />
(P) &#8211; Direita.</td>
</tr>
</table>
</td>
</tr>
</table></div>
<p>Para quem quer aprender a programar, aprender a programar com o canvas, ou simplesmente quer dá uma olhada, fique a vontade para baixar <a href="http://blog.renatolouro.com.br/wp-content/uploads/tron/tron.js">o código fonte do jogo tron</a> que está bem documentado.</p>
<p>Quem acompanhou os últimos posts sobre programação de jogos e a programação com canvas &#8211; se é que existe alguém que ainda acompanha as postagens deste blog :/ &#8211; não deve ter problemas para entender o código que, na prática, junta tudo o que temos visto.</p>
<p>Mas, de qualquer forma, em caso de dúvidas, me pré-disponho a tira-las.</p>
<p>Forte abraço,<br />
Renato </p>
<p><script type="text/javascript" src="http://blog.renatolouro.com.br/wp-content/uploads/bcv/bitmapcanvas_0_0_2.js"></script><br />
<script type="text/javascript" src="http://blog.renatolouro.com.br/wp-content/uploads/tron/tron.js"></script></p>


<!-- Begin SexyBookmarks Menu Code -->
<div class="sexy-bookmarks sexy-bookmarks-expand sexy-bookmarks-bg-caring">
<ul class="socials">
		<li class="sexy-delicious">
			<a href="http://del.icio.us/post?url=http://blog.renatolouro.com.br/2011/02/tron-o-jogo-das-light-cycles-em-javascript/&amp;title=Tron%3A+O+jogo+das+Light+Cycles+em+Javascript" rel="nofollow" title="Share this on del.icio.us">Share this on del.icio.us</a>
		</li>
		<li class="sexy-digg">
			<a href="http://digg.com/submit?phase=2&amp;url=http://blog.renatolouro.com.br/2011/02/tron-o-jogo-das-light-cycles-em-javascript/&amp;title=Tron%3A+O+jogo+das+Light+Cycles+em+Javascript" rel="nofollow" title="Digg this!">Digg this!</a>
		</li>
		<li class="sexy-myspace">
			<a href="http://www.myspace.com/Modules/PostTo/Pages/?u=http://blog.renatolouro.com.br/2011/02/tron-o-jogo-das-light-cycles-em-javascript/&amp;t=Tron%3A+O+jogo+das+Light+Cycles+em+Javascript" rel="nofollow" title="Post this to MySpace">Post this to MySpace</a>
		</li>
		<li class="sexy-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://blog.renatolouro.com.br/2011/02/tron-o-jogo-das-light-cycles-em-javascript/&amp;t=Tron%3A+O+jogo+das+Light+Cycles+em+Javascript" rel="nofollow" title="Share this on Facebook">Share this on Facebook</a>
		</li>
		<li class="sexy-twitter">
			<a href="http://twitter.com/home?status=Tron%3A+O+jogo+das+Light+Cycles+em+Javascript+-+http://bit.ly/hzYVYz+" rel="nofollow" title="Tweet This!">Tweet This!</a>
		</li>
		<li class="sexy-comfeed">
			<a href="http://blog.renatolouro.com.br/2011/02/tron-o-jogo-das-light-cycles-em-javascript/feed" rel="nofollow" title="Subscribe to the comments for this post?">Subscribe to the comments for this post?</a>
		</li>
		<li class="sexy-linkedin">
			<a href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http://blog.renatolouro.com.br/2011/02/tron-o-jogo-das-light-cycles-em-javascript/&amp;title=Tron%3A+O+jogo+das+Light+Cycles+em+Javascript&amp;summary=As%20%E2%80%9CLight%20Cycles%E2%80%9D%20S%C3%A3o%20aquelas%20motos%20futuristas%20do%20filme%20Tron%2C%20que%20deixam%20um%20rastro%20luminoso%20s%C3%B3lido%20por%20onde%20passam.%20No%20filme%2C%20ocorre%20um%20duelo%20entre%20duas%20destas%20motos%20e%2C%20o%20objetivo%20deste%20duelo%20%C3%A9%20fazer%20seu%20advers%C3%A1rio%20colidir%20com%20o%20rastro%20luminoso%20de%20uma%20das%20duas%20motos.%20Outra%20caracter%C3%ADstica%20de&amp;source=Blog do Renato, o Louro" rel="nofollow" title="Share this on Linkedin">Share this on Linkedin</a>
		</li>
		<li class="sexy-google">
			<a href="http://www.google.com/bookmarks/mark?op=add&amp;bkmk=http://blog.renatolouro.com.br/2011/02/tron-o-jogo-das-light-cycles-em-javascript/&amp;title=Tron%3A+O+jogo+das+Light+Cycles+em+Javascript" rel="nofollow" title="Add this to Google Bookmarks">Add this to Google Bookmarks</a>
		</li>
		<li class="sexy-orkut">
			<a href="http://promote.orkut.com/preview?nt=orkut.com&amp;tt=Tron%3A+O+jogo+das+Light+Cycles+em+Javascript&amp;du=http://blog.renatolouro.com.br/2011/02/tron-o-jogo-das-light-cycles-em-javascript/&amp;cn=As%20%E2%80%9CLight%20Cycles%E2%80%9D%20S%C3%A3o%20aquelas%20motos%20futuristas%20do%20filme%20Tron%2C%20que%20deixam%20um%20rastro%20luminoso%20s%C3%B3lido%20por%20onde%20passam.%20No%20filme%2C%20ocorre%20um%20duelo%20entre%20duas%20destas%20motos%20e%2C%20o%20objetivo%20deste%20duelo%20%C3%A9%20fazer%20seu%20advers%C3%A1rio%20colidir%20com%20o%20rastro%20luminoso%20de%20uma%20das%20duas%20motos.%20Outra%20caracter%C3%ADstica%20de" rel="nofollow" title="Promote this on Orkut">Promote this on Orkut</a>
		</li>
		<li class="sexy-blogger">
			<a href="http://www.blogger.com/blog_this.pyra?t&amp;u=http://blog.renatolouro.com.br/2011/02/tron-o-jogo-das-light-cycles-em-javascript/&amp;n=Tron%3A+O+jogo+das+Light+Cycles+em+Javascript&amp;pli=1" rel="nofollow" title="Blog this on Blogger">Blog this on Blogger</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>
<!-- End SexyBookmarks Menu Code -->


]]></content:encoded>
			<wfw:commentRss>http://blog.renatolouro.com.br/2011/02/tron-o-jogo-das-light-cycles-em-javascript/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Simplate: um novo Template Engine para PHP</title>
		<link>http://blog.renatolouro.com.br/2011/02/simplate-um-novo-template-engine-para-php/</link>
		<comments>http://blog.renatolouro.com.br/2011/02/simplate-um-novo-template-engine-para-php/#comments</comments>
		<pubDate>Tue, 08 Feb 2011 13:58:08 +0000</pubDate>
		<dc:creator>renatolouro</dc:creator>
				<category><![CDATA[Descategorizados, mas com categoria!]]></category>

		<guid isPermaLink="false">http://blog.renatolouro.com.br/?p=1042</guid>
		<description><![CDATA[Atualmente devem haver mais de 50 sistemas de template engine para PHP publicados. Alguns mais famosos, outros praticamente desconhecidos, mas convenhamos: são muitos. E agora estamos incluindo mais um destes para a lista, pois é exatamente isso que o Simplate é: um template engine para PHP. Mas, ao contrário do que parece, sou contra reinventar [...]]]></description>
			<content:encoded><![CDATA[
<p><a href="http://simplate.org"><img src="http://blog.renatolouro.com.br/wp-content/uploads/2011/02/simplate-300x148.jpg" alt="Simplate PHP Template Engine " title="simplate" width="300" height="148" class="alignleft size-medium wp-image-1047" /></a>Atualmente devem haver mais de 50 sistemas de template engine para PHP publicados. Alguns mais famosos, outros praticamente desconhecidos, mas convenhamos: são muitos. E agora estamos incluindo mais um destes para a lista, pois é exatamente isso que o <a href="http://simplate.org">Simplate</a> é: um template engine para PHP.</p>
<p>Mas, ao contrário do que parece, sou contra reinventar a roda. <a href="http://simplate.org">Simplate</a> foi criado porque acredito que os que Engines que estão publicados hoje deixam de cumprir requisitos que considero como importantes para uma ferramenta do gênero. E, aparentemente, outros possuem esta mesma impressão. Dêem uma procurada em alguns fóruns e vejam o que ocorre quando alguém pergunta qual o template engine para PHP preferido. Talvez, vocês se assustem em perceber que uma parte considerável responde que prefere o próprio PHP para cuidar de seus templates, dispensando qualquer um destes sistemas.</p>
<p>Não parece estranho que vários programadores prefiram utilizar o próprio PHP para manipulação dos seus templates do que optar por uma das muitas ferramentas especializadas para este fim? Por que será que alguns -não poucos- tem esta opinião?</p>
<p>Antes de responder, devemos perguntar: Para que serve um Template Engine?<br />
<span id="more-1042"></span><br />
São dois motivos básicos:</p>
<ul>
<li>Facilitar o trabalho no layout codificado possibilitando que até pessoas não experientes em programação e, eventualmente, o próprio HTMLer ou Designer, alterem diretamente o mesmo; e</li>
<li>Separar a lógica de programação e/ou código do layout.</li>
</ul>
<p>Resta saber: Os Template Engines existentes atendem bem a estes dois requisitos? Pelo menos atendem melhor do que o próprio PHP já não poderia atender? Vamos avaliar estes itens em separado.</p>
<h2>Facilitando o Trabalho no Layout Codificado</h2>
<p>Veja abaixo, um exemplo hipotético de html, como ficaria ao receber os códigos em dois template engines, além do próprio PHP e o Simplate:  </p>
<table>
<tr>
<th>Tecnologia</th>
<th>Código</th>
</tr>
<tr>
<th width=30px;>HTML do Original do Template</th>
<td>&lt;select name=&#8221;type_id&#8221; value=&#8221;"&gt;<br />
   &lt;option value=&#8221;"&gt;Exemplo de Item&lt;/option&gt;<br />
&lt;/select&gt;</td>
</tr>
<tr>
<th>PHP</th>
<td>
&lt;select name=&#8221;type_id&#8221; value=&#8221;&lt;?=$type_id&gt;&#8221;&gt;<br />
&lt;?php foreach($licensee_type_list as $id=&gt;$name) { ?&gt;<br />
   &lt;option value=&#8221;&lt;?=$id?&gt;&#8221;&gt;&lt;?=$name?&gt;&lt;/option&gt;<br />
&lt;?php } ?&gt;<br />
&lt;/select&gt;
</td>
</td>
</tr>
<tr>
<th>Smarty</th>
<td>
&lt;select name=&#8221;type_id&#8221; value=&#8221;{$type_id}&#8221;&gt;<br />
 {foreach from=$licensee_type_list key=id item=name}<br />
   &lt;option value=&#8221;{$id}&#8221;&gt;{$name}&lt;/option&gt;<br />
 {/loop}<br />
&lt;/select&gt;
</td>
</tr>
<tr>
<th>Dwoo</th>
<td>
&lt;select name=&#8221;type_id&#8221; value=&#8221;{$type_id}&#8221;&gt;<br />
 {loop $licensee_type_list}<br />
   &lt;option value=&#8221;{$id}&#8221;&gt;{$name}&lt;/option&gt;<br />
 {/loop}<br />
&lt;/select&gt;
</td>
</tr>
<tr>
<th>Simplate</th>
<td>&lt;select name=&#8221;type_id&#8221;  value=&#8221;" #value bind=licenensee_type_list as=item scope=inner&gt;<br />
   &lt;option value=&#8221;" bind=item #value scope=inner&gt;Exemplo de Item&lt;/option&gt;<br />
&lt;/select&gt;</td>
</tr>
</tr>
</table>
<p>É verdade tanto o Smarty como o Dwoo simplificaram a marcação de início e fim do bloco PHP, alterando de &lt;?php &gt; para um simples { }. A conseqüência é que, em geral, se escreve menos. Mas, veja que são as mesmas 5 linhas, a mesma lógica, praticamente a mesma utilização. Mas, lógica do PHP foi de fato simplificada? Não parece que ambos fazem mímica do exemplo PHP? </p>
<p>É exatamente por isso que alguns programadores preferem continuar usando o próprio PHP. Grande parte dos Template Engines não simplifica o template codificado quando comparado com o próprio PHP, a ponto de justificar o aprendizado de uma nova linguagem. E a verdade é que muitos dos templates engines tem se convertido em verdadeiras linguagens paralelas.  </p>
<p>Podemos já perceber a primeira grande vantagem do Simplate: a correspondência com o html original é direta! São as mesmas 3 linhas. E será sempre assim: correspondência linha a linha. Nenhuma tag acrescentada, nenhuma tag retirada. Sempre!</p>
<p>Perceba também que uma codificação Simplate pode ser aberta diretamente pelo navegador, independente de servidor Apache ou IIS. Neste caso, o HTMLer/Designer deverá ver exatamente aquilo que ele havia gerado.</p>
<p>Mas, e se no nosso html de exemplo o HTMLer/Designer tivesse adicionado algumas outras linhas options como exemplo? A correspondência linha a linha do Simplate continuaria? Sim! Com o &#8211; ainda não famoso &#8211; bind=fake. Esta instrução faz com que o simplate entenda que o dado referido é um mero exemplo, e deve ser retirado da compilação final. Ex.:</p>
<table>
<tr>
<th>Tecnologia</th>
<th>Código</th>
</tr>
<tr>
<th width=30px;>HTML do Original do Template</th>
<td>&lt;select name=&#8221;type_id&#8221; value=&#8221;"&gt;<br />
   &lt;option value=&#8221;"&gt;Exemplo de Item 1 &lt;/option&gt;<br />
   &lt;option value=&#8221;"&gt;Exemplo de Item 2 &lt;/option&gt;<br />
   &lt;option value=&#8221;"&gt;Exemplo de Item 3 &lt;/option&gt;<br />
   &lt;option value=&#8221;"&gt;Exemplo de Item 4 &lt;/option&gt;<br />
&lt;/select&gt;</td>
</tr>
<tr>
<th>Simplate</th>
<td>&lt;select name=&#8221;type_id&#8221;  value=&#8221;" #value bind=licenensee_type_list as=item scope=inner&gt;<br />
&lt;option value=&#8221;" bind=item #value scope=inner&gt;Exemplo de Item 1&lt;/option&gt;<br />
&lt;option value=&#8221;" bind=fake&gt;Exemplo de Item 2&lt;/option&gt;<br />
&lt;option value=&#8221;" bind=fake&gt;Exemplo de Item 3&lt;/option&gt;<br />
&lt;option value=&#8221;" bind=fake&gt;Exemplo de Item 4&lt;/option&gt;<br />
&lt;/select&gt;<br />
</tr>
</table>
<p>Isto cria muitas possibilidades. Por exemplo, um programador pode enviar por email o template codificado e perguntar ao HTMLer/Designer: O que ficou errado na montagem? </p>
<p>Mas, já que foi falado sobre o Smarty e o Dwoo, uma análise séria não poderia estar completa se não comentássemos sobre o TinyButStrong. Ele está numa categoria diferente dos dois chamada de &#8216;natural templates&#8217;. O Simplate também estaria nesta categoria. Os &#8216;natural tamplates&#8217; são todos os template engines que não alteram a estrutura do html, assim como o Simplate. Mas, o Simplate vai ainda além, procurando respeitar também o conteúdo original do template, com todos os seus exemplos de utilização. O TinyButStrong- que merece muito ser conhecido-, coloca seus comandos exatamente no lugar do que seria o conteúdo. Sem falar que, na minha opinião, seus comandos são menos intuitivos. Simplate se torna assim ainda menos intrusivo!  </p>
<p>Ser o menos intrusivo possível no Layout/HTML causa duas conseqüências diretas:</p>
<ul>
<li>
Diminui consideravelmente os erros de montagem do HTML+(Tags PHP ou de outro Engine); e
</li>
<li>Caso, ainda assim, o erro surja -digamos que o fechamento de uma tag seja excluído por acidente- o HTMLer ou Designer encontrará um código muito mais limpo e familiar para ajudar na depuração, pois verá o seu próprio código com apenas alguns atributos a mais em algumas tags.</li>
</ul>
<p>Fecharemos este tópico com a 1a Premissa do Desenvolvimento Simplate:<br />
- O HTML original deve ser preservado. O Simplate deve permitir que o layout já codificado abra diretamente no navegador apresentando exatamente a mesma forma e conteúdo de quando foi criado.</p>
<h2>Separando o Layout da Lógica</h2>
<p>Isto alguns Template Engines fazem até bem. Mas, outros nem tanto. Como falado, muitos deles têm se convertido numa linguagem à parte, e até poderosa, com direito a IFs, Cases, For, manipulação de variáveis etc.<br />
Em resumo, a lógica pode tranqüilamente aparecer no layout. O que salva isso é o cuidado do programador. E se é para depender do cuidado do programador para evitar o aparecimento da lógica no layout, segue a pergunta recorrente: Por que não utilizar o próprio PHP? </p>
<p>O Simplate possui um número reduzido de comandos que realmente evita o aparecimento de lógica de programação no template codificado. Por exemplo, não temos IF e não sentimos falta dele. Caso seja necessário saber se um bloco deve ou não aparecer, podemos utilizar o próprio comando bind. Um bind em qualquer valor nulo ou indefinido fará com que o bloco do mesmo não apareça.</p>
<p>Na verdade o bind serve para muita coisa:</p>
<ul>
<li>Não temos include, pois um bind em um objeto Simplate inclui outro template;</li>
<li>Não temos IF, pois um bind em um valor nulo ou não pode fazer um bloco sumir ou não; e</li>
<li>Não temos For, pois um bind em um Iterador, provoca a repetição.</li>
</ul>
<p>Simples isso, não? <img src='http://blog.renatolouro.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>E segue agora a 2a Premissa do Desenvolvimento Simplate:<br />
- Mantenha o Simplate simples!</p>
<h2>Dois Requisitos e Duas Premissas que nos levaram ao Simplate</h2>
<p>Resumindo, esta é a pequena história do Simplate. Encontramos com os dois requisitos que acreditamos que não estavam sendo cumpridos de forma apropriada:</p>
<ul>
<li>Facilitar o trabalho no layout codificado possibilitando que até pessoas não experiêntes em programação e, eventualmente, o próprio HTMLer ou Designer, alterem diretamente o mesmo; e</li>
<li>Separar a lógica de programação e/ou código do layout.</li>
</ul>
<p>Para atender estes requisitos melhor do que qualquer outro Template Engine, foram criadas as duas premissas. Cada uma indo ao encontro de um requisito:</p>
<ul>
<li>Os comandos Simplate devem preservar o HTML original, mantendo conteúdo e a forma do mesmo; e</li>
<li>Mantenha o Simplate simples!</li>
</ul>
<p>Estes são os dois princípios que norteiam o desenvolvimento do Simplate. Qualquer decisão de projeto que tenha que ser tomada é comparada com estes dois princípios.</p>
<p>E você? Gostou destes princípios? É o que você busca? Então? Que tal se juntar ao time? Ainda existe muito por fazer.</p>
<p>E seja bem vindo ao SIMPLATE!<br />
Esperamos que Goste!<br />
Simplate: <a href="http://simplate.org">http://simplate.org</a></p>


<!-- Begin SexyBookmarks Menu Code -->
<div class="sexy-bookmarks sexy-bookmarks-expand sexy-bookmarks-bg-caring">
<ul class="socials">
		<li class="sexy-delicious">
			<a href="http://del.icio.us/post?url=http://blog.renatolouro.com.br/2011/02/simplate-um-novo-template-engine-para-php/&amp;title=Simplate%3A+um+novo+Template+Engine+para+PHP" rel="nofollow" title="Share this on del.icio.us">Share this on del.icio.us</a>
		</li>
		<li class="sexy-digg">
			<a href="http://digg.com/submit?phase=2&amp;url=http://blog.renatolouro.com.br/2011/02/simplate-um-novo-template-engine-para-php/&amp;title=Simplate%3A+um+novo+Template+Engine+para+PHP" rel="nofollow" title="Digg this!">Digg this!</a>
		</li>
		<li class="sexy-myspace">
			<a href="http://www.myspace.com/Modules/PostTo/Pages/?u=http://blog.renatolouro.com.br/2011/02/simplate-um-novo-template-engine-para-php/&amp;t=Simplate%3A+um+novo+Template+Engine+para+PHP" rel="nofollow" title="Post this to MySpace">Post this to MySpace</a>
		</li>
		<li class="sexy-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://blog.renatolouro.com.br/2011/02/simplate-um-novo-template-engine-para-php/&amp;t=Simplate%3A+um+novo+Template+Engine+para+PHP" rel="nofollow" title="Share this on Facebook">Share this on Facebook</a>
		</li>
		<li class="sexy-twitter">
			<a href="http://twitter.com/home?status=Simplate%3A+um+novo+Template+Engine+para+PHP+-+http://bit.ly/hBTXJR+" rel="nofollow" title="Tweet This!">Tweet This!</a>
		</li>
		<li class="sexy-comfeed">
			<a href="http://blog.renatolouro.com.br/2011/02/simplate-um-novo-template-engine-para-php/feed" rel="nofollow" title="Subscribe to the comments for this post?">Subscribe to the comments for this post?</a>
		</li>
		<li class="sexy-linkedin">
			<a href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http://blog.renatolouro.com.br/2011/02/simplate-um-novo-template-engine-para-php/&amp;title=Simplate%3A+um+novo+Template+Engine+para+PHP&amp;summary=Atualmente%20devem%20haver%20mais%20de%2050%20sistemas%20de%20template%20engine%20para%20PHP%20publicados.%20Alguns%20mais%20famosos%2C%20outros%20praticamente%20desconhecidos%2C%20mas%20convenhamos%3A%20s%C3%A3o%20muitos.%20E%20agora%20estamos%20incluindo%20mais%20um%20destes%20para%20a%20lista%2C%20pois%20%C3%A9%20exatamente%20isso%20que%20o%20Simplate%20%C3%A9%3A%20um%20template%20engine%20para%20PHP.%0D%0A%0D%0AM&amp;source=Blog do Renato, o Louro" rel="nofollow" title="Share this on Linkedin">Share this on Linkedin</a>
		</li>
		<li class="sexy-google">
			<a href="http://www.google.com/bookmarks/mark?op=add&amp;bkmk=http://blog.renatolouro.com.br/2011/02/simplate-um-novo-template-engine-para-php/&amp;title=Simplate%3A+um+novo+Template+Engine+para+PHP" rel="nofollow" title="Add this to Google Bookmarks">Add this to Google Bookmarks</a>
		</li>
		<li class="sexy-orkut">
			<a href="http://promote.orkut.com/preview?nt=orkut.com&amp;tt=Simplate%3A+um+novo+Template+Engine+para+PHP&amp;du=http://blog.renatolouro.com.br/2011/02/simplate-um-novo-template-engine-para-php/&amp;cn=Atualmente%20devem%20haver%20mais%20de%2050%20sistemas%20de%20template%20engine%20para%20PHP%20publicados.%20Alguns%20mais%20famosos%2C%20outros%20praticamente%20desconhecidos%2C%20mas%20convenhamos%3A%20s%C3%A3o%20muitos.%20E%20agora%20estamos%20incluindo%20mais%20um%20destes%20para%20a%20lista%2C%20pois%20%C3%A9%20exatamente%20isso%20que%20o%20Simplate%20%C3%A9%3A%20um%20template%20engine%20para%20PHP.%0D%0A%0D%0AM" rel="nofollow" title="Promote this on Orkut">Promote this on Orkut</a>
		</li>
		<li class="sexy-blogger">
			<a href="http://www.blogger.com/blog_this.pyra?t&amp;u=http://blog.renatolouro.com.br/2011/02/simplate-um-novo-template-engine-para-php/&amp;n=Simplate%3A+um+novo+Template+Engine+para+PHP&amp;pli=1" rel="nofollow" title="Blog this on Blogger">Blog this on Blogger</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>
<!-- End SexyBookmarks Menu Code -->


]]></content:encoded>
			<wfw:commentRss>http://blog.renatolouro.com.br/2011/02/simplate-um-novo-template-engine-para-php/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Canvas: Manipulação Pixel a Pixel &#8220;Pixel Based&#8221; em Javascript</title>
		<link>http://blog.renatolouro.com.br/2011/01/canvas-manipulacao-pixel-a-pixel-pixel-based-em-javascript/</link>
		<comments>http://blog.renatolouro.com.br/2011/01/canvas-manipulacao-pixel-a-pixel-pixel-based-em-javascript/#comments</comments>
		<pubDate>Thu, 27 Jan 2011 11:35:19 +0000</pubDate>
		<dc:creator>renatolouro</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[javascript html5]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://blog.renatolouro.com.br/?p=1002</guid>
		<description><![CDATA[Comecei a programar muito cedo. E quando criança, mas já com meu super TK3000 2e, a experiência de manipular cada pixel da tela foi revolucionária. No meu raciocínio infantil, se eu tinha o IF, o GOTO e o &#8216;poder&#8217; sobre qualquer pixel da tela, então eu poderia fazer qualquer coisa com o computador. Hoje, mesmo [...]]]></description>
			<content:encoded><![CDATA[
<p><div id="attachment_1003" class="wp-caption alignleft" style="width: 310px"><a href="http://blog.renatolouro.com.br/wp-content/uploads/2011/01/27922_f22418fe-838f-479f-a048-846adc90612e_24651_570.jpeg"><img src="http://blog.renatolouro.com.br/wp-content/uploads/2011/01/27922_f22418fe-838f-479f-a048-846adc90612e_24651_570-300x297.jpg" alt="Maceo, 2005" title="27922_f22418fe-838f-479f-a048-846adc90612e_24651_570" width="300" height="297" class="size-medium wp-image-1003" /></a><p class="wp-caption-text">Maceo, 2005</p></div>Comecei a programar muito cedo. E quando criança, mas já com meu super <a href="http://pt.wikipedia.org/wiki/TK-3000_IIe" target=_blank>TK3000 2e</a>, a experiência de manipular cada pixel da tela foi revolucionária. No meu raciocínio infantil, se eu tinha o IF, o GOTO e o &#8216;poder&#8217; sobre qualquer pixel da tela, então eu poderia fazer qualquer coisa com o computador. Hoje, mesmo sabendo que meu pensamento era no mínimo inocente, não posso deixar de reconhecer alguma lógica nele. E ainda afirmo: a possibilidade de manipular qualquer pixel é libertadora! <img src='http://blog.renatolouro.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  .<br />
Porém quem começa a trabalhar com o elemento Canvas do HTML5 percebe que parece faltar funções do gênero setPixel e getPixel.<br />
Mas existe salvação. Por sorte é possível obter e registrar um array de cores que representa cada pixel do canvas. Na realidade, esta técnica já foi até utilizada aqui no post: Como compactar Código Javascript em um PNG.<br />
A seguir veremos, passo a passo, como obter, modificar e registrar o array de pixels do canvas. Ao final mostrarei o código do bitMapCanvas, que criei contendo as úteis e inexistentes funções setPixel e getPixel.<br />
<span id="more-1002"></span><br />
Como havia dito, o segredo é saber como obter do canvas e registrar no canvas o array representando a imagem e seus pixels. Segue abaixo o código exemplificando como obter tal array:</p>
<pre name="code" class="javascript">
   //obtem objeto canvas
   cnv = document.getElementById(psIdCanvas);

   //obtem o contexto 2d
   ctx = cnv.getContext('2d');

   //pega os valores de altura e largura do canvas
   w=parseInt(cnv.width);
   h=parseInt(cnv.height);

//cria ou obtem o array de pixels
if (ctx.createImageData) {
   img = ctx.createImageData(w, h);
} else if (ctx.getImageData) {
   img = ctx.getImageData(0, 0, w, h);
} else {
   img = {'width' : w, 'height' :h, 'data' : new Array(w*h*4)};
}

//a variavel arrPix é o seu array de pixels
arrPix = img.data
</pre>
<p>Do exemplo acima temos um array de dimensão w*h*4, onde w*h é a quantidade de pixels e o 4 vem do fato de que cada pixel é composto de 4 canais: red, green, blue e alpha &#8211; transparência.<br />
Tentando exemplificar um pouco, a estrutura do array é:<br />
<code><br />
[componente red do pixel 1,<br />
componente green do pixel 1,<br />
componente blue do pixel 1,<br />
componente alpha do pixel 1,<br />
componente red do pixel 2,<br />
componente green do pixel 2,<br />
componente blue do pixel 2,<br />
componente alpha do pixel 2,<br />
componente red do pixel 3,<br />
componente green do pixel 3,<br />
...]<br />
</code><br />
Onde o valor de cada componente varia de 0 à 255.</p>
<p>Ou seja, se, e somente se, seu canvas tiver 300px de largura, sua primeira linha será representada pelos pixels de 0 -red do 1o pixel &#8211; até 1200 &#8211; alpha do 300o pixel.<br />
Então para colocar o pixel do meio da 2a linha como verde o código seria: arrPix[1801]=255;arrPix[1803]=255; .<br />
Onde arrPix[1801] é a componente verde do pixel que se inicia em 1800; e<br />
arrPix[1803] é a transparência do mesmo onde o 255 é o sólido sem transparência.</p>
<p>Depois de tudo devemos utilizar a instrução abaixo para atualizar o canvas:</p>
<pre name="code" class="javascript">
context.putImageData(imgd, 0,0); //cria a imagem na posição 0,0 do canvas.
</pre>
<p>Convenhamos: É possível trabalhar assim. Mas  não é nada prático.<br />
Então criei a classe abaixo chamada bitMapCanvas para facilitar a nossa vida:</p>
<pre name="code" class="javascript">
function bitMapCanvas(psIdCanvas)
{
   this.cnv; //canvas
   this.ctx; //context
   this.img; //imagem
   this.w;
   this.h;

   //obtem objeto canvas
   this.cnv = document.getElementById(psIdCanvas);

   //obtem o contexto 2d
   this.ctx = this.cnv.getContext('2d');

   //pega os valores de altura e largura do canvas
   this.w=parseInt(this.cnv.width);
   this.h=parseInt(this.cnv.height);

//cria ou obtem o array de pixels
if (this.ctx.createImageData) {
   this.img = this.ctx.createImageData(this.w, this.h);
} else if (this.ctx.getImageData) {
   this.img = this.ctx.getImageData(0, 0, this.w, this.h);
} else {
   this.img = {'width' : this.w,
                  'height' :this.h,
                  'data' : new Array(this.w*this.h*4)};
}

this.setPixel=function(piLeft, piTop, piRed, piGreen, piBlue, piAlpha)
{
   iPixel=piTop*this.w*4+(piLeft*4);
   this.img.data[iPixel]=piRed;
   this.img.data[iPixel+1]=piGreen;
   this.img.data[iPixel+2]=piBlue;
   this.img.data[iPixel+3]=piAlpha;
   this.ctx.putImageData(this.img, 0,0);
}

this.getPixel=function(piLeft, piTop)
{
   iPixel=piTop*this.w*4+(piLeft*4);
   return [this.img.data[iPixel],
             this.img.data[iPixel+1],
             this.img.data[iPixel+2],
             this.img.data[iPixel+3]];
}

this.clear=function()
{
   this.img = {'width' : this.w,
                  'height' :this.h,
                  'data' : new Array(this.w*this.h*4)};
   this.ctx.putImageData(this.img, 0,0);
}

this.getContext=function()
{
   return this.ctx;
}

}
</pre>
<p>Dado um elemento  html canvas de id=arena de width=&#8221;300px&#8221; e height=&#8221;300px&#8221;, segue a demonstração de como utilizar o bitMapCanvas:</p>
<pre name="code" class="javascript">
//obtem um novo bitMapCanvas ligado ao canvas arena.
 G_bcvArena = new bitMapCanvas('arena');  

//desenha o famigerado pixel verde no centro do canvas
G_bcvArena.setPixel(150,150,0,255,0,255);

//Querendo desenhar outras formas basta obter o contexto e utiliza-lo normalmente.
ctx = G_bcvArena.getContext();

//Como nem sempre é simples encontrar um pixel isolado na tela,
//desenharemos um círculo em volta do mesmo
ctx.beginPath();
ctx.arc(150, 150, 10, 0, Math.PI*2, true);
ctx.closePath();
ctx.stroke();
</pre>
<p>E é isso! Abraços e até a próxima!</p>


<!-- Begin SexyBookmarks Menu Code -->
<div class="sexy-bookmarks sexy-bookmarks-expand sexy-bookmarks-bg-caring">
<ul class="socials">
		<li class="sexy-delicious">
			<a href="http://del.icio.us/post?url=http://blog.renatolouro.com.br/2011/01/canvas-manipulacao-pixel-a-pixel-pixel-based-em-javascript/&amp;title=Canvas%3A+Manipula%C3%A7%C3%A3o+Pixel+a+Pixel+%22Pixel+Based%22+em+Javascript+" rel="nofollow" title="Share this on del.icio.us">Share this on del.icio.us</a>
		</li>
		<li class="sexy-digg">
			<a href="http://digg.com/submit?phase=2&amp;url=http://blog.renatolouro.com.br/2011/01/canvas-manipulacao-pixel-a-pixel-pixel-based-em-javascript/&amp;title=Canvas%3A+Manipula%C3%A7%C3%A3o+Pixel+a+Pixel+%22Pixel+Based%22+em+Javascript+" rel="nofollow" title="Digg this!">Digg this!</a>
		</li>
		<li class="sexy-myspace">
			<a href="http://www.myspace.com/Modules/PostTo/Pages/?u=http://blog.renatolouro.com.br/2011/01/canvas-manipulacao-pixel-a-pixel-pixel-based-em-javascript/&amp;t=Canvas%3A+Manipula%C3%A7%C3%A3o+Pixel+a+Pixel+%22Pixel+Based%22+em+Javascript+" rel="nofollow" title="Post this to MySpace">Post this to MySpace</a>
		</li>
		<li class="sexy-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://blog.renatolouro.com.br/2011/01/canvas-manipulacao-pixel-a-pixel-pixel-based-em-javascript/&amp;t=Canvas%3A+Manipula%C3%A7%C3%A3o+Pixel+a+Pixel+%22Pixel+Based%22+em+Javascript+" rel="nofollow" title="Share this on Facebook">Share this on Facebook</a>
		</li>
		<li class="sexy-twitter">
			<a href="http://twitter.com/home?status=Canvas%3A+Manipula%C3%A7%C3%A3o+Pixel+a+Pixel+%22Pixel+Based%22+em+Javascript++-+http://bit.ly/fNjONC+" rel="nofollow" title="Tweet This!">Tweet This!</a>
		</li>
		<li class="sexy-comfeed">
			<a href="http://blog.renatolouro.com.br/2011/01/canvas-manipulacao-pixel-a-pixel-pixel-based-em-javascript/feed" rel="nofollow" title="Subscribe to the comments for this post?">Subscribe to the comments for this post?</a>
		</li>
		<li class="sexy-linkedin">
			<a href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http://blog.renatolouro.com.br/2011/01/canvas-manipulacao-pixel-a-pixel-pixel-based-em-javascript/&amp;title=Canvas%3A+Manipula%C3%A7%C3%A3o+Pixel+a+Pixel+%22Pixel+Based%22+em+Javascript+&amp;summary=Comecei%20a%20programar%20muito%20cedo.%20E%20quando%20crian%C3%A7a%2C%20mas%20j%C3%A1%20com%20meu%20super%20TK3000%202e%2C%20a%20experi%C3%AAncia%20de%20manipular%20cada%20pixel%20da%20tela%20foi%20revolucion%C3%A1ria.%20No%20meu%20racioc%C3%ADnio%20infantil%2C%20se%20eu%20tinha%20o%20IF%2C%20o%20GOTO%20e%20o%20%27poder%27%20sobre%20qualquer%20pixel%20da%20tela%2C%20ent%C3%A3o%20eu%20poderia%20fazer%20qualquer%20coisa%20com%20o%20computa&amp;source=Blog do Renato, o Louro" rel="nofollow" title="Share this on Linkedin">Share this on Linkedin</a>
		</li>
		<li class="sexy-google">
			<a href="http://www.google.com/bookmarks/mark?op=add&amp;bkmk=http://blog.renatolouro.com.br/2011/01/canvas-manipulacao-pixel-a-pixel-pixel-based-em-javascript/&amp;title=Canvas%3A+Manipula%C3%A7%C3%A3o+Pixel+a+Pixel+%22Pixel+Based%22+em+Javascript+" rel="nofollow" title="Add this to Google Bookmarks">Add this to Google Bookmarks</a>
		</li>
		<li class="sexy-orkut">
			<a href="http://promote.orkut.com/preview?nt=orkut.com&amp;tt=Canvas%3A+Manipula%C3%A7%C3%A3o+Pixel+a+Pixel+%22Pixel+Based%22+em+Javascript+&amp;du=http://blog.renatolouro.com.br/2011/01/canvas-manipulacao-pixel-a-pixel-pixel-based-em-javascript/&amp;cn=Comecei%20a%20programar%20muito%20cedo.%20E%20quando%20crian%C3%A7a%2C%20mas%20j%C3%A1%20com%20meu%20super%20TK3000%202e%2C%20a%20experi%C3%AAncia%20de%20manipular%20cada%20pixel%20da%20tela%20foi%20revolucion%C3%A1ria.%20No%20meu%20racioc%C3%ADnio%20infantil%2C%20se%20eu%20tinha%20o%20IF%2C%20o%20GOTO%20e%20o%20%27poder%27%20sobre%20qualquer%20pixel%20da%20tela%2C%20ent%C3%A3o%20eu%20poderia%20fazer%20qualquer%20coisa%20com%20o%20computa" rel="nofollow" title="Promote this on Orkut">Promote this on Orkut</a>
		</li>
		<li class="sexy-blogger">
			<a href="http://www.blogger.com/blog_this.pyra?t&amp;u=http://blog.renatolouro.com.br/2011/01/canvas-manipulacao-pixel-a-pixel-pixel-based-em-javascript/&amp;n=Canvas%3A+Manipula%C3%A7%C3%A3o+Pixel+a+Pixel+%22Pixel+Based%22+em+Javascript+&amp;pli=1" rel="nofollow" title="Blog this on Blogger">Blog this on Blogger</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>
<!-- End SexyBookmarks Menu Code -->


]]></content:encoded>
			<wfw:commentRss>http://blog.renatolouro.com.br/2011/01/canvas-manipulacao-pixel-a-pixel-pixel-based-em-javascript/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Dicas de Software: Dropbox</title>
		<link>http://blog.renatolouro.com.br/2011/01/dicas-de-software-dropbox/</link>
		<comments>http://blog.renatolouro.com.br/2011/01/dicas-de-software-dropbox/#comments</comments>
		<pubDate>Mon, 24 Jan 2011 12:35:51 +0000</pubDate>
		<dc:creator>renatolouro</dc:creator>
				<category><![CDATA[Descategorizados, mas com categoria!]]></category>

		<guid isPermaLink="false">http://blog.renatolouro.com.br/?p=956</guid>
		<description><![CDATA[Conversando com o povo do twitter, resolvi variar um pouco &#8211; mas só um pouco &#8211; o gênero das minhas postagens. Cada postagem minha tem sido um pequeno projeto. Isso, normalmente, leva tempo já que o blog ainda está na categoria hobby em minha vida. Não significa que os projetos irão parar, mas vou tentar [...]]]></description>
			<content:encoded><![CDATA[
<p><div id="attachment_958" class="wp-caption alignleft" style="width: 256px"><a href="http://blog.renatolouro.com.br/wp-content/uploads/2011/01/dropbox.jpg"><img src="http://blog.renatolouro.com.br/wp-content/uploads/2011/01/dropbox.jpg" alt="Dropbox" title="dropbox" width="246" height="213" class="size-full wp-image-958" /></a><p class="wp-caption-text">Dropbox: Repositório de Arquivos Online</p></div>Conversando com o povo do twitter, resolvi variar um pouco &#8211; mas só um pouco <img src='http://blog.renatolouro.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  &#8211; o gênero das minhas postagens. Cada postagem minha tem sido um pequeno projeto. Isso, normalmente, leva tempo já que o blog ainda está na categoria hobby em minha vida. Não significa que os projetos irão parar, mas vou tentar intercalá-los com algumas postagens menores para que o blog não leve duas semanas sem atualização. E aproveito para iniciar uma nova categoria: Dicas de Software. Basicamente são programas que me ajudam muito no dia-a-dia. E como o Dropbox acaba sendo uma base para várias das outras dicas, resolvi estrear essa categoria com ele. E o Dropbox é indiscutivelmente muito bom. Arrisco a dizer que é o melhor da categoria. Resumindo, ele cria um diretório no seu computador/celular que fica sendo automaticamente sincronizado com o servidor deles. Que mantém sincronizado outras &#8216;pastas dropbox&#8217; que você tenha instalado em outros micros. Significa mover um arquivo para uma pasta em casa e encontrar este arquivo no computador do trabalho. E ainda tem outras funcionalidades legais além de ser compatível com windows, mac e linux.<br />
<span id="more-956"></span></p>
<h2>Outras Funcionalidades</h2>
<h3>1- Acesso pelo Sistema de Arquivos:</h3>
<p><a href="http://blog.renatolouro.com.br/wp-content/uploads/2011/01/dropboxfs.png"><img src="http://blog.renatolouro.com.br/wp-content/uploads/2011/01/dropboxfs-300x217.png" alt="" title="dropboxfs" width="300" height="217" class="alignleft size-medium wp-image-969" /></a> Você não precisa acessar uma página na internet ou utilizar o navegador para salvar ou obter seus arquivos. O Dropbox cria uma pasta no seu computador. Para guardar ou compartilhar determinado arquivo basta copiar para a pasta do Dropbox.</p>
<h3>2- Acesso Web:</h3>
<p>Mas caso esteja em um computador de terceiros no qual você não tenha o Dropbox instalado, você pode acessar seus arquivos via interface web!</p>
<h3>3- Controlador de Versões:</h3>
<p>Acessando pela interface web, você pode recuperar uma versão mais antiga do seu trabalho. Por exemplo que eu posso ter acesso a várias versões do <a href="http://blog.renatolouro.com.br/the-smallest-3d-maker/">projeto 3D maker</a>. É uma ferramenta de backup online muito fácil de ser utilizada pois basta copiar para sua &#8216;pasta Dropbox&#8217;.</p>
<h3>4- Compartilhamento de Arquivos/Pastas</h3>
<p>Você pode selecionar alguns sub-diretórios do seu dropbox para manter compartilhado com uma ou mais pessoas.Eu outras palavras, o arquivo que você copiar para uma pasta </p>
<p>Caso você vá diretamente ao site: http://www.dropbox.com/ você começará com 2GB de espaço.<br />
Caso você seja indicado você ganha +250Mb além dos 2GB- segue meu link de indicação: <a href="https://www.dropbox.com/referrals/NTk5Nzg5MjQ5?src=global6" target='_blank'>https://www.dropbox.com/referrals/NTk5Nzg5MjQ5?src=global6</a> (indo por este link vc ganha os +250Mb)</p>
<p>Cada pessoa que vc indica, ganha +250Mb até um limite de 8GB. Mais do que isso só na versão paga.</p>
<p>É um serviço muito bom que pode manter seus dados sincronizados entre seus computadores e te permitir acesso web. Acho que vale a pena ao menos testar!</p>
<p>Forte Abraço!</p>


<!-- Begin SexyBookmarks Menu Code -->
<div class="sexy-bookmarks sexy-bookmarks-expand sexy-bookmarks-bg-caring">
<ul class="socials">
		<li class="sexy-delicious">
			<a href="http://del.icio.us/post?url=http://blog.renatolouro.com.br/2011/01/dicas-de-software-dropbox/&amp;title=Dicas+de+Software%3A+Dropbox" rel="nofollow" title="Share this on del.icio.us">Share this on del.icio.us</a>
		</li>
		<li class="sexy-digg">
			<a href="http://digg.com/submit?phase=2&amp;url=http://blog.renatolouro.com.br/2011/01/dicas-de-software-dropbox/&amp;title=Dicas+de+Software%3A+Dropbox" rel="nofollow" title="Digg this!">Digg this!</a>
		</li>
		<li class="sexy-myspace">
			<a href="http://www.myspace.com/Modules/PostTo/Pages/?u=http://blog.renatolouro.com.br/2011/01/dicas-de-software-dropbox/&amp;t=Dicas+de+Software%3A+Dropbox" rel="nofollow" title="Post this to MySpace">Post this to MySpace</a>
		</li>
		<li class="sexy-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://blog.renatolouro.com.br/2011/01/dicas-de-software-dropbox/&amp;t=Dicas+de+Software%3A+Dropbox" rel="nofollow" title="Share this on Facebook">Share this on Facebook</a>
		</li>
		<li class="sexy-twitter">
			<a href="http://twitter.com/home?status=Dicas+de+Software%3A+Dropbox+-+http://bit.ly/e2Ii66+" rel="nofollow" title="Tweet This!">Tweet This!</a>
		</li>
		<li class="sexy-comfeed">
			<a href="http://blog.renatolouro.com.br/2011/01/dicas-de-software-dropbox/feed" rel="nofollow" title="Subscribe to the comments for this post?">Subscribe to the comments for this post?</a>
		</li>
		<li class="sexy-linkedin">
			<a href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http://blog.renatolouro.com.br/2011/01/dicas-de-software-dropbox/&amp;title=Dicas+de+Software%3A+Dropbox&amp;summary=Conversando%20com%20o%20povo%20do%20twitter%2C%20resolvi%20variar%20um%20pouco%20-%20mas%20s%C3%B3%20um%20pouco%20%3B%29%20-%20o%20g%C3%AAnero%20das%20minhas%20postagens.%20Cada%20postagem%20minha%20tem%20sido%20um%20pequeno%20projeto.%20Isso%2C%20normalmente%2C%20leva%20tempo%20j%C3%A1%20que%20o%20blog%20ainda%20est%C3%A1%20na%20categoria%20hobby%20em%20minha%20vida.%20N%C3%A3o%20significa%20que%20os%20projetos%20ir%C3%A3o%20parar%2C%20m&amp;source=Blog do Renato, o Louro" rel="nofollow" title="Share this on Linkedin">Share this on Linkedin</a>
		</li>
		<li class="sexy-google">
			<a href="http://www.google.com/bookmarks/mark?op=add&amp;bkmk=http://blog.renatolouro.com.br/2011/01/dicas-de-software-dropbox/&amp;title=Dicas+de+Software%3A+Dropbox" rel="nofollow" title="Add this to Google Bookmarks">Add this to Google Bookmarks</a>
		</li>
		<li class="sexy-orkut">
			<a href="http://promote.orkut.com/preview?nt=orkut.com&amp;tt=Dicas+de+Software%3A+Dropbox&amp;du=http://blog.renatolouro.com.br/2011/01/dicas-de-software-dropbox/&amp;cn=Conversando%20com%20o%20povo%20do%20twitter%2C%20resolvi%20variar%20um%20pouco%20-%20mas%20s%C3%B3%20um%20pouco%20%3B%29%20-%20o%20g%C3%AAnero%20das%20minhas%20postagens.%20Cada%20postagem%20minha%20tem%20sido%20um%20pequeno%20projeto.%20Isso%2C%20normalmente%2C%20leva%20tempo%20j%C3%A1%20que%20o%20blog%20ainda%20est%C3%A1%20na%20categoria%20hobby%20em%20minha%20vida.%20N%C3%A3o%20significa%20que%20os%20projetos%20ir%C3%A3o%20parar%2C%20m" rel="nofollow" title="Promote this on Orkut">Promote this on Orkut</a>
		</li>
		<li class="sexy-blogger">
			<a href="http://www.blogger.com/blog_this.pyra?t&amp;u=http://blog.renatolouro.com.br/2011/01/dicas-de-software-dropbox/&amp;n=Dicas+de+Software%3A+Dropbox&amp;pli=1" rel="nofollow" title="Blog this on Blogger">Blog this on Blogger</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>
<!-- End SexyBookmarks Menu Code -->


]]></content:encoded>
			<wfw:commentRss>http://blog.renatolouro.com.br/2011/01/dicas-de-software-dropbox/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Função para Detectar Colisões em Javascript</title>
		<link>http://blog.renatolouro.com.br/2011/01/funcao-para-detectar-colisoes/</link>
		<comments>http://blog.renatolouro.com.br/2011/01/funcao-para-detectar-colisoes/#comments</comments>
		<pubDate>Thu, 20 Jan 2011 12:15:53 +0000</pubDate>
		<dc:creator>renatolouro</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[Programação de Jogos]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[SDL]]></category>

		<guid isPermaLink="false">http://blog.renatolouro.com.br/?p=372</guid>
		<description><![CDATA[Este é um post reciclado do blog antigo da época em que fazia um curso de desenvolvimento de games. Na ocasião, brincávamos na aula de animar um personagem e detectar colisões. Mas, em casa, descobri que a lógica apresentada em aula para detectar as colisões entre áreas retangulares estava com algum erro. Desenvolvia, nas horas [...]]]></description>
			<content:encoded><![CDATA[
<p><a href="http://blog.renatolouro.com.br/wp-content/uploads/2011/01/bolada.jpg"><img src="http://blog.renatolouro.com.br/wp-content/uploads/2011/01/bolada-300x245.jpg" alt="" title="bolada" width="300" height="245" class="alignleft size-medium wp-image-854" /></a>Este é um post reciclado  do blog antigo da época em que fazia um curso de desenvolvimento de games. Na ocasião, brincávamos na aula de animar um personagem e detectar colisões. Mas, em casa, descobri que a lógica apresentada em  aula para detectar as colisões entre áreas retangulares estava com algum erro.</p>
<p>Desenvolvia, nas horas vagas, para treinar C e SDL, o SDLSoccer, que acabou ficando mais para um WarSoccer <img src='http://blog.renatolouro.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  . Num próximo post apresentarei ele para vocês reescrito também em js. Mas o importante é que eu estava tentando utilizar a tal lógica para impedir que os jogadores entrassem um dentro do outro, dando um efeito meio ‘fantasma’. Mas com a rotina de colisão que estava usando, nada dava certo. E depois de muito depurar, afinal era madrugada, cheguei a conclusão que o erro tinha que estar nela. Então acabei fazendo um mais simples.</p>
<p>Se detectar colisão em retângulos é relativamente simples, mais simples ainda é detectar quando não ocorre a colisão, que foi a lógica que adotei. Mas antes vejam esta rotina funcionando no exemplo abaixo, impedindo que a div do guerreiro entre na div da árvore:<br />
<span id="more-372"></span></p>
<div id=divCola>
<div id=divCampo style="border-style:solid; border-width:1px; background-image:url(http://blog.renatolouro.com.br/wp-content/uploads/Anime/terra.png); position:relative; width:580px; height:300px">
<div id=divAnime style="border-style:solid; border-width:1px; position:absolute; top:0px; left:0px;  width:96px; height:96px; background-image:url(http://blog.renatolouro.com.br/wp-content/uploads/Anime/andando.png);"></div>
<div id=divArvore style="border-style:solid; border-width:1px; position:absolute; top:100px; left:150px; width:96px; height:96px; background-image:url(http://blog.renatolouro.com.br/wp-content/uploads/Anime/arvore.png);"></div>
</div>
<input type=checkbox onclick='fixa();'>Fixar Scroll no Chrome (Ainda não funciona em outros navegadores)
</div>
<p>Vamos lá:</p>
<p>Sendo r1 e r2 os retângulos 1 e 2 podemos afirmar que não haverá colisão de r1 estiver todo a direita ou todo a esquerda de r2. Ou seja se r1.x+r1.w&lt;r2.x ou r1.x&gt;r2.x+r2.w conforme mostra o diagrama abaixo:</p>
<div>
<img src="http://blog.renatolouro.com.br/wp-content/uploads/2010/09/colide1.jpg" alt="" title="colide1" width="265" height="194" class="alignnone size-full wp-image-374" />
</div>
<p>Caso contrário, ainda podemos afirmar não haverá colisão se r1 estiver totalmente acima ou totalmente abaixo de r2. Ou seja se r1.y+r1.h&lt;r2.y ou r1.y&gt;r2.y+r2.h conforme mostra o diagrama abaixo:</p>
<p>Caso contrário, se r1 não está nem totalmente acima ou totalmente abaixo ou totalmente a direita ou ainda a esquerda, então afirmamos que existe colisão!</p>
<p>Com isso o código que era:</p>
<pre name="code" class="C">
bool colidiu(SDL_Rect r1, SDL_Rect r2)
{
if ((r1.x >= r2.x &#038;&#038; r1.x <= (r2.x + r2.w) &#038;&#038;
r1.y >= r2.y &#038;&#038; r1.y <= (r2.y + r2.h)) ||
((r1.x + r1.w) >= r2.x &#038;&#038; (r1.x + r1.w) <= (r2.x + r2.w) &#038;&#038;
(r1.y + r1.h) >= r2.y &#038;&#038; (r1.y + r1.h) <= (r2.y + r2.h)))
return true;
}
</pre>
<p>Transformamos em algo mais simples e, no mínimo, mais legível:</p>
<pre name="code" class="C">
bool colidiu(SDL_Rect r1, SDL_Rect r2)
{
if((r1.x+r1.w < r2.x) || (r1.x > r2.x+r2.w)) return false;
if((r1.y+r1.h < r2.y) || (r1.y > r2.y+r2.h)) return false;
return true;
}
</pre>
<p>ou ainda, numa forma ainda mais simples:</p>
<pre name="code" class="C++">
bool colidiu(SDL_Rect r1, SDL_Rect r2)
{
if(((r1.x+r1.w < r2.x) || (r1.x > r2.x+r2.w)) ||
   ((r1.y+r1.h < r2.y) || (r1.y > r2.y+r2.h))) return false;
return true;
}
</pre>
<p>Traduzindo para Javascript:</p>
<pre name="code" class="javascript">
function colide(r1_x, r1_y, r1_h, r1_w, r2_x, r2_y, r2_h, r2_w)
{
    if((r1_x+r1_w<r2_x || r1_x>r2_x+r2_w) ||
       (r1_y+r1_h<r2_y || r1_y>r2_y+r2_h)) return false;
	return true;
}
</pre>
<p>No nosso código, só precisamos fazer uma pequena alteração ao final da função trigger: Ao fim dela verificaremos se houve colisão. Caso tenha havido, restauramos a posição anterior da div do aventureiro, conforme vemos abaixo:</p>
<pre name="code" class="javascript">
	if(!colide(iPosLeft, iPosTop, iTamSprites, iTamSprites,
        iPosLeftArvore, iPosTopArvore, iTamSprites, iTamSprites))
	{
      //não tivemos colisão, então a nova posição é aceita.
      divAnime.style.left=iPosLeft;
      divAnime.style.top=iPosTop;
      return;
	}
       //colisão detectada, posição restaurada.
	iPosLeft= iAtualLeft;
	iPosTop = iAtualTop;
</pre>
<p>Conclusões:<br />
Embora esta função, tal qual, seja ótima para jogos 2D 'chapados', ela não fica bem em jogos que simulam perspectiva como este. Para casos como este é conveniente determinar uma área de colisão diferente da definida pela própria div. Nas próximas postagens veremos como fazer o ajuste fino na área de colisão encapsulando div, retângulo e posição do personagem num único objeto. </p>
<p>Abraços e até a próxima!<br />
<script type="text/javascript" src="http://blog.renatolouro.com.br/wp-content/uploads/Anime/anime_blq.js"></script></p>


<!-- Begin SexyBookmarks Menu Code -->
<div class="sexy-bookmarks sexy-bookmarks-expand sexy-bookmarks-bg-caring">
<ul class="socials">
		<li class="sexy-delicious">
			<a href="http://del.icio.us/post?url=http://blog.renatolouro.com.br/2011/01/funcao-para-detectar-colisoes/&amp;title=Fun%C3%A7%C3%A3o+para+Detectar+Colis%C3%B5es+em+Javascript" rel="nofollow" title="Share this on del.icio.us">Share this on del.icio.us</a>
		</li>
		<li class="sexy-digg">
			<a href="http://digg.com/submit?phase=2&amp;url=http://blog.renatolouro.com.br/2011/01/funcao-para-detectar-colisoes/&amp;title=Fun%C3%A7%C3%A3o+para+Detectar+Colis%C3%B5es+em+Javascript" rel="nofollow" title="Digg this!">Digg this!</a>
		</li>
		<li class="sexy-myspace">
			<a href="http://www.myspace.com/Modules/PostTo/Pages/?u=http://blog.renatolouro.com.br/2011/01/funcao-para-detectar-colisoes/&amp;t=Fun%C3%A7%C3%A3o+para+Detectar+Colis%C3%B5es+em+Javascript" rel="nofollow" title="Post this to MySpace">Post this to MySpace</a>
		</li>
		<li class="sexy-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://blog.renatolouro.com.br/2011/01/funcao-para-detectar-colisoes/&amp;t=Fun%C3%A7%C3%A3o+para+Detectar+Colis%C3%B5es+em+Javascript" rel="nofollow" title="Share this on Facebook">Share this on Facebook</a>
		</li>
		<li class="sexy-twitter">
			<a href="http://twitter.com/home?status=Fun%C3%A7%C3%A3o+para+Detectar+Colis%C3%B5es+em+Javascript+-+http://bit.ly/dZcfR7+" rel="nofollow" title="Tweet This!">Tweet This!</a>
		</li>
		<li class="sexy-comfeed">
			<a href="http://blog.renatolouro.com.br/2011/01/funcao-para-detectar-colisoes/feed" rel="nofollow" title="Subscribe to the comments for this post?">Subscribe to the comments for this post?</a>
		</li>
		<li class="sexy-linkedin">
			<a href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http://blog.renatolouro.com.br/2011/01/funcao-para-detectar-colisoes/&amp;title=Fun%C3%A7%C3%A3o+para+Detectar+Colis%C3%B5es+em+Javascript&amp;summary=Este%20%C3%A9%20um%20post%20reciclado%20%20do%20blog%20antigo%20da%20%C3%A9poca%20em%20que%20fazia%20um%20curso%20de%20desenvolvimento%20de%20games.%20Na%20ocasi%C3%A3o%2C%20brinc%C3%A1vamos%20na%20aula%20de%20animar%20um%20personagem%20e%20detectar%20colis%C3%B5es.%20Mas%2C%20em%20casa%2C%20descobri%20que%20a%20l%C3%B3gica%20apresentada%20em%20%20aula%20para%20detectar%20as%20colis%C3%B5es%20entre%20%C3%A1reas%20retangulares%20estava&amp;source=Blog do Renato, o Louro" rel="nofollow" title="Share this on Linkedin">Share this on Linkedin</a>
		</li>
		<li class="sexy-google">
			<a href="http://www.google.com/bookmarks/mark?op=add&amp;bkmk=http://blog.renatolouro.com.br/2011/01/funcao-para-detectar-colisoes/&amp;title=Fun%C3%A7%C3%A3o+para+Detectar+Colis%C3%B5es+em+Javascript" rel="nofollow" title="Add this to Google Bookmarks">Add this to Google Bookmarks</a>
		</li>
		<li class="sexy-orkut">
			<a href="http://promote.orkut.com/preview?nt=orkut.com&amp;tt=Fun%C3%A7%C3%A3o+para+Detectar+Colis%C3%B5es+em+Javascript&amp;du=http://blog.renatolouro.com.br/2011/01/funcao-para-detectar-colisoes/&amp;cn=Este%20%C3%A9%20um%20post%20reciclado%20%20do%20blog%20antigo%20da%20%C3%A9poca%20em%20que%20fazia%20um%20curso%20de%20desenvolvimento%20de%20games.%20Na%20ocasi%C3%A3o%2C%20brinc%C3%A1vamos%20na%20aula%20de%20animar%20um%20personagem%20e%20detectar%20colis%C3%B5es.%20Mas%2C%20em%20casa%2C%20descobri%20que%20a%20l%C3%B3gica%20apresentada%20em%20%20aula%20para%20detectar%20as%20colis%C3%B5es%20entre%20%C3%A1reas%20retangulares%20estava" rel="nofollow" title="Promote this on Orkut">Promote this on Orkut</a>
		</li>
		<li class="sexy-blogger">
			<a href="http://www.blogger.com/blog_this.pyra?t&amp;u=http://blog.renatolouro.com.br/2011/01/funcao-para-detectar-colisoes/&amp;n=Fun%C3%A7%C3%A3o+para+Detectar+Colis%C3%B5es+em+Javascript&amp;pli=1" rel="nofollow" title="Blog this on Blogger">Blog this on Blogger</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>
<!-- End SexyBookmarks Menu Code -->


]]></content:encoded>
			<wfw:commentRss>http://blog.renatolouro.com.br/2011/01/funcao-para-detectar-colisoes/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Deslocamento de Personagem com Position: Absolute e Relative</title>
		<link>http://blog.renatolouro.com.br/2011/01/deslocamento-de-personagem-e-position-absolute-e-relative-de-div/</link>
		<comments>http://blog.renatolouro.com.br/2011/01/deslocamento-de-personagem-e-position-absolute-e-relative-de-div/#comments</comments>
		<pubDate>Thu, 13 Jan 2011 13:15:27 +0000</pubDate>
		<dc:creator>renatolouro</dc:creator>
				<category><![CDATA[HTML e CSS]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Programação de Jogos]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://blog.renatolouro.com.br/?p=860</guid>
		<description><![CDATA[Numa postagem anterior vimos como animar um personagem utilizando o javascript. Hoje iremos unir a animação do personagem com a movimentação do mesmo sobre um fundo qualquer. Como este post é uma continuação, recomendo a leitura da a postagem anterior: Javascript: animações com Images – background – e setInterval. Esta postagem também nos ajudará a [...]]]></description>
			<content:encoded><![CDATA[
<p><a href="http://blog.renatolouro.com.br/wp-content/uploads/2011/01/escultura-em-movimento2.jpg"><img src="http://blog.renatolouro.com.br/wp-content/uploads/2011/01/escultura-em-movimento2-300x225.jpg" alt="" title="escultura-em-movimento2" width="300" height="225" class="alignleft size-medium wp-image-861" /></a>Numa postagem anterior vimos como animar um personagem utilizando o javascript. Hoje iremos unir a animação do personagem com a movimentação do mesmo sobre um fundo qualquer. Como este post é uma continuação, recomendo a leitura da a postagem anterior: <a href="http://blog.renatolouro.com.br/2010/12/javascript-animacoes-com-images-background-e-setinterval/"> Javascript: animações com Images – background – e setInterval</a>. Esta postagem também nos ajudará a entender melhor a utilização de divs com posicionamento absoluto e relativo.<br />
Você perceberá que faltam ainda algumas implementações que serão publicadas nas próximas postagens. No momento, nosso aventureiro está mais para um fantasma que passa por dentro dos objetos. Mas, mesmo assim acredito que estamos chegando a um resultado bem legal que, como de costume, você já pode testar no exemplo abaixo:<br />
<span id="more-860"></span></p>
<div id=divCola>
<div id=divCampo style="background-image:url(http://blog.renatolouro.com.br/wp-content/uploads/Anime/terra.png); position:relative; width:580px; height:300px">
<div id=divAnime style="position:absolute; top:0px; left:0px;  width:96px; height:96px; background-image:url(http://blog.renatolouro.com.br/wp-content/uploads/Anime/andando.png);"></div>
<div id=divArvore style="position:absolute; top:100px; left:150px; width:96px; height:96px; background-image:url(http://blog.renatolouro.com.br/wp-content/uploads/Anime/arvore.png);"></div>
</div>
<input type=checkbox onclick='fixa();'>Fixar Scroll no Chrome (Ainda não funciona em outros navegadores)
</div>
<p>Para produzir o efeito acima o fundamental é entender o posicionamento absoluto e relativo de uma div. Em uma curta definição.</p>
<ol>
<li>Ao aplicarmos o posicionamento absoluto ou relativo em uma div ganhamos o direito de definirmos valores para os atributos top e left e assim posicionarmos livremente esta div;</li>
<li>Uma div posicionada relativamente, ao definirmos top e left,  se desloca do ponto onde ela deveria estar posicionada originalmente;</li>
<li>Uma div posicionada absolutamente se desloca do ponto (0,0) &#8211; canto superior esquerdo &#8211; do primeiro container registrado com posicionamento relativo ou absoluto no qual ela estiver inserida;</li>
<li>Se uma div absoluta não estiver inserida em nenhum container definido com posicionamento relativo ou absoluto, sua referência para deslocamento será o ponto (0,0) do documento.</li>
</ol>
<p>Exemplificando, temos abaixo 3 estruturas idênticas. A diferença está no posicionamento da div azul definida no estilo:</p>
<div  style="background-color:#ff0000; position:relative; width:580px; margin:10px; padding:10px;">
<p>Div com position:relative;</p>
<div style="background-color:#00ff00;">Div sem posicionamento definido</div>
<div style="background-color:#0000ff;">Div sem posicionamento definido</div>
</div>
<div  style="background-color:#ff0000; position:relative; width:580px;margin:10px;  padding:10px;">
<p>Div com position:relative;</p>
<div style="background-color:#00ff00;">Div sem posicionamento definido</div>
<div style="background-color:#0000ff; position:relative; top:5px; left:5px;">Div com position:relative; top:5px; left:5px;</div>
</div>
<div  style="background-color:#ff0000; position:relative; width:580px; margin:10px; padding:10px;">
<p>Div com position:relative;</p>
<div style="background-color:#00ff00;">Div sem posicionamento definido</div>
<div style="background-color:#0000ff; position:absolute; top:5px; left:5px;">Div com position:absolute; top:5px; left:5px;</div>
</div>
<p>Vamos voltar ao nosso problema original? O ponto central deste post é a movimentação de uma div que contém a animação do personagem vista na postagem anterior. E se queremos movimentar a div, alteraremos as propriedades top e left da div do personagem. Para isso montamos a estrutura abaixo:</p>
<div class="html4strict" style="font-family:monospace;color: #006; border: 1px solid #d0d0d0; background-color: #f0f0f0;">
<ol>
<li style="font-weight: normal; vertical-align:top;font: normal normal 130% 'Courier New', Courier, monospace; color: #003030;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;color: #000020;"><span style="color: #009900;">&lt;<a style="color: #000060;" href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">div</span></a> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span>divCampo <span style="color: #000066;">style</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;background-image:url(http://blog.renatolouro.com.br/wp-content/uploads/Anime/terra.png); position:relative; width:580px; height:300px&quot;</span>&gt;</span></div>
</li>
<li style="font-weight: normal; vertical-align:top;font: normal normal 130% 'Courier New', Courier, monospace; color: #003030;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;color: #000020;"><span style="color: #009900;">&lt;<a style="color: #000060;" href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">div</span></a> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span>divAnime <span style="color: #000066;">style</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;position:absolute; top:0px; left:0px; &nbsp;width:96px; height:96px; background-image:url(http://blog.renatolouro.com.br/wp-content/uploads/Anime/andando.png);&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><a style="color: #000060;" href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">div</span></a>&gt;</span></div>
</li>
<li style="font-weight: normal; vertical-align:top;font: normal normal 130% 'Courier New', Courier, monospace; color: #003030;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;color: #000020;"><span style="color: #009900;">&lt;<a style="color: #000060;" href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">div</span></a> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span>divArvore <span style="color: #000066;">style</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;position:absolute; top:100px; left:150px; width:96px; height:96px; background-image:url(http://blog.renatolouro.com.br/wp-content/uploads/Anime/arvore.png);&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><a style="color: #000060;" href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">div</span></a>&gt;</span></div>
</li>
<li style="font-weight: normal; vertical-align:top;font: normal normal 130% 'Courier New', Courier, monospace; color: #003030;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;color: #000020;"><span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a style="color: #000060;" href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">div</span></a>&gt;</span></div>
</li>
</ol>
</div>
<p>E, por último, algumas poucas variações no código mostrado anteriormente. Agora precisaremos variar o top e left da div do personagem em conjunto com a própria animação.</p>
<pre name="code" class="javascript">
function timeout_trigger() {
     // Guarda as posições atuais de left e top caso seja necessário restaura-las.
	 var iAtualLeft=iPosLeft;
	 var iAtualTop=iPosTop;

	 frameAtual++;
     if(frameAtual==8) frameAtual=1;
     divAnime.style.backgroundPosition="-"+(frameAtual*iTamSprites)+"px -"+(tiraAtual*iTamSprites)+"px ";
	 //Dependendo de para onde o personagem está voltado, atualizamos o top ou left
	 switch(cVoltadoPara)
     {
        case 'L':
		   iPosLeft=iPosLeft-iTamPasso;
           break;
        case 'N':
		   iPosTop=iPosTop-iTamPasso;
		   break;
        case 'S':
		   iPosTop=iPosTop+iTamPasso;
		   break;
        case 'O':
		   iPosLeft=iPosLeft+iTamPasso;
		   break;
    default:
      break;
    }

	//Evita que o personagem avance pelas bordas do campo.
	if(iPosLeft<0 || iPosLeft+iTamSprites>iWCampo ||
           iPosTop<0 || iPosTop+iTamSprites>iHCampo)
	{
	   //Neste caso a posição anterior é restaurada
	   iPosLeft= iAtualLeft;
	   iPosTop = iAtualTop;
	   return;
	}
	//As propriedades left e top da div do personagem é finalmente atualizada.
    divAnime.style.left=iPosLeft+"px";
    divAnime.style.top=iPosTop+"px";
}
</pre>
<h3>Pendências</h3>
<p>Temos pelo menos 2 pendências claras:</p>
<ol>
<li>O personagem se comporta como um fantasma passando por dentro da árvore. Para evitar isso, na próxima postagem da série veremos como detectar colisões;</li>
<li>Eventualmente a div da árvore fica posicionada sobre o aventureiro, mesmo quando não deveria. Ainda nesta série veremos como utilizar a propriedade z-index para definir que div deve estar na frente da outra.</li>
</ol>
<p>Abraços e até a próxima!<br />
<script type="text/javascript" src="http://blog.renatolouro.com.br/wp-content/uploads/Anime/anime_mov.js"></script></p>


<!-- Begin SexyBookmarks Menu Code -->
<div class="sexy-bookmarks sexy-bookmarks-expand sexy-bookmarks-bg-caring">
<ul class="socials">
		<li class="sexy-delicious">
			<a href="http://del.icio.us/post?url=http://blog.renatolouro.com.br/2011/01/deslocamento-de-personagem-e-position-absolute-e-relative-de-div/&amp;title=Deslocamento+de+Personagem+com+Position%3A+Absolute+e+Relative" rel="nofollow" title="Share this on del.icio.us">Share this on del.icio.us</a>
		</li>
		<li class="sexy-digg">
			<a href="http://digg.com/submit?phase=2&amp;url=http://blog.renatolouro.com.br/2011/01/deslocamento-de-personagem-e-position-absolute-e-relative-de-div/&amp;title=Deslocamento+de+Personagem+com+Position%3A+Absolute+e+Relative" rel="nofollow" title="Digg this!">Digg this!</a>
		</li>
		<li class="sexy-myspace">
			<a href="http://www.myspace.com/Modules/PostTo/Pages/?u=http://blog.renatolouro.com.br/2011/01/deslocamento-de-personagem-e-position-absolute-e-relative-de-div/&amp;t=Deslocamento+de+Personagem+com+Position%3A+Absolute+e+Relative" rel="nofollow" title="Post this to MySpace">Post this to MySpace</a>
		</li>
		<li class="sexy-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://blog.renatolouro.com.br/2011/01/deslocamento-de-personagem-e-position-absolute-e-relative-de-div/&amp;t=Deslocamento+de+Personagem+com+Position%3A+Absolute+e+Relative" rel="nofollow" title="Share this on Facebook">Share this on Facebook</a>
		</li>
		<li class="sexy-twitter">
			<a href="http://twitter.com/home?status=Deslocamento+de+Personagem+com+Position%3A+Absolute+e+Relative+-+http://bit.ly/eD7g0e+" rel="nofollow" title="Tweet This!">Tweet This!</a>
		</li>
		<li class="sexy-comfeed">
			<a href="http://blog.renatolouro.com.br/2011/01/deslocamento-de-personagem-e-position-absolute-e-relative-de-div/feed" rel="nofollow" title="Subscribe to the comments for this post?">Subscribe to the comments for this post?</a>
		</li>
		<li class="sexy-linkedin">
			<a href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http://blog.renatolouro.com.br/2011/01/deslocamento-de-personagem-e-position-absolute-e-relative-de-div/&amp;title=Deslocamento+de+Personagem+com+Position%3A+Absolute+e+Relative&amp;summary=Numa%20postagem%20anterior%20vimos%20como%20animar%20um%20personagem%20utilizando%20o%20javascript.%20Hoje%20iremos%20unir%20a%20anima%C3%A7%C3%A3o%20do%20personagem%20com%20a%20movimenta%C3%A7%C3%A3o%20do%20mesmo%20sobre%20um%20fundo%20qualquer.%20Como%20este%20post%20%C3%A9%20uma%20continua%C3%A7%C3%A3o%2C%20recomendo%20a%20leitura%20da%20a%20postagem%20anterior%3A%20%20Javascript%3A%20anima%C3%A7%C3%B5es%20com%20Images%20%E2%80%93%20&amp;source=Blog do Renato, o Louro" rel="nofollow" title="Share this on Linkedin">Share this on Linkedin</a>
		</li>
		<li class="sexy-google">
			<a href="http://www.google.com/bookmarks/mark?op=add&amp;bkmk=http://blog.renatolouro.com.br/2011/01/deslocamento-de-personagem-e-position-absolute-e-relative-de-div/&amp;title=Deslocamento+de+Personagem+com+Position%3A+Absolute+e+Relative" rel="nofollow" title="Add this to Google Bookmarks">Add this to Google Bookmarks</a>
		</li>
		<li class="sexy-orkut">
			<a href="http://promote.orkut.com/preview?nt=orkut.com&amp;tt=Deslocamento+de+Personagem+com+Position%3A+Absolute+e+Relative&amp;du=http://blog.renatolouro.com.br/2011/01/deslocamento-de-personagem-e-position-absolute-e-relative-de-div/&amp;cn=Numa%20postagem%20anterior%20vimos%20como%20animar%20um%20personagem%20utilizando%20o%20javascript.%20Hoje%20iremos%20unir%20a%20anima%C3%A7%C3%A3o%20do%20personagem%20com%20a%20movimenta%C3%A7%C3%A3o%20do%20mesmo%20sobre%20um%20fundo%20qualquer.%20Como%20este%20post%20%C3%A9%20uma%20continua%C3%A7%C3%A3o%2C%20recomendo%20a%20leitura%20da%20a%20postagem%20anterior%3A%20%20Javascript%3A%20anima%C3%A7%C3%B5es%20com%20Images%20%E2%80%93%20" rel="nofollow" title="Promote this on Orkut">Promote this on Orkut</a>
		</li>
		<li class="sexy-blogger">
			<a href="http://www.blogger.com/blog_this.pyra?t&amp;u=http://blog.renatolouro.com.br/2011/01/deslocamento-de-personagem-e-position-absolute-e-relative-de-div/&amp;n=Deslocamento+de+Personagem+com+Position%3A+Absolute+e+Relative&amp;pli=1" rel="nofollow" title="Blog this on Blogger">Blog this on Blogger</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>
<!-- End SexyBookmarks Menu Code -->


]]></content:encoded>
			<wfw:commentRss>http://blog.renatolouro.com.br/2011/01/deslocamento-de-personagem-e-position-absolute-e-relative-de-div/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Javascript: animações com Images &#8211; background &#8211; e setInterval</title>
		<link>http://blog.renatolouro.com.br/2010/12/javascript-animacoes-com-images-background-e-setinterval/</link>
		<comments>http://blog.renatolouro.com.br/2010/12/javascript-animacoes-com-images-background-e-setinterval/#comments</comments>
		<pubDate>Mon, 27 Dec 2010 09:00:01 +0000</pubDate>
		<dc:creator>renatolouro</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[Programação de Jogos]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[sprite sheet]]></category>
		<category><![CDATA[tileset]]></category>

		<guid isPermaLink="false">http://blog.renatolouro.com.br/?p=738</guid>
		<description><![CDATA[Numa postagem anterior, vimos como fazer simples animações com caracteres utilizando a função setInterval do javascript. Hoje veremos algo bem mais legal: Animar personagens &#8211; sprites/titles &#8211; em javascript. Mas em primeiro lugar, é altamente recomendado que você leia a postagem anterior: Javascript: animações em caracteres com setInterval. Nessa outra postagem foi visto o fundamento [...]]]></description>
			<content:encoded><![CDATA[
<p><a href="http://blog.renatolouro.com.br/wp-content/uploads/2010/12/andando.png"><img src="http://blog.renatolouro.com.br/wp-content/uploads/2010/12/andando-300x240.png" alt="" title="andando" width="300" height="240" class="alignleft size-medium wp-image-743" /></a>Numa postagem anterior, vimos como fazer simples animações com caracteres utilizando a função setInterval do javascript. Hoje veremos algo bem mais legal: Animar personagens &#8211; sprites/titles &#8211;  em javascript. Mas em primeiro lugar, é altamente recomendado que você leia a postagem anterior: <a href="http://blog.renatolouro.com.br/2010/11/javascript-animacoes-em-caracteres-com-setinterval/">Javascript: animações em caracteres com setInterval</a>. Nessa outra postagem foi visto o fundamento da animação em javascript. Já o que faremos neste post é, utilizando aqueles mesmos conceitos, animar uma imagem, &#8216;dando vida&#8217; ao nosso personagem.  E o melhor, esta mesma técnica, ou melhor, os conceitos que veremos aqui, servem tanto para criar um jogo em javascript, assim como serviriam para criar um jogo em C utilizando SDL.</p>
<p>Mas antes de continuarmos veja como fica o resultado do trabalho pronto:<br />
<span id="more-738"></span></p>
<table>
<tr>
<th colspan=2>
<h3>Movimente o Aventureiro!</h3>
</th>
<tr>
<td>
<div id=divAnime style="width:96px; height:96px; background-color:#cc3d31; background-image:url(http://blog.renatolouro.com.br/wp-content/uploads/2010/12/andando.png);"></div>
</td>
<td>
<ul>
<li>Utilize as setas direcionais para movimentar o Aventureiro;</li>
<li>Escolha uma direção e mantenha a seta pressionada;</li>
<li>Logicamente as setas para baixo irá gerar o inconveniente de rolar a tela do blog.</li>
</ul>
</td>
</tr>
</table>
<p>Se você leu o post anterior sobre animação js, conforme foi recomendado, verá que a estratégia é bem próxima. A grande diferença é que enquanto no anterior alterávamos o conteúdo de cada tag que representava uma perninha do bicho, neste temos apenas um elemento, uma div, de tamanho fixo, onde variaremos o seu background. Para ser exato, como vocês verão, não alteramos a imagem background mas sim o posicionamento da mesma.<br />
Para realizar este efeito você precisará montar ou encontrar um arquivo chamado de sprite sheet. Um bom exemplo de sprite sheet é este que ilustra o post. Clique nele para ver a imagem ampliada. Mas é importante que seu sprite sheet &#8211; também conhecido como titleset &#8211; esteja arrumado de uma maneira lógica que permita uma programação conveniente. Recomendo que:<br />
1o Cada linha do seu sprite sheet represente uma animação. Ex.: Andando para a esquerda ou, bebendo água etc;<br />
2o Cada coluna seja um frame da animação específica;<br />
3o Cada frame tenha um mesmo tamanho. No meu caso todos os &#8216;bonequinhos&#8217; tem 96x96PX.</p>
<p>O sprite sheet que estou usando é quase isso. Apenas o primeiro frame de cada linha que é o personagem parado naquela direção. Sem problemas. Na prática você irá ajustar a programação ao seu sprite sheet. Veja duas linhas do que estou utilizando:</p>
<table border=1>
<tr>
<td>&#8212;-</td>
<td>Parado<br/>Frame 0</td>
<td>Frame 1</td>
<td>Frame 2</td>
<td>Frame 3</td>
<td>Frame 4</td>
<td>Frame 5</td>
<td>Frame 6</td>
<td>Frame 7</td>
<td>Frame 8</td>
<td>Frame 9</td>
</tr>
<tr>
<td style="height:50px">Animação 0</td>
<td colspan=11 rowspan=2>
<img src="http://blog.renatolouro.com.br/wp-content/uploads/2010/12/anime2lin.png" alt="" title="anime2lin"  class="alignleft size-medium wp-image-774" />
</td>
</tr>
<tr>
<td>Animação 1</td>
</tr>
</table>
<p>Depois de ter encontrado, montado e/ou criado seu sprite sheet, teremos que criar uma div para conter o personagem. Esta div deverá ter o mesmo tamanho de uma imagem isolada do seu sheet. No meu caso, isto significa que a div terá 96px por 96px.</p>
<div class="html4strict" style="font-family:monospace;color: #006; border: 1px solid #d0d0d0; background-color: #f0f0f0;">
<ol>
<li style="font-weight: normal; vertical-align:top;font: normal normal 130% 'Courier New', Courier, monospace; color: #003030;">
<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;color: #000020;"><span style="color: #009900;">&lt;<a style="color: #000060;" href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">div</span></a> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span>divAnime <span style="color: #000066;">style</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;width:96px; height:96px; background-color:#cc3d31; background-image:url(andando.png);&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><a style="color: #000060;" href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">div</span></a>&gt;</span></div>
</li>
</ol>
</div>
<p>Os mais atentos logo perceberão que a imagem de fundo inteira tem 960×768 pixels. Simplesmente não cabe inteira como fundo de uma div de 96×96 pixels. E é aí que está o segredo!</p>
<p>A idéia é posicionar o background com posições negativas de modo que no div, que funcionará como uma espécie de janela,  mostre exatamente o frame escolhido da animação corrente.<br />
Então, de cara, temos uma pequena fórmula para solucionar: Dada uma animação &#8211; linha &#8211; e um frame &#8211; coluna &#8211; qual a posição que o background deve ter para mostrar no div o frame correto?</p>
<p>No caso de frames de 96 por 96 pixels a fórmula para o posicionamento do background é:<br />
top: -96*Animação<br />
left: -96*Frame</p>
<p>Com isso o código inicial fica:</p>
<pre name="code" class="javascript">
//Define o frame inicial como o 0 da animação(tiraAtual) 0. Isto significa
//   'Parado para a direita'
var frameAtual=0;
var tiraAtual=0;
//Obtém a referência para a div do personagem
var divAnime=document.getElementById('divAnime');
//Inicializa a variável que conterá a referência para o temporizador.
var timeout=null;

//Iniciamos o background da div em (0, 0) Isto fará que apenas a primeira
//   figura seja mostrada.
divAnime.style.backgroundPosition="-"+(frameAtual*96)+"px -"+(tiraAtual*96)+"px ";
</pre>
<p>Assim como no post anterior definiremos as funções temporizadoras. A timeout_init e a timeout_clear ficam praticamente idênticas as do outro post com animação de caracteres. Já a timeout_trigger muda um pouco já que agora reposicionaremos o background de uma div em vez de modificarmos o conteúdo de uma tag.</p>
<pre name="code" class="javascript">
/*******************************************************
*  timeout_init():
*  Inicia o temporizador. Agenda a função timeout_trigger() para executar
*     a cada 100 milisegundos
*******************************************************/
function timeout_init() {
   if(timeout==null) timeout = setInterval('timeout_trigger()', 100);
}
/*******************************************************
*  timeout_trigger():
*  Faz a animação. Sempre que chamada varia o frame atual entre 1 e 7.
*  Neste caso o frame 0 é o personagem parado.
* Após atualizar o frame, reposiciona o background.
*******************************************************/
function timeout_trigger() {
	 frameAtual++;
     if(frameAtual==8) frameAtual=1;
     divAnime.style.backgroundPosition="-"+(frameAtual*96)+"px -"+(tiraAtual*96)+"px ";
}
/*******************************************************
*  timeout_clear():
*  Para o temporizador interrompendo também a animação.
*******************************************************/
function timeout_clear() {
    if(timeout!=null){
	   clearTimeout(timeout);
	   timeout=null;
	}
}
</pre>
<p>O próximo passo é tratar os eventos do teclado para que iniciem ou interrompam a animação. Primeiro pegaremos o evento keydown, ou seja, quando a tecla é pressionada. Neste momento, nós devemos redefinir a animação, tiraAtual, corrente e reiniciar o timer.</p>
<pre name="code" class="javascript">
document.onkeydown = function(event) {
  var keyCode; 

  if(event == null)
  {
    keyCode = window.event.keyCode;
  }
  else
  {
    keyCode = event.keyCode;
  }
  switch(keyCode)
  {
	// left
    case 37:
      tiraAtual=7;
	  if(frameAtual==0) timeout_init();
      break;
    // up
    case 38:
      tiraAtual=1;
	  if(frameAtual==0) timeout_init();
      break;
    // right
    case 39:
      tiraAtual=0;
	  if(frameAtual==0) timeout_init();
      break;
    // down
    case 40:
      tiraAtual=4;
	  if(frameAtual==0) timeout_init();
      break;
    default:
      break;
  }
}
</pre>
<p>E, por último, quando retiramos o dedo da tecla, definimos o frameAtual como 0 &#8211; personagem parado &#8211; e paramos o temporizador.</p>
<pre name="code" class="javascript">
document.onkeyup = function(event) {
  var keyCode; 

  if(event == null)
  {
    keyCode = window.event.keyCode;
  }
  else
  {
    keyCode = event.keyCode;
  }
  switch(keyCode)
  {
    case 37:
    case 38:
    case 39:
    case 40:
	  timeout_clear();
      frameAtual=0;
	  divAnime.style.backgroundPosition="-"+(frameAtual*96)+"px -"+(tiraAtual*96)+"px ";
      break;
    default:
      break;
  }
}
</pre>
<p>E é isso, espero que tenham gostado da postagem!<br />
Um forte abraço!</p>
<h3>Créditos e Uma Ótima Dica</h3>
<p>Um ótimo lugar para arranjar personagens, monstros e tiles em geral é no blog/site <a href="http://reinerstileset.4players.de/">Reiner`s Tilesets &#8211; FREE GAMEGRAPHICS AND FREEWAREGAMES</a>. Foi lá que arrumei este e vários outros!<br />
<script type="text/javascript" src="http://blog.renatolouro.com.br/wp-content/uploads/Anime/anime.js"></script></p>


<!-- Begin SexyBookmarks Menu Code -->
<div class="sexy-bookmarks sexy-bookmarks-expand sexy-bookmarks-bg-caring">
<ul class="socials">
		<li class="sexy-delicious">
			<a href="http://del.icio.us/post?url=http://blog.renatolouro.com.br/2010/12/javascript-animacoes-com-images-background-e-setinterval/&amp;title=Javascript%3A+anima%C3%A7%C3%B5es+com+Images+-+background+-+e+setInterval" rel="nofollow" title="Share this on del.icio.us">Share this on del.icio.us</a>
		</li>
		<li class="sexy-digg">
			<a href="http://digg.com/submit?phase=2&amp;url=http://blog.renatolouro.com.br/2010/12/javascript-animacoes-com-images-background-e-setinterval/&amp;title=Javascript%3A+anima%C3%A7%C3%B5es+com+Images+-+background+-+e+setInterval" rel="nofollow" title="Digg this!">Digg this!</a>
		</li>
		<li class="sexy-myspace">
			<a href="http://www.myspace.com/Modules/PostTo/Pages/?u=http://blog.renatolouro.com.br/2010/12/javascript-animacoes-com-images-background-e-setinterval/&amp;t=Javascript%3A+anima%C3%A7%C3%B5es+com+Images+-+background+-+e+setInterval" rel="nofollow" title="Post this to MySpace">Post this to MySpace</a>
		</li>
		<li class="sexy-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://blog.renatolouro.com.br/2010/12/javascript-animacoes-com-images-background-e-setinterval/&amp;t=Javascript%3A+anima%C3%A7%C3%B5es+com+Images+-+background+-+e+setInterval" rel="nofollow" title="Share this on Facebook">Share this on Facebook</a>
		</li>
		<li class="sexy-twitter">
			<a href="http://twitter.com/home?status=Javascript%3A+anima%C3%A7%C3%B5es+com+Images+-+background+-+e+setInterval+-+http://bit.ly/f9OUoe+" rel="nofollow" title="Tweet This!">Tweet This!</a>
		</li>
		<li class="sexy-comfeed">
			<a href="http://blog.renatolouro.com.br/2010/12/javascript-animacoes-com-images-background-e-setinterval/feed" rel="nofollow" title="Subscribe to the comments for this post?">Subscribe to the comments for this post?</a>
		</li>
		<li class="sexy-linkedin">
			<a href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http://blog.renatolouro.com.br/2010/12/javascript-animacoes-com-images-background-e-setinterval/&amp;title=Javascript%3A+anima%C3%A7%C3%B5es+com+Images+-+background+-+e+setInterval&amp;summary=Numa%20postagem%20anterior%2C%20vimos%20como%20fazer%20simples%20anima%C3%A7%C3%B5es%20com%20caracteres%20utilizando%20a%20fun%C3%A7%C3%A3o%20setInterval%20do%20javascript.%20Hoje%20veremos%20algo%20bem%20mais%20legal%3A%20Animar%20personagens%20-%20sprites%2Ftitles%20-%20%20em%20javascript.%20Mas%20em%20primeiro%20lugar%2C%20%C3%A9%20altamente%20recomendado%20que%20voc%C3%AA%20leia%20a%20postagem%20anterior%3A%20Jav&amp;source=Blog do Renato, o Louro" rel="nofollow" title="Share this on Linkedin">Share this on Linkedin</a>
		</li>
		<li class="sexy-google">
			<a href="http://www.google.com/bookmarks/mark?op=add&amp;bkmk=http://blog.renatolouro.com.br/2010/12/javascript-animacoes-com-images-background-e-setinterval/&amp;title=Javascript%3A+anima%C3%A7%C3%B5es+com+Images+-+background+-+e+setInterval" rel="nofollow" title="Add this to Google Bookmarks">Add this to Google Bookmarks</a>
		</li>
		<li class="sexy-orkut">
			<a href="http://promote.orkut.com/preview?nt=orkut.com&amp;tt=Javascript%3A+anima%C3%A7%C3%B5es+com+Images+-+background+-+e+setInterval&amp;du=http://blog.renatolouro.com.br/2010/12/javascript-animacoes-com-images-background-e-setinterval/&amp;cn=Numa%20postagem%20anterior%2C%20vimos%20como%20fazer%20simples%20anima%C3%A7%C3%B5es%20com%20caracteres%20utilizando%20a%20fun%C3%A7%C3%A3o%20setInterval%20do%20javascript.%20Hoje%20veremos%20algo%20bem%20mais%20legal%3A%20Animar%20personagens%20-%20sprites%2Ftitles%20-%20%20em%20javascript.%20Mas%20em%20primeiro%20lugar%2C%20%C3%A9%20altamente%20recomendado%20que%20voc%C3%AA%20leia%20a%20postagem%20anterior%3A%20Jav" rel="nofollow" title="Promote this on Orkut">Promote this on Orkut</a>
		</li>
		<li class="sexy-blogger">
			<a href="http://www.blogger.com/blog_this.pyra?t&amp;u=http://blog.renatolouro.com.br/2010/12/javascript-animacoes-com-images-background-e-setinterval/&amp;n=Javascript%3A+anima%C3%A7%C3%B5es+com+Images+-+background+-+e+setInterval&amp;pli=1" rel="nofollow" title="Blog this on Blogger">Blog this on Blogger</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>
<!-- End SexyBookmarks Menu Code -->


]]></content:encoded>
			<wfw:commentRss>http://blog.renatolouro.com.br/2010/12/javascript-animacoes-com-images-background-e-setinterval/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>

