﻿<?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>TidBits&#187; Javascript</title>
	<atom:link href="http://www.tidbits.com.br/category/javascript/feed" rel="self" type="application/rss+xml" />
	<link>http://www.tidbits.com.br</link>
	<description>Desenvolvimento de Front End</description>
	<lastBuildDate>Wed, 18 Jan 2012 00:41:33 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Porque a chave no Javascript deve ser aberta na linha de cima</title>
		<link>http://www.tidbits.com.br/porque-a-chave-no-javascript-deve-ser-aberta-na-linha-de-cima</link>
		<comments>http://www.tidbits.com.br/porque-a-chave-no-javascript-deve-ser-aberta-na-linha-de-cima#comments</comments>
		<pubDate>Wed, 18 Jan 2012 00:41:33 +0000</pubDate>
		<dc:creator>Danilo</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Padrões]]></category>

		<guid isPermaLink="false">http://www.tidbits.com.br/?p=1793</guid>
		<description><![CDATA[O Visual Studio, além de ser uma IDE mega pesada, tem um problema que gera intrigas entre equipes: ele abre por padrão uma função no JavaScript colocando a chave na linha de baixo. Parece algo mínimo, mas irrita profundamente quem está acostumado a trabalhar da forma correta. Porque forma correta? Simples, porque pode dar erro [...]]]></description>
			<content:encoded><![CDATA[<p>O Visual Studio, além de ser uma IDE mega pesada, tem um problema que gera intrigas entre equipes: ele abre por padrão uma função no JavaScript colocando a chave na linha de baixo. </p>
<p>Parece algo mínimo, mas irrita profundamente quem está acostumado a trabalhar da forma correta.</p>
<p>Porque forma correta? Simples, porque pode dar erro se colocar a chave na linha de baixo.</p>
<p>Pensem na função abaixo getUser que retorna um objeto em JavaScript</p>
<pre class="brush: jscript; title: ; notranslate">
function getUser(){
	return {
		nome:'Danilo',
		idade:28
	}
}

getUser() // retorna um objeto
</pre>
<p>Se fosse pra deixar a chave embaixo, ficaria assim:</p>
<pre class="brush: jscript; title: ; notranslate">
function getUser()
{
	return
	{
		nome:'Danilo',
		idade:28
	}
}

getUser() // retorna undefined
</pre>
<p>Só que há um problema: pelo fato do ponto e vírgula indicando quebra de linha ser no JavaScript ser opcional, o return não entende que é pra retornar um objeto e encerra a função ali, retornando undefined.</p>
<p>E tem um caso pior, que simplesmente dá erro de sintaxe:</p>
<pre class="brush: jscript; title: ; notranslate">
function getPosition()
{
   return
   {
       top:32,
       left:50
   }
}
// dá erro &quot;SyntaxError: Unexpected token :&quot;
</pre>
<p>E se fosse feito com os braces na linha de cima, daria certo.</p>
<p>O incrível é que mesmo com esse argumento, tem programador que não dá o braço a torcer e insiste dizendo que JavaScript veio do java e no java se programa assim. ERRADO, JavaScript veio de <a href="http://pt.wikipedia.org/wiki/Scheme" target="_blank">Scheme</a> e qualquer livro de <a href="http://novatec.com.br/livros/padroesjavascript/" target="_blank">Padrões em Javascript</a> vai aconselhar abrir o bloco com a chave na linha de cima.</p>
<p>Dá pra configurar isso no Visual Studio 2010 (no 2008 deve dar também).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tidbits.com.br/porque-a-chave-no-javascript-deve-ser-aberta-na-linha-de-cima/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Desenhando com a tag canvas em HTML5</title>
		<link>http://www.tidbits.com.br/desenhando-com-a-tag-canvas-em-html</link>
		<comments>http://www.tidbits.com.br/desenhando-com-a-tag-canvas-em-html#comments</comments>
		<pubDate>Tue, 25 Oct 2011 20:37:50 +0000</pubDate>
		<dc:creator>Danilo</dc:creator>
				<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://www.tidbits.com.br/?p=1773</guid>
		<description><![CDATA[A maioria das pessoas (inclusivo programadores front end) vê alguma aplicação onde é possível desenhar e pensa que é algo do capeta, complexo e precisa de 1 ano pra fazer, mas provavelmente ninguém nunca tentou. É simples! Obviamente precisa de um belo work-around pra funcionar em interfaces touch e o pior, versões antigas de IE. [...]]]></description>
			<content:encoded><![CDATA[<p>A maioria das pessoas (inclusivo programadores front end) vê alguma aplicação onde é possível desenhar e pensa que é algo do capeta, complexo e precisa de 1 ano pra fazer, mas provavelmente ninguém nunca tentou. É simples!</p>
<p>Obviamente precisa de um belo work-around pra funcionar em interfaces touch e o pior, versões antigas de IE. Mas a ideia em si é simples, basicamente no mousemove em cima do canvas você escreve uma linha com o LineTo, veja abaixo como ficou:</p>
<p><iframe width="460" height="470" frameborder="0" scrolling="no" src="http://www.tidbits.com.br/download/exemplos/desenhando-com-canvas-usando-html5/"></iframe>	</p>
<p>Bom, vamos aos códigos:</p>
<h3>HTML</h3>
<p>Criando a tag canvas e deixando uma mensagem caso o usuário não tenho um browser compatível com HTML5.</p>
<pre class="brush: xml; title: ; notranslate">
&lt;canvas id=&quot;canvas&quot; class=&quot;canvas&quot; width=&quot;400&quot; height=&quot;400&quot;&gt;
    Seu browser não suporta canvas, é hora de trocar!.
&lt;/canvas&gt;
</pre>
<h3>Javascript</h3>
<p>São só 29 linhas (bem indentadas e organizadas) de javascript</p>
<pre class="brush: jscript; title: ; notranslate">
var Draw = {
	obj : document.getElementById('canvas'),
	contexto : document.getElementById('canvas').getContext(&quot;2d&quot;),
	_init:function(){
		Draw.obj.onmousemove = Draw._over;
		Draw.obj.onmousedown = Draw._ativa;
		Draw.obj.onmouseup = Draw._inativa;
		Draw.obj.onselectstart = function () { return false; };
	},
	_over:function(e){
		if(!Draw.ativo) return;
		Draw.contexto.beginPath();
		Draw.contexto.lineTo(Draw.x,Draw.y);
		Draw.contexto.lineTo(e.layerX, e.layerY);
		Draw.contexto.stroke();
		Draw.contexto.closePath();
		Draw.x = e.layerX;
		Draw.y = e.layerY;
	},
	_ativa:function(e){
		Draw.ativo = true;
		Draw.x = e.layerX;
		Draw.y = e.layerY;
	},
	_inativa:function(){
		Draw.ativo = false;
	}
}
Draw._init();
</pre>
<h3>CSS</h3>
<p>Basicamente, é adicionar o cursor no elemento Canvas</p>
<pre class="brush: css; title: ; notranslate">
#canvas{ cursor: url(&quot;../img/pencil.gif&quot;), default; }
</pre>
<p>Então, não parece tão complicado, parece?</p>
<p>[]s,</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tidbits.com.br/desenhando-com-a-tag-canvas-em-html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Como usar requestAnimationFrame ao invés de setInterval</title>
		<link>http://www.tidbits.com.br/como-usar-requestanimationframe-ao-inves-de-setinterval</link>
		<comments>http://www.tidbits.com.br/como-usar-requestanimationframe-ao-inves-de-setinterval#comments</comments>
		<pubDate>Fri, 07 Oct 2011 20:08:15 +0000</pubDate>
		<dc:creator>Danilo</dc:creator>
				<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://www.tidbits.com.br/?p=1730</guid>
		<description><![CDATA[Um grande passo pra evolução do HTML não precisar de plugins como Flash e Silverlight pra renderizar conteúdo e fazer animações ou jogos é a implementação de um controle de frames (além da aceleração por hardware que hoje já está presente em algumas features do CSS3). Quando se fala em jogos e animações, pensamos em [...]]]></description>
			<content:encoded><![CDATA[<p>Um grande passo pra evolução do HTML não precisar de plugins como Flash e Silverlight pra renderizar conteúdo e fazer animações ou jogos é a implementação de um controle de frames (além da aceleração por hardware que hoje já está presente em algumas features do CSS3).</p>
<p>Quando se fala em jogos e animações, pensamos em quantidade de frames por segundo, ou seja, quantas vezes por segundo algo vai mexer na tela.</p>
<p>Uma quantidade razoável pro trabalho não ficar &#8220;pesado&#8221; ou &#8220;travado&#8221; é cerca de 30 frames por segundo. Enquanto o máximo que o olho humano consegue distinguir é em torno de 60 frames por segundo, ou seja, não adianta fazer uma animação com intervalo de 10 milisegundos, seu olho não vai enxergar isso.</p>
<p>Antes, pra fazermos uma animação, trabalhávamos com o setInterval fixo de X milisegundos, ou então, criavamos e chamavamos uma função que se auto-invocava novamente com setTimeout também com um valor fixo de X milisegundos. O problema é que esse X de milisegundos varia de acordo com cada browser, cada processador e alguma hora acabava ficando ou muito lento, ou muito rápido.</p>
<p>Hoje, é possível trabalhar com o requestAnimationFrame, e ao invés de você gerenciar intervalo para o processamento, o browser faz isso.</p>
<p>Imaginem uma função onde algo, sei lá, um boneco, ande.</p>
<p>Como seria com setTimeout?</p>
<pre class="brush: jscript; title: ; notranslate">
funcion mover(){
    var boneco = document.getElementById('boneco');
    boneco.style.left = (parseInt(boneco.style.left.replace('px','')) + 2).toString() + 'px';
}
setInterval(mover,20); // reinvoca a cada 20 miliseg.
</pre>
<p>Já com requestAnimationFrame  seria assim:</p>
<pre class="brush: jscript; title: ; notranslate">
funcion mover(){
    var boneco = document.getElementById('boneco');
    boneco.style.left = (parseInt(boneco.style.left.replace('px','')) + 2).toString() + 'px';
    mozRequestAnimationFrame(mover);
}
mover();
</pre>
<p>Nesse caso funcionaria só pra Firefox, mas tem uma função já que funciona cross-browser e pra usuários de browsers sem HTML5 tem um work-around com setTimeout:</p>
<pre class="brush: jscript; title: ; notranslate">
window.animationFrame = (function(){
	return	window.requestAnimationFrame       ||
		window.webkitRequestAnimationFrame ||
		window.mozRequestAnimationFrame    ||
		window.oRequestAnimationFrame      ||
		window.msRequestAnimationFrame     ||
		function(/* function */ callback, /* DOMElement */ element){
			window.setTimeout(callback, 1000 / 60);
		};
})();
</pre>
<p>Nesse caso, ficaria assim:</p>
<pre class="brush: jscript; title: ; notranslate">
funcion mover(){
    var boneco = document.getElementById('boneco');
    boneco.style.left = (parseInt(boneco.style.left.replace('px','')) + 2).toString() + 'px';
    animationFrame (mover);
}
mover();
</pre>
<h2>Detalhes</h2>
<p>Quando você troca de aba com o requestAnimationFrame, o processamento da animação / jogo / whatever é pausado na hora, e quando você volta, ele retorna.</p>
<p>Já no setInterval, hoje, pra dar uma melhor performance nos browsers, a maioria deles quando você troca de tab, ele automaticamente aumenta qualquer setInterval pra 1000 milisegundos se você ter declarado menos do que isso, e retorna ao valor inicial quando a aba é ativada novamente</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tidbits.com.br/como-usar-requestanimationframe-ao-inves-de-setinterval/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Entendendo melhor o console do firebug</title>
		<link>http://www.tidbits.com.br/entendendo-melhor-o-console-do-firebug</link>
		<comments>http://www.tidbits.com.br/entendendo-melhor-o-console-do-firebug#comments</comments>
		<pubDate>Thu, 06 Oct 2011 21:34:55 +0000</pubDate>
		<dc:creator>Danilo</dc:creator>
				<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Tecnologia]]></category>

		<guid isPermaLink="false">http://www.tidbits.com.br/?p=1714</guid>
		<description><![CDATA[O console do firebug é uma poderosa ferramenta que além de mostrar erros de JavaScript, erros 404 e todos os detalhes de uma requisição ajax, é capaz de interagir com o próprio firebug, inspecionando os nodes HTML. Mas o uso maior do console, é pra debugar javascript mesmo. Vou listar alguns comandos, funcionam tanto no [...]]]></description>
			<content:encoded><![CDATA[<p>O console do firebug é uma poderosa ferramenta que além de mostrar erros de JavaScript, erros 404 e todos os detalhes de uma requisição ajax, é capaz de interagir com o próprio firebug, inspecionando os nodes HTML.</p>
<p>Mas o uso maior do console, é pra debugar javascript mesmo.</p>
<p>Vou listar alguns comandos, funcionam tanto no Firebug pro Firefox, quando no &#8220;Developer Tools&#8221; do Google Chrome</p>
<h2>console.log ou console.debug</h2>
<p><strong>Sintaxe:</strong> console.log(variaveis);<br />
<strong>Serve para:</strong> debugar variáveis no javascript ao invés de colocar 300 alerts</p>
<p>Até hoje, nunca descobri a diferença (se é que existe) entre os dois métodos.<br />
Um detalhe que pouca gente sabe, é que é possível passar infinitos argumentos nessa função.</p>
<pre class="brush: jscript; title: ; notranslate">
var nome = 'Danilo';
var sobrenome = 'Augusto';
var nome_completo = nome+' '+sobrenome;
console.log(nome_completo);
// Danilo Augusto
console.log('nome:',nome);
// nome: Danilo
console.log('nome:',nome,' e sobrenome: ',sobrenome);
// nome: Danilo e sobrenome: Augusto
</pre>
<h2> console.dir </h2>
<p><strong>Sintaxe:</strong> console.dir(objeto);<br />
<strong>Serve para:</strong> debugar um objeto, mostrando todos os childs dele</p>
<pre class="brush: jscript; title: ; notranslate">
var posicoes = {
    left:10,
    top:50
}
console.dir(posicoes);
// left	10
// top 50
</pre>
<p>Ou então: </p>
<p>console.dir(document.getElementById(&#8216;menu&#8217;));</p>
<p>retorna tudo sobre o elemento:</p>
<p><a href="http://www.tidbits.com.br/wp-content/uploads/2011/10/console.dir_.jpg"><img src="http://www.tidbits.com.br/wp-content/uploads/2011/10/console.dir_.jpg" alt="" title="Exemplo de funcionamento do console.dir do Firebug" width="460" height="231" class="alignnone size-full wp-image-1720" /></a></p>
<h2>copy</h2>
<p><strong>Sintaxe:</strong> copy(variavel);<br />
<strong>Serve para:</strong> copiar uma variável para a área de transferência do sistema operacional (funciona como um ctrl+c)</p>
<pre class="brush: jscript; title: ; notranslate">
copy(document.getElementById('erro').innerHTML)
</pre>
<h2>$0</h2>
<p><strong>Sintaxe:</strong> $0<br />
<strong>Serve para:</strong> retornar o objeto selecionado/inspecionado no próprio firebug.</p>
<pre class="brush: jscript; title: ; notranslate">
$0.style.display = 'none';
</pre>
<h2>$$</h2>
<p><strong>Sintaxe:</strong> $$(expressao)<br />
<strong>Serve para:</strong> retornar um ou mais objetos através de um seletor.</p>
<p>Funciona como o $ do jQuery. Então, é ideal pra testar em sites que não usam jQuery (sacou? sacou?).</p>
<pre class="brush: jscript; title: ; notranslate">
$$('#footer').style.display = 'none';
</pre>
<h2>inspect</h2>
<p><strong>Sintaxe:</strong> inspect(elemento)<br />
<strong>Serve para:</strong> inspecionar no próprio firebug um elemento HTML.</p>
<p>Funciona como o $ do jQuery. Então, é ideal pra testar em sites que não usam jQuery (sacou? sacou?).</p>
<pre class="brush: jscript; title: ; notranslate">
inspect($$('#footer'));
</pre>
<p>Acho interessante quem gostou do assunto dar uma olhada num vídeo do Paul Irish em que ele demonstra essas e outras funções do console do firebug.</p>
<p><iframe width="460" height="342" src="http://www.youtube.com/embed/4mf_yNLlgic?rel=0" frameborder="0" allowfullscreen></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://www.tidbits.com.br/entendendo-melhor-o-console-do-firebug/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adicionando callbacks por JavaScript no tweet button / like button / +1 button</title>
		<link>http://www.tidbits.com.br/adicionando-callbacks-por-javascript-no-tweet-button-like-button-1-button</link>
		<comments>http://www.tidbits.com.br/adicionando-callbacks-por-javascript-no-tweet-button-like-button-1-button#comments</comments>
		<pubDate>Mon, 26 Sep 2011 23:31:46 +0000</pubDate>
		<dc:creator>Danilo</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Redes Sociais]]></category>

		<guid isPermaLink="false">http://www.tidbits.com.br/?p=1672</guid>
		<description><![CDATA[Imaginei vários cenários em que isso pode ser útil, basicamente adicionando uma função de callback no JavaScript após twittar ou dar like / curtir ou apertar o botão mágico que o Google inventou, que quando você clica soma 1 (HÁ!), enfim, pode evitar que você precise programar server-side e se preocupar com oauth, e os [...]]]></description>
			<content:encoded><![CDATA[<p>Imaginei vários cenários em que isso pode ser útil, basicamente adicionando uma função de callback no JavaScript após twittar ou dar like / curtir ou apertar o botão mágico que o Google inventou, que quando você clica soma 1 (HÁ!), enfim, pode evitar que você precise programar server-side e se preocupar com oauth, e os malditos tokens, ou seja, dá pra fazer tudo no JavaScript, tipo:</p>
<ul>
<li>Como trackear ou <strong> como colocar tags do Google Analytics no tweet button , like button e +1 button</strong>, mensurando o compartilhamento de cada post, página ou sessão do site nas redes sociais.</li>
<li>Aplicações do tipo, <strong>pague com um tweet</strong>, ou <strong>compartilhe para fazer o download</strong>, liberando um conteúdo, uma foto um vídeo ou qualquer arquivo somente depois que o usuário efetivamente compartilhar a página no Twitter, Facebook ou Google Plus.</li>
<li>Fazer coisas bregas do tipo &#8220;<strong>Obrigado por compartilhar</strong>&#8220;, tem gente que adora isso, sério.</li>
</ul>
<p><span id="more-1672"></span><br />
Vamos aos códigos&#8230;</p>
<h2>Callback no Like Button</h2>
<p>Dos três botões, o único que tem frescura é o do Facebook, pois ainda que você faça tudo no JavaScript, ele te obriga a criar uma app lá no canal de desenvolvedores deles, vai lá, criar uma App só pra pegar o ID. Além disse também tem a frescura de precisar colocar o atributo <strong>xmlns:fb=&#8221;http://www.facebook.com/2008/fbml&#8221;</strong> dentro da sua tag &lt;html&gt; .<br />
E dentro do seu &lt;body&gt; (que gay isso), no lugar onde você vai colocar o like button, adicione:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;div id=&quot;fb-root&quot;&gt;&lt;/div&gt;
&lt;fb:like&gt;&lt;/fb:like&gt;
</pre>
<p>E lá no fim do body, em javascript:</p>
<pre class="brush: jscript; title: ; notranslate">
	window.fbAsyncInit = function() {
		FB.init({appId: 'SUA_APP_ID', status: true, cookie: true, xfbml: true});
		FB.Event.subscribe('edge.create', function(href, widget) {
			alert('Você acabou de curtir a página: '+href);
		});
	};
	(function() {
		var e = document.createElement('script');
		e.type = 'text/javascript';
		e.src = document.location.protocol + '//connect.facebook.net/pt_BR/all.js';
		e.async = true;
		document.getElementById('fb-root').appendChild(e);
	}());
</pre>
<p>E vai funcionar assim:</p>
<div id="fb-root"></div>
<p><fb:like></fb:like></p>
<p><script type="text/javascript">
	window.fbAsyncInit = function() {
		FB.init({appId: '167712269965150', status: true, cookie: true, xfbml: true});
		FB.Event.subscribe('edge.create', function(href, widget) {
			alert('Você acabou de curtir a página: '+href);
		});
	};
	(function() {
		var e = document.createElement('script');
		e.type = 'text/javascript';
		e.src = document.location.protocol + '//connect.facebook.net/pt_BR/all.js';
		e.async = true;
		document.getElementById('fb-root').appendChild(e);
	}());
</script>	</p>
<p>Clica aí em like, e depois que você efetivamente compartilhar, vai dar um alert de callback, obviamente poderia ser qualquer outra coisa, como usar uma tag do analytics, ou dar show/hide numa div, sei lá.</p>
<h2>Callback no Tweet Button</h2>
<p>Tem um detalhe só, tem um script que necessariamente tem que estar dentro da tag &lt;head&gt; :</p>
<pre class="brush: xml; title: ; notranslate">
&lt;script src=&quot;http://platform.twitter.com/anywhere.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
</pre>
<p>No demais, sem segredo, onde você for colocar o tweet button é só colocar o seguinte html</p>
<pre class="brush: xml; title: ; notranslate">
&lt;a href=&quot;https://twitter.com/share&quot; class=&quot;twitter-share-button&quot; data-count=&quot;vertical&quot; data-via=&quot;maktuiu&quot;&gt;Tweet&lt;/a&gt;

&lt;script type=&quot;text/javascript&quot; src=&quot;http://platform.twitter.com/widgets.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
	twttr.events.bind('tweet', function(event,user) {
		alert('Você twittou pelo tweet button =)');
	});
&lt;/script&gt;
</pre>
<p>E vai funcionar assim:</p>
<p><a href="https://twitter.com/share" class="twitter-share-button" data-count="vertical" data-via="maktuiu">Tweet</a></p>
<p><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script><br />
<script type="text/javascript">
	twttr.events.bind('tweet', function(event,user) {
		alert('Você twittou pelo tweet button =)');
	});
</script> </p>
<p>Testa aí, é a mesma coisa do Like button.</p>
<h2>Plus One Button</h2>
<p>Sem frescuras, simples e além de saber se alguém clicou no +1, dá pra saber se alguém desclicou depois:</p>
<p>O código é este:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;g:plusone annotation=&quot;inline&quot; callback=&quot;PlusOneCallBack&quot;&gt;&lt;/g:plusone&gt;

&lt;script type=&quot;text/javascript&quot;&gt;
	function PlusOneCallBack(obj){
		if(obj.state=='on'){
			alert('você clicou no +1');
		} else {
			alert('você desclicou no +1');
		}
	}
	(function() {
		var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
		po.src = 'https://apis.google.com/js/plusone.js';
		var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
	})();
&lt;/script&gt;
</pre>
<p>E vai funcionar assim:</p>
<p><g:plusone annotation="inline" callback="PlusOneCallBack"></g:plusone></p>
<p><script type="text/javascript">
	function PlusOneCallBack(obj){
		if(obj.state=='on'){
			alert('você clicou no +1');
		} else {
			alert('você desclicou no +1');
		}
	}
	(function() {
		var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
		po.src = 'https://apis.google.com/js/plusone.js';
		var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
	})();
</script></p>
<h2>FAQ</h2>
<ul>
<li>
Não dá pra saber, nos 3 casos, dados da pessoa que compartilhou (como foto, nome, perfil, senha do banco, etc), pra acessar dados do perfil é necessário pedir permissão no applicativo, e aí é obrigado a passar por aquele pedágio &#8220;O aplicativo tal que saber suas informações de blablabla&#8221;. Não é essa a intenção de quem quer simplemente compartilhar um conteúdo.</li>
<li>Pro orkut, naquele &#8220;Promova&#8221; não sei se tem algo do tipo ou não, e também não estou muito interessado em ir atrás.</li>
</ul>
<p>Bom, é isso.</p>
<p>[]s,</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tidbits.com.br/adicionando-callbacks-por-javascript-no-tweet-button-like-button-1-button/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Ambientes 3D usando HTML5 e Javascript com Canvas</title>
		<link>http://www.tidbits.com.br/ambientes-3d-usando-html5-e-javascript-com-canvas</link>
		<comments>http://www.tidbits.com.br/ambientes-3d-usando-html5-e-javascript-com-canvas#comments</comments>
		<pubDate>Thu, 06 Jan 2011 13:35:18 +0000</pubDate>
		<dc:creator>Danilo</dc:creator>
				<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://www.tidbits.com.br/?p=1614</guid>
		<description><![CDATA[Já ouvi dezenas e dezenas de programadores de interface dizendo que Flash vai morrer com o html5, do mesmo jeito que flash ía morrer quando jQuery se tornou popular. Entretanto, a intenção da W3C, é sim tanto Flash quanto Silverlight e Unity serem &#8220;desnecessários&#8221;. Segundo eles, um browser deve ser auto-suficiente e não é correto [...]]]></description>
			<content:encoded><![CDATA[<p>Já ouvi dezenas e dezenas de programadores de interface dizendo que Flash vai morrer com o html5, do mesmo jeito que flash ía morrer quando jQuery se tornou popular. Entretanto, a intenção da W3C, é sim tanto Flash quanto Silverlight e Unity serem &#8220;desnecessários&#8221;. Segundo eles, um browser deve ser auto-suficiente e não é correto este cenário de hoje onde precisamos de algum plugin pra ter uma funcionalidade extra no navegador. Todas as funcionalidades deveriam estar incorporadas no browser. Com o HTML5, CSS3 e Javascript V8 podemos (ou poderemos) trabalhar com áudio, vídeo, webcam, aceleração por hardware, armazenamento offline, etc&#8230; talvez esse cenário de &#8220;flash morrer&#8221; vire realidade um dia daqui uns 10 anos, quem sabe? Porém, até isso acontecer, temos que evoluir muito em Javascript, MUITO! Frameworks 3D em javascript estão começando a aparecer. E com o &#8220;apoio&#8221; da apple ao HTML5 simplesmente bloqueando o flash nos Ipads / Iphones, parece que agora é o momento ideal para o &#8220;Programador HTML&#8221; se tornar uma profissional respeitado e bem pago no Brasil, assim como já é nos Estados Unidos e na Europa, ou será que vão &#8220;botar o estágiário que faz mail marketing&#8221; pra fazer uma aplicação 3D usando o Notepad++ ?</p>
<p>No post de hoje, não vou falar de código, só quero mostrar <strong>parte</strong> do que temos atualmente de mais avançado em html5 / javascript. Vou mostrar alguns cases de <strong>ambientes 3D programados em javascript</strong> com o auxilio de Canvas:</p>
<h3> 3DTim </h3>
<p>Impressiona! Feito em canvas, a aplicação permite desenhar objetos 3D e manipular tanto o objeto quanto a câmera, visualizando o objeto criado em qualquer ângulo. Além de Canvas, o case explora outras propriedades de html5 como armazenamento offline e as novas propriedade / métodos de Javascript.</p>
<p><a href="http://www.3Dtin.com/" target="_blank"><img src="http://www.tidbits.com.br/wp-content/uploads/2011/01/ambientes-3d-em-javascript-3dtin.jpg" alt="aplicação permite desenhar objetos 3D em HTML5"/></a></p>
<h3> Canvas 3D</h3>
<p>Usando canvas, a aplicação mostra uma espécie de exposição de fotos em 3D e roda bem. Na minha máquina com Firefox com 20 extensões, batia em média 28 frames por segundo. No chrome 8 / IE9 batia 44 frames por segundo, navegando e andando em 3D.</p>
<p><a href="http://www.dhteumeuleu.com/canvas-3D/" target="_blank"><img src="http://www.tidbits.com.br/wp-content/uploads/2011/01/ambientes-3d-em-javascript-canvas.jpg" alt="exposição de fotos em 3D com HTML5"/></a></p>
<h3>Wolfenstein 3D com DOM</h3>
<p>O primeiro foi feito por programadores do Opera, é uma simulação do Wolfenstein 3D feito com Javascript manipulando objetos em DOM e em Canvas, eles fizeram um <a href="http://dev.opera.com/articles/view/creating-pseudo-3D-games-with-html-5-can-1/" target="_blank">tutorial passo a passo</a> de como desenvolveram o jogo. O game roda bem, porém como foi feito em DOM, o processamento dele é meio pesado. Manipular tantos objetos ao mesmo tempo é complicado. Se fosse feito em canvas rodaria muito melhor, em compensação roda (lento e sem o mapa) até em IE6!</p>
<p><a href="http://devfiles.myopera.com/articles/650/step_4_enemies.htm" target="_blank"><img src="http://www.tidbits.com.br/wp-content/uploads/2011/01/ambientes-3d-javascript-wolfstein.png" alt="Wolfenstein 3D em Javascript"/></a></p>
<h3> Mandatory upgrade (Parallax 3D) </h3>
<p>Outro case no dhteumeuleu, o que mais impressiona é que foi feito em abril de 2008! Quando html5 engatinhava, já tinha gente em jobs complexos usando canvas.</p>
<p><a href="http://www.dhteumeuleu.com/mandatory-upgrade/" target="_blank"><img src="http://www.tidbits.com.br/wp-content/uploads/2011/01/ambientes-3d-em-javascript-mandatory-upgrade.jpg" alt="Parallax 3D com canvas"/></a></p>
<h3> Wolfenstein 3D com 1kb de Javscript </h3>
<p>Este foi um case para o JS1K, um concurso que desafiava criar coisas mais interessantes usando apenas 1kb de js. E conseguiram fazer um ambiente 3D em Javascript. É tosco, ok, mas tem 1kb! </p>
<p><a href="http://www.p01.org/releases/WOLF1K/js1k.htm" target="_blank"><img src="http://www.tidbits.com.br/wp-content/uploads/2011/01/ambientes-3d-em-javascript-wolfstein-1kb.gif" alt="Wolfenstein 3D com 1kb de Javscript"/></a></p>
<h3>Canvas 3D engine</h3>
<p>Um experimento feito com uma lib para aplicações 3D em javascript chamado Clay3D, é simples a lib e fornece diversos métodos para criar e manipular objetos de diversas formas geométricas além de permitir rotacionar a câmera em qualquer ângulo / zoom.<br />
<a href="http://www.xs4all.nl/~peterned/3D/" target="_blank"><img src="http://www.tidbits.com.br/wp-content/uploads/2011/01/ambientes-3d-em-javascript-engine3d.jpg" alt="Canvas 3D engine"/></a></p>
<p>Se alguém lembrar de algum case do tipo que eu não mostrei, deixe comentário. =)<br />
[]s,</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tidbits.com.br/ambientes-3d-usando-html5-e-javascript-com-canvas/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introdução ao &lt;canvas&gt; &#8211; um objeto girando</title>
		<link>http://www.tidbits.com.br/introducao-ao-canvas-um-objeto-girando</link>
		<comments>http://www.tidbits.com.br/introducao-ao-canvas-um-objeto-girando#comments</comments>
		<pubDate>Wed, 10 Nov 2010 18:32:57 +0000</pubDate>
		<dc:creator>Danilo</dc:creator>
				<category><![CDATA[canvas]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Tendências]]></category>

		<guid isPermaLink="false">http://www.tidbits.com.br/?p=1601</guid>
		<description><![CDATA[Acredito muito em &#60;canvas&#62; por ser uma tecnologia que já está no mercado a bastante tempo e boa parte dos browsers já aceita. O único browser que dá problema, vamos lá, adivinhem&#8230;. sim, é o Internet Explorer, nas versões  6, 7 e 8 porém eles tem o objeto deles (do famoso padrão Microsoft &#8220;me deu [...]]]></description>
			<content:encoded><![CDATA[<p>Acredito muito em &lt;canvas&gt; por ser uma tecnologia que já está no mercado a bastante tempo e boa parte dos browsers já aceita. O único browser que dá problema, vamos lá, adivinhem&#8230;. sim, é o Internet Explorer, nas versões  6, 7 e 8 porém eles tem o objeto deles (do famoso padrão Microsoft &#8220;me deu na telha criar isso&#8221;), chamado shape, esse objeto não é igual ao canvas, tem menos métodos, mas dá pra criar algo nele.</p>
<p>Mas existem frameworks, como o <a href="http://excanvas.sourceforge.net/" target="_blank">explorer canvas</a>, que traduzem um código javascript que é feito em canvas, pra shape, ou seja, na teoria o Internet Explorer não é um problema pra desenvolvermos em canvas. Na teoria, já na prática alguns métodos não funcionam, como degradê radial e escrever texto em canvas também dá problemas.</p>
<p><img src="http://www.tidbits.com.br/download/_images/copy.gif" alt="copy of tidbits"/>Mas, ainda assim, graças ao mercado de mobile e tablets que não tem suporte ainda direito a flash, o uso de canvas pra interfaces de navegação ou até mesmo jogos. No site <a href="http://www.canvasdemos.com/" target="_blank">Canvas Demos</a> dá pra ver dezenas de aplicações em canvas que se pode se comparar muito facilmente com sites feitos em flash. Porém são mais acessíveis, muitas vezes até pro IE6.</p>
<p>Vamos programar um pouco:</p>
<h2>HTML</h2>
<p>Só adicionar no seu html</p>
<pre class="brush: xml; title: ; notranslate">
	&lt;canvas id=&quot;canvas&quot; width=&quot;300&quot; height=&quot;300&quot;&gt;
		Seu browser não suporta canvas
	&lt;/canvas&gt;
</pre>
<h2>Javascript</h2>
<pre class="brush: jscript; title: ; notranslate">

// função que move um objeto em circulos calculando x e y
var fx = function(centro_x, raio, incremento){
    return (centro_x + raio*Math.cos(incremento/20))
}
var fy = function(centro_y, raio, incremento){
    return (centro_y + raio*Math.sin(incremento/20))
}

// Contexto trata-se do estado objeto canvas
var contexto;

// O incremento é o que faz o objeto girar;
// se você calcular fx() com 0
// e depois calcular fx() com 1, 2, 3... etc
// a funcao retornará uma posição de X em forma de círculo
// e a mesma coisa com fy();
var incremento = 1; 

var Canvas = {
	// iniciando o objeto
	_init:function(){
		// Instanciando o contexto do canvas
		// numa variavel global
		contexto = document.getElementById('canvas').getContext(&quot;2d&quot;);
		// aqui eu peço pra funçao que vai posicionar
		// o canvas ser chamada a cada 30 milisegundos
		return setInterval(Canvas._preencher, 30);
	},
	_preencher:function(){
		// apagando o que tinha no canvas
		// não é possível desenhar um objeto no canvas
		// e depois mover ele pra isso é necessário
		// apagar o conteudo do canvas
		// e desenhar tudo novamente 

		contexto.clearRect(0,0,300,300);

		/* CRIANDO UM QUADRADO COM DEGRADÊ */
		// inicia o desenho
		contexto.beginPath();
		// cria um degradê
		var my_gradient = contexto.createLinearGradient(300, 0, 0, 300);
		// adiciona a cor de inicio
		my_gradient.addColorStop(0, '#ff5');
		// adiciona a cor final
		my_gradient.addColorStop(1, &quot;#f60&quot;);
		// adiciona o degradê ao estilo do contexto
		contexto.fillStyle = my_gradient;
		// cria um quadrado 300x300 na posicao 0x0
		contexto.fillRect(0, 0, 300, 300);
		// fecha o desenho
		contexto.closePath();

		// CALCULANDO X E Y DO OBJETO
		x = fx(150, 100, incremento);
		y = fy(150, 100, incremento);

		// acionando o incremento
		incremento++;		

		// o incremento não precisa ser maior
		// do que PI * 2 * Numero de vezes
		// que vc quer pra dar uma volta
		// assim fica mais facil e rapido pro js
		// trabalhar com 0 a 63
		// do que 0 a infinito
		if( incremento == Math.PI * 2 * 20 ) incremento = 0

		// CRIANDO O CIRCULO
		// redefinindo o estilo do canvas pra pretro
		contexto.fillStyle = &quot;#000000&quot;;
		// inicia um novo desenho
		contexto.beginPath();
		//  criando o circulo
		contexto.arc(x, y, 10, 0, Math.PI * 2, true);
		// preenchendo a cor dele
		contexto.fill();
		// fecha o desenho
		contexto.closePath();
	}
}
// iniciando nosso js
window.onload = Canvas._init;
</pre>
<h2> Resultado </h2>
<p><iframe width="300" height="300" frameborder="0" scrolling="no" src="http://www.tidbits.com.br/download/exemplos/vitrine/basico.html"></iframe>	</p>
<p>E depois disso dá pra brincar, vejam outros exemplos que eu fiz, deu pra usar o explorer canvas, ou seja, é acessível pra todos os browsers, desde ie6 até iphone:</p>
<h2> Com sombras </h2>
<p><iframe width="300" height="300" frameborder="0" scrolling="no" src="http://www.tidbits.com.br/download/exemplos/vitrine/sombras.html"></iframe>	</p>
<h2> Estilo Vitrine </h2>
<p><iframe width="300" height="300" frameborder="0" scrolling="no" src="http://www.tidbits.com.br/download/exemplos/vitrine/vitrine.html"></iframe></p>
<p>Quem se interessar, deixei <a href="http://www.tidbits.com.br/download/exemplos/vitrine/vitrine.zip">todos os exemplos disponíveis pra download</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tidbits.com.br/introducao-ao-canvas-um-objeto-girando/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Winamp em HTML5 e Javascript</title>
		<link>http://www.tidbits.com.br/winamp-em-html5-e-javascript</link>
		<comments>http://www.tidbits.com.br/winamp-em-html5-e-javascript#comments</comments>
		<pubDate>Thu, 16 Sep 2010 19:01:46 +0000</pubDate>
		<dc:creator>Danilo</dc:creator>
				<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Tendências]]></category>

		<guid isPermaLink="false">http://www.tidbits.com.br/?p=1587</guid>
		<description><![CDATA[A alguns meses atrás eu fiz uma série de experimentos em HTML5, um deles foi um player de áudio simulando o bom e velho winamp. O que tem de HTML5? Pouco, tem a tag audio, drag and drop eu comecei a fazer pra controlar o volume. Pesa pouco, na verdade usei o jQuery, fora isso [...]]]></description>
			<content:encoded><![CDATA[<p>A alguns meses atrás eu fiz uma série de experimentos em HTML5, um deles foi um player de áudio simulando o bom e velho winamp.</p>
<p><a href="http://www.tidbits.com.br/download/html5/danilo-winamp/danilo-winamp-html5.zip"><img src="http://www.tidbits.com.br/wp-content/uploads/2010/09/player_winamp_em_html5.png" alt="Foto do player de winamp em HTML5 rodando no Opera"/></a></p>
<p>O que tem de HTML5? </p>
<p>Pouco, tem a tag audio, drag and drop eu comecei a fazer pra controlar o volume.</p>
<p>Pesa pouco, na verdade usei o jQuery, fora isso são 14kb de js.</p>
<p>O player aceita todos os atalhos do Winamp :</p>
<p>Z > Volta Música<br />
X > Play<br />
C > Pause<br />
V > Stop<br />
B > Avançar Música</p>
<p>-> (Seta para direita) > Avança 5 segundos<br />
<- (Seta para esquerda) > Volta 5 segundos</p>
<p>Scroll do Mouse > Aumenta e diminui o volume</p>
<p>O player roda no Chrome 5.0+, Firefox 3.6+ (porém no Firefox, por segurança deles, só roda se tiver num servidor, não adianta tentar abrir o html), Opera 10.5+, Safari 5+.</p>
<p>Pra quem quiser dar uma olhada, ou contribuir com algo, deixei o player <a href="http://www.tidbits.com.br/download/html5/danilo-winamp/danilo-winamp-html5.zip">disponível para download aqui</a>. Como tem músicas em ogg e em mp3 (por causa do Safari que não roda .ogg), são 16mb pra baixar.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tidbits.com.br/winamp-em-html5-e-javascript/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>My-Guitar &#8211; Um Guitar Hero em HTML5, CSS3 e JavaScript</title>
		<link>http://www.tidbits.com.br/my-guitar-um-guitar-hero-em-html5-e-javascript</link>
		<comments>http://www.tidbits.com.br/my-guitar-um-guitar-hero-em-html5-e-javascript#comments</comments>
		<pubDate>Fri, 16 Jul 2010 19:47:23 +0000</pubDate>
		<dc:creator>Danilo</dc:creator>
				<category><![CDATA[canvas]]></category>
		<category><![CDATA[Games]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://www.tidbits.com.br/?p=1559</guid>
		<description><![CDATA[Nessa sexta-feira, teve um café com browser, um evento sediado pela w3c Brasil onde ela convida fabricantes de browsers a falarem dos seus produtos, por lá já passou o pessoal do Ópera, Firefox e até da Internet Explorer. Porém, nessa edição o formato foi diferente, o tema era HTML5 e os convidados foram o Élcio [...]]]></description>
			<content:encoded><![CDATA[<p>Nessa sexta-feira, teve um <a href="http://www.w3c.br/cafecombrowser/" target="_blank">café com browser</a>, um evento sediado pela w3c Brasil onde ela convida fabricantes de browsers a falarem dos seus produtos, por lá já passou o pessoal do Ópera, Firefox e até da Internet Explorer.</p>
<p>Porém, nessa edição o formato foi diferente, o tema era HTML5 e os convidados foram o Élcio da <a href="http://www.google.com/url?sa=t&#038;source=web&#038;cd=2&#038;ved=0CB0QFjAB&#038;url=http%3A%2F%2Fvisie.com.br%2F&#038;ei=87BATKv0AoWMuAfPvun4Dg&#038;usg=AFQjCNFRp9DmciStW-P4oIT7e9TKLFLPZQ&#038;sig2=b6ri-6_R03yjbs13n8dnQA" target="_blank">Visie</a> (empresa de treinamento e desenvolvimento web que vai oferecer um curso de html5) e a <a href="http://clickaqui.agenciaclick.com.br/" target="_blank">AgênciaClick</a>, onde esteve presente eu (Programador de Interface), Robson Dantas (Gerente de Tecnologia) e Ricardo Murer (Diretor de Tecnologia).</p>
<p>Durante a nossa apresentação, mostramos alguns protótipos de estudos que fizemos aqui na AgênciaClick, entre eles um player usando a tag &lt;audio&gt; simulando a interface do winamp e um jogo simulando o Guitar Hero:</p>
<p><img src="http://www.tidbits.com.br/wp-content/uploads/2010/07/escolha_sua_musica.jpg" alt="Escolha Sua Música" title="Escolha Sua Música" width="410" height="410" class="aligncenter size-full wp-image-1560" /></p>
<p>O jogo está <a href="http://www.tidbits.com.br/download/exemplos/my-guitar.zip" >disponível aqui</a>. Funciona para Chrome 5+, Ópera 10.5+, Safari 5+ e Firefox 3.5+ (sendo que para Firefox, é necessário estar hospedado em um servidor, ou seja, se você abrir o html como um arquivo, não funciona por questão de segurança do Firefox).</p>
<p>O jogo usa os conceitos de &lt;audio&gt; e &lt;canvas&gt; do HTML5, CSS3 e bastante javascript. Eu desenvolvi o game em 4 dias, ou seja, dá pra melhorar muito, devo aprimorar o código, colocar Ranking Online, mais músicas, etc.</p>
<p>Mas a idéia inicial era mostrar que pode ser feito um jogo em html5, com 20kb de JavaScript que antes só era possível ser desenvolvido em flash.</p>
<p><img src="http://www.tidbits.com.br/wp-content/uploads/2010/07/jogo_guitar_hero_em_html5.jpg" alt="Jogo Guitar Hero em HTML5" title="Jogo Guitar Hero em HTML5" width="410" height="410" class="aligncenter size-full wp-image-1561" /></p>
<p><img src="http://www.tidbits.com.br/wp-content/uploads/2010/07/game_over_guitar_hero_em_html5.jpg" alt="Game Over - Guitar Hero em HTML5" title="Game Over - Guitar Hero em HTML5" width="410" height="410" class="aligncenter size-full wp-image-1562" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.tidbits.com.br/my-guitar-um-guitar-hero-em-html5-e-javascript/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Snake &#8211; Jogo em html5 usando Canvas</title>
		<link>http://www.tidbits.com.br/snake-jogo-em-html5-usando-canvas</link>
		<comments>http://www.tidbits.com.br/snake-jogo-em-html5-usando-canvas#comments</comments>
		<pubDate>Thu, 06 May 2010 15:06:14 +0000</pubDate>
		<dc:creator>Danilo</dc:creator>
				<category><![CDATA[canvas]]></category>
		<category><![CDATA[Games]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[jogo]]></category>

		<guid isPermaLink="false">http://www.tidbits.com.br/?p=1544</guid>
		<description><![CDATA[Nos próximos posts vou escrever um pouco das experiências em html5 que ando fazendo. Pra iniciar, fiz um jogo simples daqueles que todo celular tem, usando somente o elemento Canvas. O Canvas funciona como se fosse um &#8220;shape&#8221; do photoshop, você cria um elemento e lá você pode desenhar literalmente, circulos, quadrados, linhas, pontos, colocar [...]]]></description>
			<content:encoded><![CDATA[<p>Nos próximos posts vou escrever um pouco das experiências em html5 que ando fazendo.</p>
<p>Pra iniciar, fiz <a href="http://www.tidbits.com.br/download/html5/snake/snake.html" target="_blank">um jogo simples</a> daqueles que todo celular tem, usando somente o elemento Canvas.</p>
<p>O Canvas funciona como se fosse um &#8220;shape&#8221; do photoshop, você cria um elemento e lá você pode desenhar literalmente, circulos, quadrados, linhas, pontos, colocar backgrounds, usar degradê, etc.</p>
<p>O Canvas não dá suporte ao ie6, ie7 e ie8. Existe um elemento similar pra eles chamado &#8220;shape&#8221; e existem algumas libs em javascript que traduz automaticamente tudo o que for desenhado em canvas pra shape, ou seja, você chama o js que ele se vira com o resto. No caso, usei o <a href="http://code.google.com/p/explorercanvas/downloads/list" target="_blank">explorercanvas</a> (dica do Koji), mas também tem o html5.js e o canvas.js disponível pra gente usar.</p>
<p><a href="http://www.tidbits.com.br/download/html5/snake/snake.html" target="_blank" title="Clique na imagem para jogar"><img src="http://www.tidbits.com.br/wp-content/uploads/2010/05/jogo-em-html5.png" alt="Jogo em html5" title="Jogo em html5" width="523" height="427" class="aligncenter size-full wp-image-1545" /></a></p>
<p>O jogo é bem simples, não tem muitos recursos, poderia ter ranking, som, opções e um monte plus mas não era essa a intenção do primeiro post sobre html5. O jogo tem 8kb (somando html / css  e javascript ) pros browsers que suportam canvas e 19kb para os que não suportam.  não usa nenhum framework de javascript (do tipo jquery, mootols, prototype) e não faz requisição de nenhuma imagem, tudo que está na tela foi desenhado em canvas com javascript.</p>
<p>Deixei disponível o <a href="http://www.tidbits.com.br/download/html5/snake/snake.zip"> código fonte </a> e para jogar é só clicar na imagem ou <a href="http://www.tidbits.com.br/download/html5/snake/snake.html" target="_blank"> entrar aqui</a></p>
<p>Por sinal, recomento o Chrome ou Opera 10.5 que são os browsers mais rápidos da atualidade.</p>
<p>Quem jogar, fala quantos pontos fez.<br />
=)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tidbits.com.br/snake-jogo-em-html5-usando-canvas/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

