<?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>Tuxtilt</title>
	<atom:link href="http://www.tuxtilt.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.tuxtilt.com</link>
	<description>Tuxtilt</description>
	<lastBuildDate>Thu, 27 Sep 2012 18:04:48 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Guia &#8211; Traduzindo o web2py book no github</title>
		<link>http://www.tuxtilt.com/web2py-book-github/</link>
		<comments>http://www.tuxtilt.com/web2py-book-github/#comments</comments>
		<pubDate>Mon, 03 Sep 2012 21:27:50 +0000</pubDate>
		<dc:creator>Relsi Hur Maron</dc:creator>
				<category><![CDATA[e-Books]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[tutoriais]]></category>
		<category><![CDATA[web2py]]></category>

		<guid isPermaLink="false">http://www.tuxtilt.com/?p=1089</guid>
		<description><![CDATA[Um pequeno guia de trabalho com o github, simplificado, para quem vai colaborar na tradução do Web2py book para o português. 1 &#8211; Acesso sua conta no github e crie um fork do repositório do Bruno em: https://github.com/rochacbruno/web2py-book 2 &#8211; &#8230; <a href="http://www.tuxtilt.com/web2py-book-github/">Continuar lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.tuxtilt.com/wp-content/uploads/2010/06/online_book_cover.jpg"><img class="alignleft size-full wp-image-261" title="online_book_cover" src="http://www.tuxtilt.com/wp-content/uploads/2010/06/online_book_cover.jpg" alt="" width="229" height="175" /></a>Um pequeno guia de trabalho com o github, simplificado, para quem vai colaborar na tradução do Web2py book para o português.<span id="more-1089"></span></p>
<p>1 &#8211; Acesso sua conta no github e crie um fork do repositório do Bruno em: https://github.com/rochacbruno/web2py-book</p>
<p><a href="http://www.tuxtilt.com/wp-content/uploads/2012/09/fork.png"><img class="aligncenter size-full wp-image-1090" title="fork" src="http://www.tuxtilt.com/wp-content/uploads/2012/09/fork.png" alt="" width="114" height="46" /></a>2 &#8211; Clone o <strong>teu</strong> repositório na máquina local para criar o repositório local:</p>
<pre class="brush: plain; title: ; notranslate">~$ git clone git@github.com:&lt;strong&gt;[teu-usuario-aqui]&lt;/strong&gt;/web2py-book.git</pre>
<p>3 &#8211; Adicione o repositório do Bruno como um repositório remoto ao teu repositório local para poder receber as alterações dos outros tradutores:</p>
<pre class="brush: plain; title: ; notranslate">
~$ cd web2py-book
~$ git remote add repo-original https://github.com/rochacbruno/web2py-book.git</pre>
<p>Começando os trabalhos.</p>
<p>Antes de começar a tradução, baixe as ultimas alterações do repositório remoto original. Para baixar as atualizações do repositório remoto, basta executar um fetch:</p>
<pre class="brush: plain; title: ; notranslate">~$ git fetch repo-original</pre>
<div sytle="text-align: center;"><script type="text/javascript"><!--
google_ad_client = "ca-pub-9946907116997449";
/* Anúncio Tuxtilt */
google_ad_slot = "8323670288";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>
<p>Se houver alguma alteração, é preciso fazer um merge com o seu repositório local:</p>
<pre class="brush: plain; title: ; notranslate">~$ git merge repo-original/master</pre>
<p>Após o merge, envie as alterações para o teu fork. Para enviar as alterações baixadas do repositório original para o teu fork, basta executar um push:</p>
<pre class="brush: plain; title: ; notranslate">~$ git push origin master</pre>
<p>Definindo o que vai traduzir</p>
<p>Edite o arquivo /web2py-book/sources/37-web2py-portuguese-work-in-progress/translation_status.md inserindo o capítulo/parte que vai traduzir. Aqui tu pode ver quem já esta traduzindo o que, sempre olhe esse arquivo antes de iniciar qualquer coisa.</p>
<div sytle="text-align: center;"><script type="text/javascript"><!--
google_ad_client = "ca-pub-9946907116997449";
/* Anúncio Tuxtilt */
google_ad_slot = "8323670288";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>
<p>Salve as alterações, e adicione o arquivo ao teu commit:</p>
<pre class="brush: plain; title: ; notranslate">~$ git add sources/37-web2py-portuguese-work-in-progress/translation_status.md</pre>
<p>Crie um commit para enviar para o teu fork, por exemplo:</p>
<pre class="brush: plain; title: ; notranslate">~$ git commit -m&quot;traduzindo introdução do capítulo 01&quot;</pre>
<p>Envie o commit para teu fork:</p>
<pre class="brush: plain; title: ; notranslate">~$ git push origin master</pre>
<p>Após isso, acesse a tua página no github e clique no botão Pull Request:</p>
<p><a href="http://www.tuxtilt.com/wp-content/uploads/2012/09/pull.png"><img class="aligncenter size-full wp-image-1092" title="pull" src="http://www.tuxtilt.com/wp-content/uploads/2012/09/pull.png" alt="" width="140" height="47" /></a>Preencha com as informações do teu commit e clique em Send Pull Request:</p>
<p><a href="http://www.tuxtilt.com/wp-content/uploads/2012/09/enviando-pullrequest.png"><img class="aligncenter size-full wp-image-1093" title="enviando-pullrequest" src="http://www.tuxtilt.com/wp-content/uploads/2012/09/enviando-pullrequest.png" alt="" width="461" height="267" /></a>Aguarde o Bruno fazer o merge com o repositório original. Após ele fazer o merge, baixe a atualização do repositório original e comece a tradução.</p>
<div sytle="text-align: center;"><script type="text/javascript"><!--
google_ad_client = "ca-pub-9946907116997449";
/* Anúncio Tuxtilt */
google_ad_slot = "8323670288";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>
]]></content:encoded>
			<wfw:commentRss>http://www.tuxtilt.com/web2py-book-github/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Resolvendo travamento do Flash no Ubuntu 11.10</title>
		<link>http://www.tuxtilt.com/resolvendo-travamento-do-flash-no-ubuntu-11-10/</link>
		<comments>http://www.tuxtilt.com/resolvendo-travamento-do-flash-no-ubuntu-11-10/#comments</comments>
		<pubDate>Sun, 20 May 2012 22:49:35 +0000</pubDate>
		<dc:creator>Rosana Waszak</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[flashplayer]]></category>

		<guid isPermaLink="false">http://www.tuxtilt.com/?p=1061</guid>
		<description><![CDATA[Ao atualizar o Ubuntu para a versão 11.10, o plugin do Flash, no Firefox, começou a travar em algumas páginas e não exibia o conteúdo corretamente (só o Youtube funcionava&#8230;). Após diversas pesquisas e tentativas para solucionar o problema, encontramos &#8230; <a href="http://www.tuxtilt.com/resolvendo-travamento-do-flash-no-ubuntu-11-10/">Continuar lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Ao atualizar o Ubuntu para a versão 11.10<a href="http://www.tuxtilt.com/wp-content/uploads/2012/05/Flash2.jpg"><img class="alignleft size-medium wp-image-1062" title="Flash2" src="http://www.tuxtilt.com/wp-content/uploads/2012/05/Flash2-300x225.jpg" alt="" width="229" height="176" /></a>, o plugin do Flash, no Firefox, começou a travar em algumas páginas e não exibia o conteúdo corretamente (só o Youtube funcionava&#8230;).</p>
<p style="text-align: justify;">Após diversas pesquisas e tentativas para solucionar o problema, encontramos o seguinte passo-a-passo no <a href="http://ubuntuforums.org" target="_blank">Ubuntu Forums</a> para remover e reinstalar o plugin do Flash manualmente:<span id="more-1061"></span></p>
<p style="text-align: justify;"><strong><span style="color: #ff0000;">(Certifique-se de que o Firefox não esteja rodando)</span></strong></p>
<p>Removendo os componentes instalados automaticamente:</p>
<div sytle="text-align: center;"><script type="text/javascript"><!--
google_ad_client = "ca-pub-9946907116997449";
/* Anúncio Tuxtilt */
google_ad_slot = "8323670288";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>
<pre>sudo apt-get remove -y --purge flashplugin-nonfree gnash gnash-common mozilla-plugin-gnash swfdec-mozilla libflashsupport nspluginwrapper</pre>
<p></p>
<pre>sudo rm -f /usr/lib/mozilla/plugins/*flash*</pre>
<p></p>
<pre>sudo rm -f ~/.mozilla/plugins/*flash*</pre>
<p></p>
<pre>sudo rm -f /usr/lib/firefox/plugins/*flash*</pre>
<p></p>
<pre>sudo rm -f /usr/lib/firefox-addons/plugins/*flash*</pre>
<p></p>
<pre>sudo rm -rfd /usr/lib/nspluginwrapper</pre>
<p>Reinstalando o plugin do Flash:</p>
<pre>sudo apt-get install flashplugin-installer</pre>
<div sytle="text-align: center;"><script type="text/javascript"><!--
google_ad_client = "ca-pub-9946907116997449";
/* Anúncio Tuxtilt */
google_ad_slot = "8323670288";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>
<p style="text-align: justify;">Feito! Problema resolvido!</p>
<p>Até o Próximo!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tuxtilt.com/resolvendo-travamento-do-flash-no-ubuntu-11-10/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rodando o web2py no PythonAnywhere em menos de 3 minutos</title>
		<link>http://www.tuxtilt.com/rodando-web2py-pythonanywhere/</link>
		<comments>http://www.tuxtilt.com/rodando-web2py-pythonanywhere/#comments</comments>
		<pubDate>Wed, 14 Dec 2011 18:34:00 +0000</pubDate>
		<dc:creator>Relsi Hur Maron</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[vídeos]]></category>
		<category><![CDATA[web2py]]></category>
		<category><![CDATA[web2py host]]></category>

		<guid isPermaLink="false">http://www.tuxtilt.com/?p=1035</guid>
		<description><![CDATA[Ontem recebi a liberação da minha conta no PythonAnyWhere e a primeira coisa que tratei de fazer foi o deploy do web2py. Segue abaixo um vídeo de todo o procedimento, que se resume em: 1 &#8211; Abrir um terminal 2 &#8230; <a href="http://www.tuxtilt.com/rodando-web2py-pythonanywhere/">Continuar lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.tuxtilt.com/rodando-web2py-pythonanywhere/text281ff8-300x167/" rel="attachment wp-att-1038"><img src="http://www.tuxtilt.com/wp-content/uploads/2011/12/text281ff8-300x167.png" alt="" title="web2py-pythonanywhere" width="259" height="158" class="alignleft size-full wp-image-1038" /></a>Ontem recebi a liberação da minha conta no PythonAnyWhere e a primeira coisa que tratei de fazer foi o deploy do web2py. Segue abaixo um vídeo de todo o procedimento, que se resume em:</p>
<p>1 &#8211; Abrir um terminal<br />
2 &#8211; Fazer o download do web2py<br />
3 &#8211; Alterar o arquivo wscgi.py<br />
4 &#8211; Rodar a aplicação<br />
<span id="more-1035"></span><br />
O ambiente em si é muito bom, estável e simples. Tu tem a disposição consoles de python em diversas versões, tudo rodando diretamente do navegador.<br />
<div sytle="text-align: center;"><script type="text/javascript"><!--
google_ad_client = "ca-pub-9946907116997449";
/* Anúncio Tuxtilt */
google_ad_slot = "8323670288";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div><br />
Vale a pena experimentar, o serviço ainda está rodando em beta privado, então sugiro não colocar nada em produção ainda, embora o pessoal esteja se puchando por lá, recolhendo sugestões e trabalhando para tornar o serviço viável para todos em breve.<br />
<div sytle="text-align: center;"><script type="text/javascript"><!--
google_ad_client = "ca-pub-9946907116997449";
/* Anúncio Tuxtilt */
google_ad_slot = "8323670288";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div><br />
Para poder usar o ambiente tem que se inscrever no site e esperar o convite: http://www.pythonanywhere.com/</p>
<p>E ai está meu deploy, sugiro assistir o video em tela cheia.</p>
<p><center><br />
<iframe src="http://player.vimeo.com/video/33670166?title=0&amp;byline=0&amp;portrait=0" width="720" height="576" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe><br />
</center><br />
<div sytle="text-align: center;"><script type="text/javascript"><!--
google_ad_client = "ca-pub-9946907116997449";
/* Anúncio Tuxtilt */
google_ad_slot = "8323670288";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div></p>
]]></content:encoded>
			<wfw:commentRss>http://www.tuxtilt.com/rodando-web2py-pythonanywhere/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Curso Gratuito de Aplicações Web</title>
		<link>http://www.tuxtilt.com/curso-gratuito-aplicacoes-web/</link>
		<comments>http://www.tuxtilt.com/curso-gratuito-aplicacoes-web/#comments</comments>
		<pubDate>Thu, 24 Nov 2011 18:36:55 +0000</pubDate>
		<dc:creator>Relsi Hur Maron</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Cursos Gratuítos]]></category>
		<category><![CDATA[Desenvolvimento web]]></category>
		<category><![CDATA[educação]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[Ruby On Rails]]></category>

		<guid isPermaLink="false">http://www.tuxtilt.com/?p=1029</guid>
		<description><![CDATA[A Universidade de Stanford liberou mais um de seus cursos na web, dessa vez trata-se de um curso de desenvolvimento de aplicativos web. Através de uma série de vídeos das aulas, o aluno irá aprender desde os conceitos mais básicos &#8230; <a href="http://www.tuxtilt.com/curso-gratuito-aplicacoes-web/">Continuar lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.tuxtilt.com/wp-content/uploads/2011/11/stanford_title2.jpg"><img src="http://www.tuxtilt.com/wp-content/uploads/2011/11/stanford_title2.jpg" alt="" title="stanford_title2" width="219" height="150" class="alignleft size-full wp-image-1030" /></a>A Universidade de Stanford liberou mais um de seus cursos na web, dessa vez trata-se de um curso de desenvolvimento de aplicativos web. Através de uma série de vídeos das aulas, o aluno irá aprender desde os conceitos mais básicos do desenvolvimento web, até a parte de segurança da aplicação, passando por banco de dados, programação com ruby e rails e muito mais.</p>
<p>Para acessar o curso basta entrar no endereço abaixo:<span id="more-1029"></span><br />
<div sytle="text-align: center;"><script type="text/javascript"><!--
google_ad_client = "ca-pub-9946907116997449";
/* Anúncio Tuxtilt */
google_ad_slot = "8323670288";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div><br />
<a href="http://openclassroom.stanford.edu/MainFolder/CoursePage.php?course=WebApplications&#038;mid=50970" target="_blank">http://openclassroom.stanford.edu/MainFolder/CoursePage.php?course=WebApplications&#038;mid=50970</a></p>
<p>Abaixo a relação completa das aulas disponíveis:<br />
<div sytle="text-align: center;"><script type="text/javascript"><!--
google_ad_client = "ca-pub-9946907116997449";
/* Anúncio Tuxtilt */
google_ad_slot = "8323670288";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div><br />
<strong>I. INTRODUCTION</strong><br />
-Why Web?<br />
-The Next 10 Years<br />
-Class Content<br />
-HTML and Markup Languages<br />
-XHTML</p>
<p><strong>II. HTML and CSS</strong><br />
-XML, HTML, and XHTML<br />
-CSS, Part 1<br />
-CSS, Part 2<br />
-CSS, Part 3<br />
-CSS, Part 4</p>
<p><strong>III. URLs and Links</strong><br />
-URL Encoding<br />
-Issues with URLs<br />
-No Referential Integrity<br />
<div sytle="text-align: center;"><script type="text/javascript"><!--
google_ad_client = "ca-pub-9946907116997449";
/* Anúncio Tuxtilt */
google_ad_slot = "8323670288";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div><br />
<strong>IV. The Ruby Language</strong><br />
-Overview<br />
-Data Types<br />
-Variables and Statements<br />
-Methods<br />
-Blocks, Iterators, and Class<br />
-Review of Basics<br />
-Other Things to Know<br />
-Metaprogramming<br />
-History of Dynamic Content<br />
<strong><br />
V. Rails Introduction</strong><br />
-Advantages<br />
-Introducing Model View Controller<br />
-Views and Templates, Part 1<br />
-Views and Templates, Part 2<br />
-Controllers, Part 1<br />
-Controllers, Part 2<br />
-Controllers, Part 3</p>
<p><strong>VI. Introduction to SQL</strong><br />
-Relational Databases, Part 1<br />
-Relational Databases, Part 2<br />
-Joins<br />
-Other Issues About Databases</p>
<p><strong>VII. Active Record</strong><br />
-Basics of ORM<br />
-Examples<br />
-Relationships Between Tables<br />
-Migration</p>
<p><strong>VIII. HTTP and HTTPS</strong><br />
-HTTP Request-Response Protocol<br />
-Redirection and HTTPS</p>
<p><strong>IX. Cookies and Sessions</strong><br />
-Cookies<br />
-Sessions</p>
<p><strong>X. Forms</strong><br />
-Basics<br />
-Page Flow<br />
-Validation and Error Handling<br />
-Rails Forms, Part 1<br />
-Rails Forms, Part 2<br />
-File Uploads with Rails</p>
<p><strong>XI. Javascript</strong><br />
-Basics<br />
-Functions<br />
-Class System, Part 1<br />
-Class System, Part 2<br />
-Class System, Part 3<br />
-Tying It All Together</p>
<p><strong>XII. The Document Object Model (DOM)</strong><br />
-Basics<br />
-Node<br />
-Operations on Elements<br />
-Coordinates and Positioning</p>
<p><strong>XIII. Events</strong><br />
-Basics<br />
-Access to Event Object<br />
-Problems<br />
-Delivering Events<br />
-Timers and Other Issues</p>
<p><strong>IX. AJAX</strong><br />
-Basic Mechanism<br />
-Higher-Level Example<br />
-Other Approaches</p>
<p><strong>X. Security: Network Attacks</strong><br />
-Summary of Problems<br />
-Encryption<br />
-Certificate Authority and SSL/TLS<br />
-SSL Stripping<br />
-Mixed Content<br />
-&#8221;Just in Time&#8221; HTTPS<br />
-Bad Certificate</p>
<p><strong>XI. Security: Session Attacks</strong><br />
-Choosing Session IDs<br />
-Cross Site Request Forgery, Part 1<br />
-Cross Site Request Forgery, Part 2<br />
-Data Tampering</p>
<p><strong>XII. Security: Isolation</strong><br />
-Cross-Site Scripting (XSS)<br />
-Relaxations, Part 1<br />
-Relaxations, Part 2<br />
-Language-Based Isolation<br />
-Navigation and Cookies</p>
<p><strong>XIII. Security: Code Injection</strong><br />
-Escape Queries<br />
-Stored XSS<br />
-Reflected XSS<br />
<strong><br />
XIV. Security: Phishing Attacks</strong><br />
-Basic Idea<br />
-Legitimate v. Illegitimate<br />
-Certificates<br />
-Other Anti-Phishing Measures</p>
<p><strong>XV. Large-Scale Applications</strong><br />
-Load Balancing<br />
-Sessions and Storage<br />
-RAMCloud<br />
-Scaling and Cloud Computing</p>
<p><strong>XVI. Datacenters</strong><br />
-History<br />
-Structure<br />
-Issues, Part 1<br />
-Issues, Part 2</p>
<p><strong>XVII. Deploying Web Applications</strong><br />
-Part 1<br />
-Part 2<br />
-Part 3<br />
-Part 4</p>
<p><strong>XVIII. Course Wrap-Up</strong><br />
-Web Plumbing, Relational Databases, and Languages<br />
-Rails, Security, and Large-Scale Apps<br />
-Themes<br />
-Future of the Web</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tuxtilt.com/curso-gratuito-aplicacoes-web/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>melonJS &#8211; Desenvolvendo Jogos para HTML5 &#8211; 1ª Parte</title>
		<link>http://www.tuxtilt.com/criando-jogos-online-para-html5/</link>
		<comments>http://www.tuxtilt.com/criando-jogos-online-para-html5/#comments</comments>
		<pubDate>Thu, 15 Sep 2011 05:59:30 +0000</pubDate>
		<dc:creator>Relsi Hur Maron</dc:creator>
				<category><![CDATA[Desenvolvimento de Jogos]]></category>
		<category><![CDATA[game engine]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jogos online]]></category>
		<category><![CDATA[melon.js]]></category>
		<category><![CDATA[tutoriais]]></category>

		<guid isPermaLink="false">http://www.tuxtilt.com/?p=884</guid>
		<description><![CDATA[Com o HTML5 sendo cada vez mais bem suportado pelos navegadores, um leque de novas aplicações vem surgindo utilizando a potencialidade dessa nova versão da linguagem. Meu principal interesse é no desenvolvimento de jogos online, uma área que até então &#8230; <a href="http://www.tuxtilt.com/criando-jogos-online-para-html5/">Continuar lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><a href="http://www.melonjs.org"><img class="alignleft size-full wp-image-885" style="margin-right: 15px;" title="melon" src="http://www.tuxtilt.com/wp-content/uploads/2011/09/melon.png" alt="" width="219" height="150" /></a>Com o HTML5 sendo cada vez mais bem suportado pelos navegadores, um leque de novas aplicações vem surgindo utilizando a potencialidade dessa nova versão da linguagem. Meu principal interesse é no desenvolvimento de jogos online, uma área que até então era dominada tão somente pela tecnologia proprietária Flash.</p>
<p style="text-align: justify;">É verdade que a muito tempo que existem implementações de jogos web utilizando javascript, ou até mesmo applets java, mas somente agora podemos bater de frente com bons recursos de processamento gráfico e outras perfumarias a mais, chegando ao ponto de muitos já terem decretado a morte do Flash. Não vou chegar a tanto, pois creio que as duas tecnologias possam coexistir pacificamente. Quem optar por ter suas aplicações rodando em qualquer dispositivo que tenha um navegador web, sem precisar instalar nenhum aplicativo adicional, optará por utilizar  a dupla HTML5/Javascript, os que ainda preferirem ficar presos a uma tecnologia proprietária, fechada, e que demanda a instalação de players para poder rodar (não em qualquer lugar), vai continuar a utilizar o Flash. Mas vamos ao que interessa. <span id="more-884"></span></p>
<div sytle="text-align: center;"><script type="text/javascript"><!--
google_ad_client = "ca-pub-9946907116997449";
/* Anúncio Tuxtilt */
google_ad_slot = "8323670288";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>
<p style="text-align: justify;">Depois de algum tempo pesquisando entre engines de jogos em javascript, entre proprietárias e livres, acabei encontrando a <strong> <a href="http://melonjs.org" target="_blank">melonJS</a></strong>, que além de atender às minhas necessidades básica tem uma boa integração com o editor de mapas<strong> <a href="http://www.mapeditor.org" target="_blank">Tiled Map Editor</a></strong>, uma mão na roda para agilizar a construção de fases para os jogos. É uma engine muito boa, apesar de estar em sua fase inicial acredito que tem um grande potencial.</p>
<p style="text-align: justify;">Esse tutorial vai ser publicado em duas partes, devido a extensão do mesmo, e trata-se de uma livre adaptação do tutorial disponível no site da biblioteca publicado <strong><a href="http://www.melonjs.org/tutorial/index.html" target="_blank">aqui</a></strong>, é basicamente um apanhado geral da utilização da engine para a construção de jogos web, portanto não se entrará em muitos detalhes sobre o funcionamento das funções utilizadas, deixaremos isso para mais tarde a fim de não estender muito o post, ademais a documentação de classes da engine é muito boa e pode ser consultada online a qualquer momento <a href="http://www.melonjs.org/docs/index.html" target="_blank">aqui</a>. Sugiro seguir o tutorial com essa documentação aberta para qualquer coisa que não fique bem entendida.</p>
<p style="text-align: justify;">Nessa primeira parte veremos o básico para a criação de uma fase do jogo, e na segunda parte iremos implementar mais funcionalidades como pontuação, tela de menus, áudio, novas fases, etc.</p>
<p style="text-align: justify;"><strong>As dependências.</strong></p>
<p style="text-align: justify;">Para seguir esse tutorial, além da engine propriamente dita tu vai precisar ter instalado o <a href="http://www.mapeditor.org/" target="_blank">Tiled Map Editor</a>; para quem usa o Ubuntu existe um ppa disponível, então basta adicionar e instalar com o apt-get:</p>
<div sytle="text-align: center;"><script type="text/javascript"><!--
google_ad_client = "ca-pub-9946907116997449";
/* Anúncio Tuxtilt */
google_ad_slot = "8323670288";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>
<pre class="brush: plain; title: ; notranslate">$ sudo apt-get install tiled</pre>
<p style="text-align: justify;">Criei um repositório no git para esse tutorial para compartilhar os recursos utilizados (áudio, imagens, biblioteca, etc.),  e um esqueleto da estrutura de arquivos, basta clonar o repositório, ou baixar o pacote <a href="https://github.com/relsi/tutorial-melonJS" target="_blank">clicando aqui</a>.</p>
<p style="text-align: justify;">Mas tu pode ficar a vontade para utilizar os recursos que quiser, e caso tu seja que nem eu que não tem talento nenhum para artes gráficas, tu pode dar uma passada no<strong> <a href="http://opengameart.org/" target="_blank">Open Game Art</a></strong> que tem diversos materiais livres para o desenvolvimento de jogos prontos, além de alguns efeitos sonoros, tu também pode encontrar bastante material no<strong> <a href="http://www.openclipart.org/" target="_blank">Open Clipart</a></strong> é bem genérico e tem uma infinidade de gráficos para a utilização livre, com a vantagem de estarem todos no formato SVG, uma mão na roda para edição com o <a href="http:///inkscapebrasil.org" target="_blank"><strong>Inkscape</strong></a>, eu peguei alguns gráficos de lá para construir o meu tileset e as sprites para esse tutorial, e um bom lugar para encontrar áudio é o<strong> <a href="http://ccmixter.org/" target="_blank">CCMixter</a></strong>.</p>
<p style="text-align: justify;">Vamos por a mão na massa então.</p>
<p>Esse post não pretende ser um tratado completo sobre a criação de jogos, mas vamos tentar seguir uma linha básica de desenvolvimento. Dentro das limitações impostas pela falta de <span style="text-decoration: line-through;">criatividade</span> conhecimento na utilização de ferramentas gráficas,  eu lhes apresento:</p>
<p><img class="aligncenter size-full wp-image-964" title="poster" src="http://www.tuxtilt.com/wp-content/uploads/2011/09/poster.png" alt="" width="500" height="334" /></p>
<p><strong>1 &#8211; A História do Jogo</strong></p>
<p style="text-align: justify;">Indiana Tux é um <span style="text-decoration: line-through;">arqueólogo</span> aventureiro que está a procura do Grande Diamante Vermelho, uma joia raríssima, mas para isso ele vai ter que entrar no território dos Macacos Zumbis Radioativos. Enquanto ele coleta joias e tesouros pelo caminho, ele tem que se esquivar da macacada maldita que fará de tudo para impedir que nosso herói tenha sucesso em sua empreitada.</p>
<p style="text-align: justify;">OK que o personagem não é nem um pouco original, e que a história e meio fru-fru, mas serve para o propósito.</p>
<p style="text-align: justify;"><strong>2 &#8211; Criando uma fase utilizando Tiled Map Editor.</strong></p>
<p style="text-align: justify;">Vamos então partir para a segunda etapa do projeto que é a criação das fases do jogo utilizando a ferramenta Tiled Map Editor. Primeiramente será necessário alterar as configurações do editor, a engine suporta apenas mapas codificados em XML ou Base64 sem compressão, então acesse o menu <strong>Editar-&gt;Preferências</strong> e altere as configurações conforme a imagem abaixo:</p>
<p style="text-align: justify;"><a href="http://www.tuxtilt.com/wp-content/uploads/2011/09/preferencias_tiled_map.png"><img class="size-full wp-image-888  aligncenter" title="preferencias_tiled_map" src="http://www.tuxtilt.com/wp-content/uploads/2011/09/preferencias_tiled_map.png" alt="" width="510" height="266" /></a>Vamos utilizar Base64 para obter um arquivo de tamanho menor.</p>
<p style="text-align: justify;">Bom, agora tu tem que criar o mapa, vou seguir as dimensões utilizadas no tutorial original. O tamanho da tela do jogo vai ser de 640&#215;480. Também construí um pequeno tileset com as dimensões de 32&#215;32.</p>
<p style="text-align: justify;">Clique no botão para criar um novo mapa e deixe as configurações conforme a imagem abaixo:</p>
<div sytle="text-align: center;"><script type="text/javascript"><!--
google_ad_client = "ca-pub-9946907116997449";
/* Anúncio Tuxtilt */
google_ad_slot = "8323670288";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>
<p style="text-align: center;"><img class="size-full wp-image-890  aligncenter" title="configuracao_mapa" src="http://www.tuxtilt.com/wp-content/uploads/2011/09/configuracao_mapa.png" alt="" width="321" height="256" /></p>
<p style="text-align: justify;">O tamanho do mapa é relativo o número de tiles, nesse caso 15 tiles de altura por 40 tiles de largura, e o tamanho do tile é o que tu usou para criar o seu tileset.</p>
<p style="text-align: justify;">Quando tu cria um novo mapa, é criado uma camada de tiles automaticamente. Também já criei uma nova camada para inserir outros elementos do jogo, para dar uma aparência melhor na disposição dos mesmos. Para criar uma nova camada basta selecionar a opção adicionar nova camada, conforme imagem abaixo:</p>
<p style="text-align: center;"><img class="size-full wp-image-893  aligncenter" title="nova_camada" src="http://www.tuxtilt.com/wp-content/uploads/2011/09/nova_camada.png" alt="" width="324" height="297" /></p>
<p style="text-align: justify;">Agora vamos carregar o tileset criado, clique no menu <strong>Mapa-&gt;Novo Tileset </strong>e carregue a imagem do tileset que vai ser utilizada, conforme imagem abaixo:</p>
<p style="text-align: center;"><img class="size-full wp-image-892  aligncenter" title="novo_tileset" src="http://www.tuxtilt.com/wp-content/uploads/2011/09/novo_tileset.png" alt="" width="356" height="322" /></p>
<p style="text-align: justify;">Feito isso, tu deverá agora ter essa disposição no editor (clique na imagem para ampliar):</p>
<p style="text-align: justify;"><a href="http://www.tuxtilt.com/wp-content/uploads/2011/09/editor_de_mapa.png"><img class="size-medium wp-image-894  aligncenter" title="editor_de_mapa" src="http://www.tuxtilt.com/wp-content/uploads/2011/09/editor_de_mapa-300x189.png" alt="" width="300" height="189" /></a>Agora é só construir o cenário, o processo é bem simples basta selecionar o tile e posicioná-lo no local do mapa aonde você quer que ele fique posicionado. Apenas atente para o fato de selecionar a camada em que seus tiles ficarão posicionados, nessa caso vamos utilizar a camada frontal para o chão e a vegetação, e as lápides vamos inserir na camada background. O meu mapa ficou assim (clique na imagem para ampliar):</p>
<p style="text-align: justify;"><a href="http://www.tuxtilt.com/wp-content/uploads/2011/09/mapa_construido.png"><img class="size-medium wp-image-895  aligncenter" title="mapa_construido" src="http://www.tuxtilt.com/wp-content/uploads/2011/09/mapa_construido-300x184.png" alt="" width="300" height="184" /></a>Concluída a inserção dos tiles, vamos definir uma cor de fundo para o mapa. Clique no menu <strong>Mapa-&gt;Propriedades do Mapa</strong> e adicione uma nova propriedade background_color. O valor é no formato CSS:</p>
<p style="text-align: center;"><img class="size-full wp-image-899  aligncenter" title="propriedades_do_mapa" src="http://www.tuxtilt.com/wp-content/uploads/2011/09/propriedades_do_mapa.png" alt="" width="306" height="292" /></p>
<p style="text-align: justify;">Estando aqui, tu já concluiu essa etapa. Agora salve o mapa dentro da estrutura de arquivos que foi criada para o jogo, se tu clonou o repositório git, basta salvar o mapa dentro do diretório <strong><em>data</em></strong>.</p>
<p style="text-align: justify;"><strong>3 &#8211; Carregando o Mapa no Jogo.</strong></p>
<p style="text-align: justify;">Agora iremos carregar o mapa criado em nosso jogo. Se tu clonou o repositório, ou baixou o pacote, tu deve ter um arquivo main.js, caso não tenha feito, crie um arquivo com o seguinte conteúdo:</p>
<pre class="brush: jscript; title: ; notranslate">
// game resources
var g_resources = [];
var jsApp = {
    /* --- Initialize the jsApp --- */
    onload: function() {

    // init the video
    if (!me.video.init('jsapp', 640, 480, false, 1.0)) {
        alert(&quot;Sorry but your browser does not support html 5 canvas.&quot;);
        return;
    }

    // initialize the &quot;audio&quot;
    me.audio.init(&quot;mp3,ogg&quot;);

    // set all resources to be loaded
    me.loader.onload = this.loaded.bind(this);

    // set all resources to be loaded
    me.loader.preload(g_resources);

    // load everything &amp;amp; display a loading screen
    me.state.change(me.state.LOADING);
},

    /* --- callback when everything is loaded --- */
    loaded: function() {

    // set the &quot;Play/Ingame&quot; Screen Object
    me.state.set(me.state.PLAY, new PlayScreen());

    // start the game
    me.state.change(me.state.PLAY);
}

};
// jsApp

/* the in game stuff*/
var PlayScreen = me.ScreenObject.extend({

onResetEvent: function() {
// stuff to reset on state change
},

/* --- action to perform when game is finished (state change) --- */
onDestroyEvent: function() {
}

});

//bootstrap
window.onReady(function() {
jsApp.onload();
});
</pre>
<p style="text-align: justify;">O Arquivo em sim não é muito complexo, o que temos aí é o carregamento de áudio, recursos e o desenho da tela do jogo assim que a página é carregada. Também é definido um callback que será chamado quando tudo estiver pronto para ser usado.  Não vou me atentar às classes utilizadas, em um momento vindouro vamos estudar cada uma delas em detalhe, mas tu pode consultar a documentação a qualquer momento através do link passado no início do tutorial.</p>
<p>O mapa que foi criado para o jogo, será adicionado através do objeto g_resources:</p>
<pre class="brush: jscript; title: ; notranslate">
var g_resources = [{
    name: &quot;tile&quot;,
    type: &quot;image&quot;,
    src: &quot;data/tileset/tile.png&quot;
}, {
    name: &quot;mapa&quot;,
    type: &quot;tmx&quot;,
    src: &quot;data/mapa.tmx&quot;
}];
</pre>
<p style="text-align: justify;">O que fizemos aí foi informar o tileset que estamos utilizando, e o mapa no qual ele esta aplicado. Agora, incluiremos na função <em>onResetEvent()</em>, que é chamada a cada mudança de estado, que seja mostrada na tela os elementos de nosso jogo:</p>
<pre class="brush: jscript; title: ; notranslate">

onResetEvent: function() {
    me.levelDirector.loadLevel(&quot;mapa&quot;);
 }

</pre>
<p style="text-align: justify;">Também tem disponível no pacote um arquivo index.html, que é o arquivo que será chamado para a execução do jogo. Se tudo ocorrer bem, ao carregar o arquivo no teu navegador tu deve ter o mapa carregado conforme imagem abaixo.</p>
<p style="text-align: center;"><a href="http://www.tuxtilt.com/wp-content/uploads/2011/09/mapa_carregado.png"><img class="size-full wp-image-905  aligncenter" title="mapa_carregado" src="http://www.tuxtilt.com/wp-content/uploads/2011/09/mapa_carregado.png" alt="" width="385" height="299" /></a></p>
<blockquote>
<p style="text-align: justify;">NOTA: Devido à questões de segurança do Google Chrome, para rodar o jogo localmente nesse navegador vai ser necessário carregá-lo com o seguinte parâmetro: <em>&#8211;allow-file-access-from-files. </em>No Firefox 6 rodou direito, já no Opera não foi possível carregar o mapa, como não é meu navegador padrão vou ter que dar uma pesquisada a respeito, mas segundo o desenvolvedor da biblioteca deveria funcionar sem problemas.</p>
</blockquote>
<p style="text-align: justify;">Perceba que ficou uma grade nos encaixes dos tiles inferiores, e um traço do lado da pedra e das lápides, mas não se preocupe, isso é um problema com o tamanho dos elementos do meu tileset, pois fiz isso na corrida, e acabou ficando esse espaçamento; em outro post veremos como construir um tileset de qualidade melhor, aonde iremos consertar esses problemas.</p>
<p>Bola pra frente.</p>
<p><strong>4 &#8211; A jornada do herói</strong></p>
<p style="text-align: justify;">Joseph Campbell que me perdoe pela utilização do título de uma de suas obras clássicas (que aliás é leitura obrigatória para quem pretende ingressar nesse universo de criar aventuras), mas cai como uma luva para essa parte do tutorial, pois é aqui que iremos dar vida ao nosso personagem principal do jogo, ele mesmo: o Indiana Tux.</p>
<p style="text-align: justify;">O jogador sera criado estendendo-se a classe <em>me.ObjectEntity</em> da engine. Para a animação do dito cujo, irei usar essa sprite que criei do mesmo:</p>
<p style="text-align: center;"><img class="size-full wp-image-910  aligncenter" title="indiana_tux" src="http://www.tuxtilt.com/wp-content/uploads/2011/09/indiana_tux.png" alt="" width="172" height="61" /></p>
<p style="text-align: justify;">É um sprite bem simples feito só pra dar uma sensação de movimento, não tive nenhuma intenção de simular um ciclo de caminhada perfeito, mas não quer dizer que tu não devas, se tiveres <em>o dom</em> o faça. Mais uma vez atento aqui para a utilização de um daqueles portais de recursos gráficos livres para quem, assim como eu, não tem muita intimidade com aplicativos de produção gráfica; esse chapéu do Indiana Tux eu não precisei criar, peguei pronto já no Open Clipart. Como todos os gráficos estão disponíveis no formato SVG, foi muito simples utilizá-lo nesse pinguin-ovo que eu criei utilizando o Inkscape.</p>
<p style="text-align: justify;">Nesse tutorial nosso herói irá apenas andar e pular. Nos próximos vamos aplicar mais interatividade, mas para isso teremos que ter um sprite mais elaborado com outras animações.</p>
<p style="text-align: justify;">Bem, vamos carregar o personagem no jogo então. Logo abaixo do carregamento do mapa vamos inserir o seguinte trecho de código:</p>
<pre class="brush: jscript; title: ; notranslate">

{
 name: &quot;indiana_tux&quot;,
 type: &quot;image&quot;,
 src: &quot;data/sprite/indiana_tux.png&quot;
}

</pre>
<p style="text-align: justify;">Veja que o formato é o mesmo utilizado anteriormente para a inserção do mapa e do tileset.</p>
<p>Agora vamos instanciar nosso personagem:</p>
<pre class="brush: jscript; title: ; notranslate">

/*----- a player entity ---------- */
var PlayerEntity = me.ObjectEntity.extend({

     /* ----- constructor ------ */
      init: function(x, y, settings) {
            // call the constructor
            this.parent(x, y, settings);

            // set the walking &amp; jumping speed
            this.setVelocity(3, 15);

           // set the display to follow our position on both axis
            me.game.viewport.follow(this.pos, me.game.viewport.AXIS.BOTH);

 },

 /* ----- update the player pos------ */
 update: function() {

      if (me.input.isKeyPressed('left')) {
              this.doWalk(true);
        }else if (me.input.isKeyPressed('right')) {
              this.doWalk(false);
       } else {
              this.vel.x = 0;
      }
      if (me.input.isKeyPressed('jump')) {
          this.doJump();
      }

       // check &amp; update player movement
       updated = this.updateMovement();

       // update animation
       if (updated) {
          // update objet animation
          this.parent(this);
        }
      return updated;
  }

});

</pre>
<p style="text-align: justify;">Mais uma vez o código é bem ilustrativo, estendemos a classe para cria nosso personagem, setamos a velocidade do personagem e definimos a posição da câmera do jogo, além de verificar se algumas teclas foram pressionadas para controlar a movimentação do personagem. E finalmente testamos o retorno da função <em>updateMovement()</em>, que faz parte da classe e permite controlar a animação do personagem.</p>
<p style="text-align: justify;">Estou inserindo a codificação do personagem no mesmo arquivo <em>main.js</em> que trata do carregamento do jogo e dos seus recursos, mas para fins de organização é mais indicado que o mesmo seja criado em um arquivo separado e posteriormente lincado. Mas fica a critério de cada um.</p>
<p style="text-align: justify;">Feito  isso vamos agora voltar ao Tiled Map Editor e inserir nosso personagem no mapa. Clique na opção de <strong>Adicionar Nova Camada</strong>, e adicione uma <strong>Camada de Objeto</strong>. Renomeie a camada para playerTux, ou o nome que tu quiser.</p>
<p style="text-align: justify;">Agora vamos inserir um objeto na cena, que será o nosso personagem, para tanto clique no botão<strong> Inserir Objetos</strong> e em seguida clique em algum lugar da tela aonde ficará posicionado o objeto, não se preocupe com o local pois iremos definir nas propriedades, o botão é esse selecionado na imagem abaixo:</p>
<p style="text-align: justify;"><a href="http://www.tuxtilt.com/wp-content/uploads/2011/09/inserir-objeto.png"><img class="size-full wp-image-911  aligncenter" title="inserir objeto" src="http://www.tuxtilt.com/wp-content/uploads/2011/09/inserir-objeto.png" alt="" width="107" height="45" /></a>Feito isso clique no botão à esquerda do botão Inserir Objetos, esse botão tem a função de <strong>Selecionar Objetos</strong>, e em seguida selecione o objeto que tu criou. Clique com o botão direito em cima do objeto, selecione a opção <strong>Propriedades do Objeto</strong> e configure conforme a imagem abaixo:</p>
<p style="text-align: justify;"><a href="http://www.tuxtilt.com/wp-content/uploads/2011/09/propriedades_do_objeto1.png"><img class="size-full wp-image-913  aligncenter" title="propriedades_do_objeto" src="http://www.tuxtilt.com/wp-content/uploads/2011/09/propriedades_do_objeto1.png" alt="" width="276" height="358" /></a>O <strong>Nome</strong> não tem muita importância, apenas lembre que tu vai utilizar esse mesmo para carregar o personagem na função de carregamento do jogo, a opção <strong>Tipo</strong> podes deixar em branco mesmo. A seguir em <strong>Posição</strong>, tu vai definir aonde quer que o objeto, nesse caso o Indiana Tux, inicie no jogo, definido pela quantidade de tiles no <em>eixo X</em> e a quantidade tiles no <em>eixo Y</em>. O <strong>Tamanho</strong> do objeto também é apresentado em quantidade de tiles, nesse caso construí o Indiana Tux com 2 tiles de altura por 2 de largura. A propriedade <strong>image</strong> recebe como valor o nome da imagem do sprite utilizado no objeto, aqui sim o nome é importante, portanto utilize o mesmo que foi utilizado no sprite, a propriedade <strong>spritewidth</strong> recebe como valor a largura, em pixels, que um elemento da sprite ocupa, como o Indiana Tux tem a largura de 2 tiles de 32 pixels, logo ele ocupa 64 pixels de largura.</p>
<p style="text-align: justify;">Clique em OK e o objeto será reposicionado no mapa, conforme podes ver na imagem abaixo:</p>
<p style="text-align: center;"><img class="size-full wp-image-914  aligncenter" title="indiana_reposicionado" src="http://www.tuxtilt.com/wp-content/uploads/2011/09/indiana_reposicionado.png" alt="" width="188" height="293" /></p>
<p style="text-align: justify;">Perceba que o indiana ficou meio &#8216;gordo&#8217; para esse mapa de tiles, mas isso não é problema, pois a nossa intenção aqui é apenas ilustrar o funcionamento da engine, pretendo focar esse, e outros detalhes relacionados à construção gráfica em uma outra ocasião.</p>
<p style="text-align: justify;">Vamos agora criar uma camada de tiles de colisão, pois precisamos dizer para a engine quais são os tiles com os quais nosso personagem deve interagir fisicamente, nesse caso aqui para evitar que ele atravesse paredes ou o chão. Para tanto vamos primeiramente adicionar um novo tileset no mapa. No material que disponibilizei no git, tem um tileset chamado  colisao.png, vamos utilizar essa imagem para a construção do mapa:</p>
<p style="text-align: center;"><img class="size-full wp-image-915  aligncenter" title="tileset_de_colisao" src="http://www.tuxtilt.com/wp-content/uploads/2011/09/tileset_de_colisao.png" alt="" width="261" height="242" /></p>
<p style="text-align: justify;">O procedimento é o mesmo realizado anteriormente apara caregar o tileset do mapa inicial.</p>
<p style="text-align: justify;">Agora acesse a aba desse novo tileset, clique com o botão direito em cima do primeiro tile e selecione a opção <strong>Propriedades do Tile</strong>, e vamos inserir uma propriedade conforme a imagem abaixo:</p>
<p style="text-align: center;"><img class="size-full wp-image-916  aligncenter" title="propriedade_do_tile" src="http://www.tuxtilt.com/wp-content/uploads/2011/09/propriedade_do_tile.png" alt="" width="233" height="222" /></p>
<p style="text-align: justify;">Repita o procedimento com o segundo tile, e defina uma propriedade <strong>type</strong> com o valor <strong>platform.</strong></p>
<p style="text-align: justify;">É isso aí. Existem outras propriedades que não iremos cobrir nesse tutorial. Agora adicione uma <strong>Nova Camada de Tiles</strong> e renomeie-a para <em>Collision</em>, esse nome é obrigatório para que a engine reconheça a mesma como uma camada de colisão. Feito isso, selecione a camada e comece a posicionar os tiles de acordo com o tu mapa, por aqui as coisas ficaram mais ou menos assim:</p>
<p><a href="http://www.tuxtilt.com/wp-content/uploads/2011/09/camada-de_colisao.png"><img class="size-full wp-image-918  aligncenter" title="camada-de_colisao" src="http://www.tuxtilt.com/wp-content/uploads/2011/09/camada-de_colisao.png" alt="" width="512" height="322" /></a>Salve o mapa e insira o seguinte código no nosso callbak:</p>
<pre class="brush: jscript; title: ; notranslate">

// add our player entity in the entity pool
 me.entityPool.add(&quot;indianaTux&quot;, PlayerEntity);

 // enable the keyboard
 me.input.bindKey(me.input.KEY.LEFT, &quot;left&quot;);
 me.input.bindKey(me.input.KEY.RIGHT, &quot;right&quot;);
 me.input.bindKey(me.input.KEY.X, &quot;jump&quot;, true);
</pre>
<p>Salve e abra o projeto no navegador novamente, se tudo ocorreu bem tu já deve ter uma fase completamente acessível, conforme podes ver no vídeo abaixo:</p>
<p><iframe src="http://player.vimeo.com/video/29072427?title=0&amp;byline=0&amp;portrait=0" frameborder="0" width="400" height="300"></iframe></p>
<p><a href="http://vimeo.com/29072427">01 &#8211; Player do Jogo</a> from <a href="http://vimeo.com/user1522778">Relsi</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<p style="text-align: justify;">Note pelo <em>game play</em>, que realmente o Indiana Tux ficou um pouco desproporcional em relação ao mapa. E também que não existe colisão com os tiles do lago e as estacas, mas isso é pra ser assim mesmo por enquanto, depois arrumaremos. Ele também vai ficar preso sem conseguir sair de uma parte do mapa, mas isso deixo como exercício para vocês encontrar e resolverem.</p>
<p style="text-align: justify;">Em tempo. Quando criamos o personagem automaticamente é criado uma caixa de colisão ao redor do mesmo, podemos observar isso inserindo a seguinte opção no arquivo main.js:</p>
<pre class="brush: jscript; title: ; notranslate">

me.debug.renderHitBox = true;

</pre>
<p style="text-align: center;"><img class="size-full wp-image-923  aligncenter" title="retangulo de colisao" src="http://www.tuxtilt.com/wp-content/uploads/2011/09/retangulo-de-colisao.png" alt="" width="152" height="158" /></p>
<p style="text-align: justify;">Mas perceba que a caixa de colisão é bem maior que o personagem, sendo assim, o Indiana Tux, propriamente dito, não irá colidir com os objetos do jogo e sim a sua caixa de colisão, mas não <em>primeos cânico</em> isso pode ser resolvido inserindo o seguinte código na instância do personagem:</p>
<pre class="brush: jscript; title: ; notranslate">

this.updateColRect(8, 48, -1, 0);

</pre>
<p>O que fizemos foi ajustar o tamanho da caixa de colisão de acordo com os parâmetros passados, relativos à dimensão do tile:</p>
<p style="text-align: center;"><img class="size-full wp-image-924  aligncenter" title="caixa_de_colisa_ajustada" src="http://www.tuxtilt.com/wp-content/uploads/2011/09/caixa_de_colisa_ajustada.png" alt="" width="112" height="125" /></p>
<p>Agora sim temos uma caixa de colisão do tamanho adequado. Vamos em frente.</p>
<p><strong>5 &#8211; Inserindo um fundo com efeito Parallax</strong></p>
<p style="text-align: justify;">Vamos agora criar um fundo para o nosso jogo a fim de substituir a cor azul chapada, isso vai proporcionar um ambiente melhor para o nosso joguinho. A utilização de feitos Parallax é muito comum em jogos desse gênero pois da um efeito de profundidade para o mesmo.</p>
<p style="text-align: justify;">Inserir um fundo com esse efeito é muito fácil utilizando o editor de mapas, e não será necessário uma linha de código sequer para o efeito funcionar, a não ser as necessárias para carregar o elemento gráfico utilizado.</p>
<p style="text-align: justify;">Aqui vou utilizar apenas duas imagens de fundo, mas tu podes utilizar a quantia que desejar para obter um efeito mais complexo, apenas atente para o fato de que isso pode influenciar na performance do jogo, nesse caso menos é mais. A imagem utilizada foi compostas a partir de gráficos baixados do Open Clipart (clique para aumentar):</p>
<p style="text-align: justify;"><a href="http://www.tuxtilt.com/wp-content/uploads/2011/09/fundo_02.png"><img class="size-medium wp-image-929  aligncenter" title="fundo_01" src="http://www.tuxtilt.com/wp-content/uploads/2011/09/fundo_011-300x136.png" alt="" width="300" height="136" /><img class="size-full wp-image-931  aligncenter" title="fundo_02" src="http://www.tuxtilt.com/wp-content/uploads/2011/09/fundo_02.png" alt="" width="283" height="78" /></a>Vamos excluir a propriedade <em>background_color</em> do mapa, pois ela não será mais necessária. Em seguida crie duas novas camadas de tiles e renomeie-as tendo a atenção para que o nome seja composto pela string Parallax_ pois a mesma serve de identificador para que a engine possa aplicar esse efeito:</p>
<p style="text-align: center;"><img class="size-full wp-image-934  aligncenter" title="camadas_paralax" src="http://www.tuxtilt.com/wp-content/uploads/2011/09/camadas_paralax.png" alt="" width="167" height="137" /></p>
<p>Feito isso, adicione às camadas uma propriedade<strong><em> imagesrc </em></strong>tendo como valor o nome da imagem utilizada, sem a extensão:</p>
<p style="text-align: center;"><img class="size-full wp-image-927  aligncenter" title="propriedade_da_cama_parallax" src="http://www.tuxtilt.com/wp-content/uploads/2011/09/propriedade_da_cama_parallax.png" alt="" width="305" height="291" /></p>
<p>Agora, temos que inserir os elementos gráficos a serem carregados no jogo através do código:</p>
<pre class="brush: jscript; title: ; notranslate">

{
 name: &quot;fundo_01&quot;,
 type: &quot;image&quot;,
 src: &quot;data/background/fundo_01.png&quot;
},{
 name: &quot;fundo_02&quot;,
 type: &quot;image&quot;,
 src: &quot;data/background/fundo_02.png&quot;
}

</pre>
<p>Abaixo um vídeo do efeito em execução:</p>
<p><iframe src="http://player.vimeo.com/video/29074918?title=0&amp;byline=0&amp;portrait=0" frameborder="0" width="400" height="320"></iframe></p>
<p><strong>6 &#8211; Inserindo Itens coletáveis</strong></p>
<p style="text-align: justify;">Embora o Indiana Tux esteja atrás do Grande Diamante Vermelho, vamos inserir no cenário do jogo alguns objetos que possam ser coletados pelo mesmo. Itens coletáveis podem ser adicionados facilmente estendendo a classe <em>me.CollectableEntity</em>.</p>
<p>Vamos usar a sprite abaixo para os itens coletáveis:</p>
<p style="text-align: center;"><img class="size-full wp-image-935  aligncenter" title="esmeralda" src="http://www.tuxtilt.com/wp-content/uploads/2011/09/esmeralda.png" alt="" width="128" height="32" /></p>
<p>Devemos carregar a imagem nos recursos do jogo, da mesma forma que fizemos com os outros elementos até então:</p>
<pre class="brush: jscript; title: ; notranslate">

{
 name: &quot;rubi&quot;,
 type: &quot;image&quot;,
 src: &quot;data/sprite/rubi.png&quot;
}

</pre>
<p style="text-align: justify;">Em seguida devemos criar o elemento no jogo, estendendo a classe<em> me.CollectableEntity</em>:</p>
<pre class="brush: jscript; title: ; notranslate">

var RubiEntity = me.CollectableEntity.extend(
 {
     init: function (x, y, settings)
         {
            // call the parent constructor
            this.parent(x, y , settings);
         }

 });

</pre>
<p style="text-align: justify;">Por enquanto esse é o código necessário para o construtor, vamos definir as propriedades do item no editor, para isso crie uma nova camada de objetos e renomeie como desejar, em seguida crie um novo objeto e defina as suas propriedades conforme a imagem abaixo:</p>
<p style="text-align: center;"><img class="size-full wp-image-941  aligncenter" title="propriedades_item_coletavel" src="http://www.tuxtilt.com/wp-content/uploads/2011/09/propriedades_item_coletavel2.png" alt="" width="344" height="450" /></p>
<p>Para inserir mais objetos no mapa, basta clicar com o botão direito no mesmo e escolher a opção Duplicar Objeto. Selecionando vários objetos tu consegue duplicar tantos quanto tiver na seleção.</p>
<p>Agora baste adicionar o item no jogo:</p>
<pre class="brush: jscript; title: ; notranslate">

me.entityPool.add(&quot;Rubi&quot;, RubiEntity);

</pre>
<p>Execute o jogo, e tu deve ter esse resultado até aqui:</p>
<p style="text-align: justify;"><a href="http://www.tuxtilt.com/wp-content/uploads/2011/09/itens_coletaveis.png"><img class="size-full wp-image-938  aligncenter" title="itens_coletaveis" src="http://www.tuxtilt.com/wp-content/uploads/2011/09/itens_coletaveis.png" alt="" width="408" height="307" /></a>Bem, até o momento os rubis são apenas objetos comuns do cenário, precisamos dizer para o nosso personagem que ele deve colidir com eles, dentro da classe do personagem insira a seguinte função:</p>
<pre class="brush: jscript; title: ; notranslate">

me.game.collide(this);

</pre>
<p>Execute o jogo e veja o efeito, ao colidir com o rubi, o mesmo deverá sumir do mapa.</p>
<p><strong>7 &#8211; Adicionando Inimigos</strong></p>
<p style="text-align: justify;">Nem tudo na vida do Indiana Tux vai ser fácil como coletar alguns rubis durante a sua jornada, para chegar até o Grande Diamante Vermelho ele vai ter enfrentar os Macacos Radioativos, que irão tentar impedir o nosso herói de alcançar seu objetivo. Vamos agora adicionar alguns inimigos no jogo. Para fazer isso também iremos estender a classe <em>me.ObjectEntity.extend</em>. A sprite utilizada será essa:</p>
<p style="text-align: center;"><img class="size-full wp-image-945  aligncenter" title="macaco_radioativo" src="http://www.tuxtilt.com/wp-content/uploads/2011/09/macaco_radioativo.png" alt="" width="179" height="64" /></p>
<p>Assim como o Indiana Tux, a sprite é bem simples.</p>
<p style="text-align: justify;">Vamos inserir o Macaco Radioativo no mapa. Para isso crie uma nova Camada de Objetos, renomeie conforme desejar e insira um novo objeto. Nas propriedades desse objeto insira apenas o <strong>Nome</strong>, as demais propriedades iremos setar via código fonte, para que tu possas ver que ambas as formas são possíveis (lembre que até então inserimos as propriedades no editor).</p>
<p style="text-align: center;"><img class="size-full wp-image-946  aligncenter" title="propriedades_macaco" src="http://www.tuxtilt.com/wp-content/uploads/2011/09/propriedades_macaco.png" alt="" width="345" height="447" /></p>
<p style="text-align: justify;">Também precisaremos aumentar o tamanho do objeto de acordo com a área que queremos que ele ocupe, que nesse caso vai ser a área em que o macaco irá caminhar, para fazer isso basta posicionar o ponteiro do mouse no quadradinho que se encontra no canto inferior direito da moldura do objeto e arrastar para aumentar ou diminuir a área:</p>
<p style="text-align: center;"><img class="size-full wp-image-948  aligncenter" title="area_do_macaco" src="http://www.tuxtilt.com/wp-content/uploads/2011/09/area_do_macaco.png" alt="" width="389" height="121" /></p>
<p>Para inserir mais objetos no mapa, repita o mesmo procedimento feito com os rubis.</p>
<p>Salve o mapa e, para criar o inimigo  vamos adicionar o seguinte código no nosso arquivo main.js:</p>
<pre class="brush: jscript; title: ; notranslate">
/***** Enemy Entity    ****/
 var MacacoEntity = me.ObjectEntity.extend(
     {
         init: function (x, y, settings)
             {
               // define this here instead of tiled
               settings.image = &quot;macaco_radioativo&quot;;
               settings.spritewidth = 64;

               // call the parent constructor
               this.parent(x, y , settings);

               this.startX = x;
               this.endX   = x+settings.width - settings.spritewidth;
               // size of sprite

              // make him start from the right
              this.pos.x = x + settings.width - settings.spritewidth;
              this.walkLeft = true;

              // walking &amp; jumping speed
              this.setVelocity(2, 0);

             // adjust the bounding box
             this.updateColRect(8, 48, -1, 0);

             // make it collidable
             this.collidable = true;
             this.type = me.game.ENEMY_OBJECT;
     },

     // manage the enemy movement
     update : function ()
          {
              if (this.alive)
                 {
                   if (this.walkLeft &amp;&amp; this.pos.x &lt;= this.startX)
                      {
                         this.walkLeft = false;
                      }
                   else if (!this.walkLeft &amp;&amp; this.pos.x &gt;= this.endX)
                      {
                        this.walkLeft = true;
                       }

                   //console.log(this.walkLeft);
                   this.doWalk(this.walkLeft);
                 }
             else
                 {
                    this.vel.x = 0;
                 }
             // check &amp; update movement
             updated = this.updateMovement();

             if (updated)
                {
                  // update the object animation
                  this.parent();
                }
             return updated;
       }
 });

</pre>
<p style="text-align: justify;">O mesmo é um pouco mais extenso, pois na classe definimos as propriedades do objeto via código e em seguida a função para o movimento do Macaco. Ffizemos isso dessa forma, apenas para ti ver que existem as duas possibilidades de inserção dessas propriedades do objeto, diretamente no Tiled ou através do código fonte da classe. Tu decide qual a melhor maneira de lidar com isso.</p>
<p>Devemos então carregar os elementos gráficos do macaco:</p>
<pre class="brush: jscript; title: ; notranslate">

{
 name: &quot;macaco_radioativo&quot;,
 type: &quot;image&quot;,
 src: &quot;data/sprite/macaco_radioativo.png&quot;
}

</pre>
<p>E em seguida carregamos o inimigo no jogo:</p>
<pre class="brush: jscript; title: ; notranslate">

me.entityPool.add(&quot;macacoMau&quot;, EnemyEntity);

</pre>
<p style="text-align: justify;">Execute o jogo, e se tudo estiver certo, teremos a macacada em ação na tela do jogo:</p>
<p><iframe src="http://player.vimeo.com/video/29075143?title=0&amp;byline=0&amp;portrait=0" frameborder="0" width="400" height="320"></iframe></p>
<p style="text-align: justify;">Agora vamos criar a interação dos macacos com nosso herói, perceba que simplesmente não há nenhum tipo de colisão entre os dois vamos implementar isso agora.</p>
<p>Na classe do Indiana Tux, altere o seguinte trecho:</p>
<pre class="brush: jscript; title: ; notranslate">

me.game.collide(this);

</pre>
<p>Para:</p>
<pre class="brush: jscript; title: ; notranslate">

res = me.game.collide(this);

</pre>
<p>E logo abaixo insira o seguinte código:</p>
<pre class="brush: jscript; title: ; notranslate">
if (res)
    {
        if (res.type == me.game.ENEMY_OBJECT)
         {
           // let's flicker in case we touched an enemy
           this.flicker(45);
         }
}

</pre>
<p style="text-align: justify;">O que fizemos aqui foi simplesmente passar o o retorno da função <em>me.game.collide(this)</em> para a variável <em>res</em>, em seguida verificamos se  o tipo do retorno é igual a  <em>me.game.ENEMY_OBJECT</em>, se for significa que topamos com um inimigo, nesse caso fazemos o Indiana Tux ficar piscando:</p>
<p><iframe src="http://player.vimeo.com/video/29075363?title=0&amp;byline=0&amp;portrait=0" frameborder="0" width="400" height="320"></iframe></p>
<p style="text-align: justify;">Por enquanto é isso que o Indiana Tux irá pagar por topar com um Macaco Radioativo.</p>
<p style="text-align: justify;">Para completar essa etapa, vamos dar ao Indiana Tux a capacidade de causar algum dano ao Macaco Radioativo também.</p>
<p style="text-align: justify;">Insira o seguinte código na classe do macaco:</p>
<pre class="brush: jscript; title: ; notranslate">

// call by the engine when colliding with another object
// obj parameter corresponds to the other object (typically the player)
//touching this  one
onCollision : function (res, obj)
     {
        // res.y &gt;0 means touched by something on the bottom
        // which mean at top position for this one
       if (res.y &gt; 0)
           {
              this.flicker(45);
        }
}

</pre>
<p style="text-align: justify;">Código auto explicativo né?!? <img src='http://www.tuxtilt.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align: justify;">E na classe do Indiana altere o código:</p>
<pre class="brush: jscript; title: ; notranslate">
if (res)
    {
        if (res.type == me.game.ENEMY_OBJECT)
            {
                 // let's flicker in case we touched an enemy
                 this.flicker(45);
         }
}

</pre>
<p style="text-align: justify;">Para:</p>
<pre class="brush: jscript; title: ; notranslate">
if (res)
{
    if (res.type == me.game.ENEMY_OBJECT)
        {
            if ((res.y&gt;0) &amp;&amp; !this.jumping)
               {
                 // bounce
                 this.forceJump();
                }
            else
               {
                // let's flicker in case we touched an enemy
                this.flicker(45);
               }
       }
}
</pre>
<p style="text-align: justify;">Aqui adicionamos outra condição que verifica se o Indiana pulou na cabeça do Macaco, e nesse caso vai forçar o indiana a pular novamente, o que ir impedir que ele seja atingido pelo Macaco, nesse caso só o Macaco irá piscar:</p>
<p><iframe src="http://player.vimeo.com/video/29075627?title=0&amp;byline=0&amp;portrait=0" frameborder="0" width="400" height="320"></iframe></p>
<p style="text-align: justify;">Por enquanto é isso pessoal. até aqui deu para ter uma noção básica do funcionamento da engine, e para quem quiser se aprofundar mais sem esperar pela segunda parte, basta consultar a documentação da engine.</p>
<p style="text-align: justify;">Segue a listagem completa do arquivo main.js até então:</p>
<pre class="brush: jscript; title: ; notranslate">
// game resources
var g_resources = [{
    name: &quot;tile&quot;,
    type: &quot;image&quot;,
    src: &quot;data/tileset/tile.png&quot;
}, {
    name: &quot;mapa&quot;,
    type: &quot;tmx&quot;,
    src: &quot;data/mapa.tmx&quot;
},{
    name: &quot;indiana_tux&quot;,
    type: &quot;image&quot;,
    src: &quot;data/sprite/indiana_tux.png&quot;
},{
    name: &quot;fundo_01&quot;,
    type: &quot;image&quot;,
    src: &quot;data/background/fundo_01.png&quot;
},{
    name: &quot;fundo_02&quot;,
    type: &quot;image&quot;,
    src: &quot;data/background/fundo_02.png&quot;
},{
    name: &quot;rubi&quot;,
    type: &quot;image&quot;,
    src: &quot;data/sprite/rubi.png&quot;
},
{
   name: &quot;macaco_radioativo&quot;,
   type: &quot;image&quot;,
   src: &quot;data/sprite/macaco_radioativo.png&quot;
}];

//me.debug.renderHitBox = true;

/*----- a player entity ---------- */
var PlayerEntity = me.ObjectEntity.extend({

    /* ----- constructor ------ */
    init: function(x, y, settings) {
        // call the constructor
        this.parent(x, y, settings);

        // set the walking &amp; jumping speed
        this.setVelocity(3, 15);

        // adjust the bounding box
        this.updateColRect(8, 48, -1, 0);

        // set the display to follow our position on both axis
        me.game.viewport.follow(this.pos, me.game.viewport.AXIS.BOTH);
    },

    /* ----- update the player pos------ */
    update: function() {

        if (me.input.isKeyPressed('left')) {
            this.doWalk(true);
        } else if (me.input.isKeyPressed('right')) {
            this.doWalk(false);
        } else {
            this.vel.x = 0;
        }
        if (me.input.isKeyPressed('jump')) {
            this.doJump();
        }

        // check &amp; update player movement
        updated = this.updateMovement();

          // check for collision
         res = me.game.collide(this);

          if (res)
         {
            if (res.type == me.game.ENEMY_OBJECT)
            {
               if ((res.y&gt;0) &amp;&amp; !this.jumping)
               {
                  // bounce
                  this.forceJump();
               }
               else
               {
                  // let's flicker in case we touched an enemy
                  this.flicker(45);
               }
            }
         }

        // update animation
        if (updated) {
            // update objet animation
            this.parent(this);
        }
        return updated;
    }

});

 /*-- Collectable Entity --*/
var RubiEntity = me.CollectableEntity.extend(
{
init: function (x, y, settings)
{
// call the parent constructor
this.parent(x, y , settings);

}

});

/***** Enemy Entity	****/
	var MacacoEntity = me.ObjectEntity.extend(
	{
		init: function (x, y, settings)
		{
			// define this here instead of tiled
			settings.image = &quot;macaco_radioativo&quot;;
			settings.spritewidth = 64;

			// call the parent constructor
			this.parent(x, y , settings);

			this.startX = x;
			this.endX   = x+settings.width - settings.spritewidth; // size of sprite

			// make him start from the right
			this.pos.x = x + settings.width - settings.spritewidth;
			this.walkLeft = true;

         // walking &amp; jumping speed
			this.setVelocity(2, 0);

          // adjust the bounding box
         this.updateColRect(8, 48, -1, 0);

         // make it collidable
			this.collidable = true;
			this.type = me.game.ENEMY_OBJECT;

		},

	   // call by the engine when colliding with another object
      // obj parameter corresponds to the other object (typically the player)	touching this one
		onCollision : function (res, obj)
		{

			// res.y &gt;0 means touched by something on the bottom
			// which mean at top position for this one
			if (res.y &gt; 0)
			{
		      this.flicker(45);
			}
		},

		// manage the enemy movement
		update : function ()
		{

			if (this.alive)
			{
				if (this.walkLeft &amp;&amp; this.pos.x &lt;= this.startX)
				{
					this.walkLeft = false;
				}
				else if (!this.walkLeft &amp;&amp; this.pos.x &gt;= this.endX)
				{
					this.walkLeft = true;
				}

				//console.log(this.walkLeft);
				this.doWalk(this.walkLeft);
			}
			else
			{
				this.vel.x = 0;
			}
			// check &amp; update movement
			updated = this.updateMovement();

			if (updated)
			{
				// update the object animation
				this.parent();
			}
			return updated;
		}
	});

var jsApp = {
    /* --- Initialize the jsApp --- */
    onload: function() {

        // init the video
        if (!me.video.init('jsapp', 640, 480, false, 1.0)) {
            alert(&quot;Sorry but your browser does not support html 5 canvas.&quot;);
            return;
        }

        // initialize the &quot;audio&quot;
        me.audio.init(&quot;mp3,ogg&quot;);

        // set all resources to be loaded
        me.loader.onload = this.loaded.bind(this);

        // set all resources to be loaded
        me.loader.preload(g_resources);

        // load everything &amp; display a loading screen
        me.state.change(me.state.LOADING);
    },

    /* --- callback when everything is loaded --- */
    loaded: function() {

        // set the &quot;Play/Ingame&quot; Screen Object
        me.state.set(me.state.PLAY, new PlayScreen());

       // add our player entity in the entity pool
		me.entityPool.add(&quot;indianaTux&quot;, PlayerEntity);
        me.entityPool.add(&quot;Rubi&quot;, RubiEntity);
        me.entityPool.add(&quot;macacoMau&quot;, MacacoEntity);

		// enable the keyboard
		me.input.bindKey(me.input.KEY.LEFT, &quot;left&quot;);
		me.input.bindKey(me.input.KEY.RIGHT, &quot;right&quot;);
		me.input.bindKey(me.input.KEY.X, &quot;jump&quot;, true);

        // start the game
        me.state.change(me.state.PLAY);
    }

};
// jsApp

/* the in game stuff*/
var PlayScreen = me.ScreenObject.extend({

    onResetEvent: function() {
        // stuff to reset on state change

        // load a level
        me.levelDirector.loadLevel(&quot;mapa&quot;);
    },

    /* --- action to perform when game is finished (state change) --- */
    onDestroyEvent: function() {
    }

});

//bootstrap <img src='http://www.tuxtilt.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> 
window.onReady(function() {
    jsApp.onload();
});
</pre>
<p style="text-align: justify;">Na segunda parte do tutorial iremos:</p>
<ul>
<li>Adicionar um sistema de pontuações.</li>
<li>Adicionar efeitos sonoros.</li>
<li>Adicionar outros níveis (fases do jogo).</li>
<li>Criar uma tela de menu.</li>
<li>Implementar as ações decorrentes da colisão do Indiana com o Macaco e os Rubis, como criar pontuação, retirar vidas, etc.</li>
</ul>
<p>Até o Próximo!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tuxtilt.com/criando-jogos-online-para-html5/feed/</wfw:commentRss>
		<slash:comments>34</slash:comments>
		</item>
		<item>
		<title>Debian Day 2011 &#8211; Porto Alegre</title>
		<link>http://www.tuxtilt.com/debian-day-2011-dia-27-agosto-em-porto-alegrers/</link>
		<comments>http://www.tuxtilt.com/debian-day-2011-dia-27-agosto-em-porto-alegrers/#comments</comments>
		<pubDate>Thu, 11 Aug 2011 14:59:06 +0000</pubDate>
		<dc:creator>Relsi Hur Maron</dc:creator>
				<category><![CDATA[Diversos]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://www.tuxtilt.com/?p=877</guid>
		<description><![CDATA[[Reprodução: http://www.debian-rs.org/node/87] Com grande honra convido a Comunidade Debian, e o Nerdedo em geral, a desfrutar de algumas horas no próximo dia 27 de Agosto, Sábado, para a obtenção de conhecimento através de palestras, debate, lighting talks e claro, um &#8230; <a href="http://www.tuxtilt.com/debian-day-2011-dia-27-agosto-em-porto-alegrers/">Continuar lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><strong><img class="alignleft size-medium wp-image-882" title="flyerDD11" src="http://www.tuxtilt.com/wp-content/uploads/2011/08/flyerDD11-240x300.png" alt="" width="240" height="300" /></strong>[Reprodução:<a href="http://www.debian-rs.org/node/87" target="_blank"> http://www.debian-rs.org/node/87</a>]</p>
<p style="text-align: justify;">Com grande honra convido a Comunidade Debian, e o Nerdedo em geral, a desfrutar de algumas horas no próximo dia 27 de Agosto, Sábado, para a obtenção de conhecimento através de palestras, debate, lighting talks e claro, um bate-papo amistoso, na edição 2011 do Debian Day, promovido pelo Debian-RS em parceria com ASL.org, OpenCode, Esade, TeHospedo e Tchelinux.org</p>
<p>Com o tradicional Welcome Coffee do Debian-RS e Sorteio de Camisetas <img src='http://www.tuxtilt.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>O evento será realizado na Esade, unidade Cidade Baixa, à Rua Luis Afonso, 84, a poucos metros do Zaffari da Rua General Lima e Silva.<span id="more-877"></span></p>
<p>Grade do evento:</p>
<ul>
<li>9h &#8211; 9h 30m &#8211; Recepção e Café de Boas-Vindas</li>
<li>9h 30m &#8211; 10h &#8211; Abertura e Sobre Debian-RS</li>
<li>11h &#8211; 12h &#8211; Não sou programador, como posso ajudar o Projeto Debian?</li>
<li>12h &#8211; 12h 30m &#8211; 3 Lighting Talk sobre Software Livre</li>
<li>12h 30m &#8211; 13h 30m &#8211; Almoço (cada um por sí)</li>
<li>13h 30m &#8211; 14h 30m &#8211; Administradores de Sistemas e suas Gambiarras</li>
<li>14h 30m &#8211; 15h 30m &#8211; Uso de ferramentas OpenSource para Análise Forense (pós mortem)</li>
<li>15h 30m &#8211; 16h &#8211; Coffee-break</li>
<li>16h &#8211; 17h &#8211; Comunicação e Software Livre</li>
<li>17h &#8211; 18h &#8211; Debate sobre Comunidades, Oportunidades, Comunicação e Software Livre</li>
<li>18h &#8211; 18h 30m &#8211; 3 Lighting Talk sobre Software Livre</li>
<li>18h 30m &#8211; 19h &#8211; Encerramento</li>
</ul>
<p>Inscrições:  <a href="http://tinyurl.com/inscDD11">Clique Aqui</a></p>
<p style="text-align: justify;">Resumo das Palestras:</p>
<p>Título: Não sou programador, como posso ajudar o Projeto Debian?</p>
<p>Resumo da Palestra: Essa não é uma palestra técnica, mas visa explicar como o Projeto Debian trabalha em diversas frentes, permitindo que qualquer pessoa ajude com suas aptidões e desejos de trabalho. O palestrante deve visitar os sites sugeridos na própria palestra.</p>
<p>Resumo do Palestrante: Luiz Guaraldo é Analista de Suporte GNU/Linux, Líder dos Grupos de Usuários Debian-RS e LTSP-BR, gaúcho por opção. Site pessoal: http://www.universolivre.net.br</p>
<p style="text-align: justify;">Título: 3 Lighting Talk sobre Software Livre</p>
<p>Resumo da Palestra: Espaço aberto a presentes falarem, por 10 minutos no máximo, sobre alguma experiência pessoal ou de terceiros, um relato sobre pesquisa, algum conhecimento útil, ou outra coisa desde que tenha alguma fundamentação em Software Livre, ou sendo mais simplório, pode ser a chance de se lançar fazendo um stand-up comedy mesmo.</p>
<p style="text-align: justify;">Título: Administradores de Sistemas e suas Gambiarrasr</p>
<p>Resumo da Palestra: Palestra voltado a SysAdmins com técnicas que não devem ser feitas para administração de sistemas e servidores, palestra com didática divertida e muito bom humor.</p>
<p>Resumo do Palestrante: João Fracassi é Técnico de Suporte N2 na empresa Kenta Informática, com experiência em SysAdmin, resolução de problemas em ambiente de sistema (software/hardware), redes. É acadêmico na área de técnologia da informação e Dell Certified System Expert Certification, Microsoft Certified Professional, Novell Certified Linux Administrator e Linux User#524982 e Daniel Lara é Administrador rede na empresa Rede Host, com experiência em administração de redes Linux. É Acadêmico na área de técnologia da informação, System Administrator, Network Administrator e Linux User #452387r</p>
<p style="text-align: justify;">Título: Uso de ferramentas OpenSource para Análise Forense (pós mortem)</p>
<p>Resumo da Palestra: Uso de ferramentas OpenSource para Análise Forense (pós mortem)</p>
<p>Resumo do Palestrante: Leandro Godoy é Consultor da OpenCode Consulting com anos de experiência na área de Software Livre, com vários clientes e contribuições a comunidade Debian, dentre outras</p>
<p style="text-align: justify;">Título: Comunicação e Software Livre</p>
<p>Resumo da Palestra: Grande parte das informações absorvidas pelas sociedade se dá através da veiculação de informações em órgãos de imprensa. Para que as tecnologias de código aberto e a filosofia do software livre sejam introduzidas com maior facilidade no universo de conhecimento da sociedade de uma maneira geral, é importante que as informações sejam familiares aos profissionais de comunicação, que, em última análise, tornam-se formadores de opinião.</p>
<p>Dessa forma, nota-se a importância de que comunidades que fomentam o uso de software livre e empresas que atuam nesse ramo de negócios se apropriem também de conhecimentos em comunicação social. Esta palestra pretende apresentar, através de pesquisa, o entendimento de jornalistas de diversos veículos de imprensa do RS, além de cases de projetos de comunicação em software livre e dicas sobre procedimentos na área de comunicação.</p>
<p>Resumo do Palestrante: Rochele Prass é graduada em Letras, foi professora de Literatura e Língua Portuguesa. Atualmente, é acadêmica de Jornalismo, área em que atua desde 2004. Passou pela Agência de Notícias do curso de Comunicação da Universidade do Vale do Rio dos Sinos, foi âncora do programa de Rádio Reunião de Pauta da Rádio Unisinos.</p>
<p>Atuou na Rádio do Governo do Estado do RS, na Comunicação Social da Assembleia Legislativa do RS. Também foi repórter e produtora nas Rádios Bandeirantes AM e Band News FM de Porto Alegre e atuou na área de Assessoria de Imprensa Empresarial. Foi co-editora da Revista BrOffice.org e atuou na Assessoria de Imprensa do BrOffice.org &#8211; Projeto Brasil. Recentemente, fundou e edita o www.iniciativalivre.com.br, portal de notícias de Tecnologia da Informação.</p>
<p style="text-align: justify;">Título: Debate sobre Comunicação e Software Livre, Comunidades, Oportunidades, Negócios em Software Livre</p>
<p>Resumo da Palestra: Um reunião aberta dos palestrantes anteriores, em conjunto com participantes, para debater sobre os assuntos títulos, seguindo uma continuação da palestra anterior com o acréscimo de informações e diálogo sobre, O que é a Comunidade Software Livre (que por incrivel que parece, há dúvidas), Oportunidades da área para quem está, ou não, em começo de carreira, e um pouco sobre Negócios e como se obter ter uma vida profissional trabalhando-se com Software Livre.</p>
<p>Resumo do Palestrante: Todos os anteriores, com o acréscimo de Luiz Henrique Rauber Rodrigues, que é Profissional Liberal na Área de TI, atualmente prestando serviço de consultoria a clientes da VSV Sistemas, já tendo atuado com serviços in company para clientes como Araujo Abreu Engenharia. Foco trabalho em Gerenciamento de Projetos, Gestão de TI, Gestão Empresarial, Melhorias de Processos, Organização de Equipes, e o que mais for constatado que aumente a produtividade empresarial. Já contribuiu palestrando/organizando eventos sobre Linux, Metodologias Ágeis (Agile), OpenOffice (BrOffice) e Negócios com Software Livre, em eventos como os da Tchelinux, Debian-RS, fisl, IIBA, PMI-RS, FLISOL, Latinoware dentro outros.</p>
<p style="text-align: justify;">Título: 3 Lighting Talk sobre Software Livre</p>
<p>Resumo da Palestra: Espaço aberto a presentes falarem, por 10 minutos no máximo, sobre alguma experiência pessoal ou de terceiros, um relato sobre pesquisa, algum conhecimento útil, ou outra coisa desde que tenha alguma fundamentação em Software Livre, ou sendo mais simplório, pode ser a chance de se lançar fazendo um stand-up comedy mesmo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tuxtilt.com/debian-day-2011-dia-27-agosto-em-porto-alegrers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lançada Revista Espírito Livre, edição 27!</title>
		<link>http://www.tuxtilt.com/revista-espirito-livre-27/</link>
		<comments>http://www.tuxtilt.com/revista-espirito-livre-27/#comments</comments>
		<pubDate>Mon, 11 Jul 2011 17:59:48 +0000</pubDate>
		<dc:creator>Relsi Hur Maron</dc:creator>
				<category><![CDATA[revistas]]></category>
		<category><![CDATA[liberdade]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[livre]]></category>

		<guid isPermaLink="false">http://www.tuxtilt.com/?p=871</guid>
		<description><![CDATA[Além do tema principal, EAD e Software Livre. a edição 27 ainda trás Fabrício Araújo com o tema LTSP, a coluna sobre LibreOffice, Birgitta Jonsdottir com uma reflexão bastante pertinente sobre o uso de nossas informações por diversas empresas. Baixe &#8230; <a href="http://www.tuxtilt.com/revista-espirito-livre-27/">Continuar lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-medium wp-image-872" title="REL027_Capa" src="http://www.tuxtilt.com/wp-content/uploads/2011/07/REL027_Capa-224x300.jpg" alt="" width="224" height="300" />Além do tema principal, EAD e Software Livre. a edição 27 ainda trás Fabrício Araújo com o tema LTSP, a coluna sobre LibreOffice, Birgitta Jonsdottir com uma reflexão bastante pertinente sobre o uso de nossas informações por diversas empresas.</p>
<p>Baixe a sua <a href="http://www.revista.espiritolivre.org/?p=1532">agora clicando aqui</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tuxtilt.com/revista-espirito-livre-27/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Geolocalização com web2py (geocode)</title>
		<link>http://www.tuxtilt.com/geolocalizacao-com-web2py-geocode/</link>
		<comments>http://www.tuxtilt.com/geolocalizacao-com-web2py-geocode/#comments</comments>
		<pubDate>Sun, 19 Jun 2011 14:14:56 +0000</pubDate>
		<dc:creator>Relsi Hur Maron</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[tutoriais]]></category>
		<category><![CDATA[web2py]]></category>

		<guid isPermaLink="false">http://www.tuxtilt.com/?p=853</guid>
		<description><![CDATA[A algum tempo atrás quando eu criei a aplicação web2pyople, utilizando a API do Google Maps com o web2py, para buscar as coordenadas geográficas do usuário eu criei uma ferramenta com base na própria API; quando fiz o deploy da &#8230; <a href="http://www.tuxtilt.com/geolocalizacao-com-web2py-geocode/">Continuar lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><a href="http://www.tuxtilt.com/wp-content/uploads/2011/06/image2830.png"><img class="alignleft size-full wp-image-867" style="margin-right: 10px; margin-bottom: 10px;" title="image2830" src="http://www.tuxtilt.com/wp-content/uploads/2011/06/image2830.png" alt="" width="265" height="231" /></a>A algum tempo atrás quando eu criei a aplicação <a href="http://www.tuxtilt.com/web2pyople-desenvolvedores-web2py/" target="_blank">web2pyople</a>, utilizando a API do Google Maps com o web2py, para buscar as coordenadas geográficas do usuário eu criei uma ferramenta com base na própria API; quando fiz o deploy da aplicação, o Massimo sugeriu que eu utilizasse a função geocode do próprio web2py para automatizar a tarefa. Bueno, nesse meio tempo não mexi mais no <a href="http://www.tuxtilt.com/web2pyople-desenvolvedores-web2py/" target="_blank">web2pyople</a>, de forma que essa modificação não foi aplicada, mas como semana passada eu subi o fonte da aplicação para o <a href="https://github.com/relsi/web2pyople" target="_blank">github</a>, resolvi criar essa dica para quem quiser fazer alguma coisa utilizando a função geocode do web2py, e no final segue mais um exemplo simples do web2py com a API do Google Maps utilizando o geocode.<span id="more-853"></span></p>
<p style="text-align: justify;">O funcionamento é bem simples, tu passa como parâmetro uma localização e o geocode te retorna a latitude e longitude da localização.</p>
<p style="text-align: justify;">Para esse exemplo vamos criar uma nova aplicação no web2py chamada google_maps e editar o controlador default da aplicação alterando a função index():</p>
<pre class="brush: python; title: ; notranslate">
def index():
    from gluon.tools import geocode
    coordenadas = geocode(&quot;Avenida Nestor Jardim filho, Eldorado do Sul, Brasil&quot;)

    return dict(coordenadas=coordenadas)
</pre>
<p style="text-align: justify;">Bom, acredito que o código se explique por si só, na linha 2 estamos importando o geocode para poder utilizar na função, e na linha 3 a variável coordenadas receberá da função geocode a latitude e longitude do endereço passado como parâmetro, nesse caso a minha rua.</p>
<p style="text-align: justify;">Concluída a alteração do controlador, devemos fazer o mesmo com a view index.html.</p>
<pre class="brush: python; title: ; notranslate">
{{extend 'layout.html'}}
{{=coordenadas}}
</pre>
<p>Bueno, agora acessando a url da aplicação, http://localhost:8000/google_maps/default/index, deveremos ter o seguinte resultado:</p>
<p><img class="aligncenter size-full wp-image-856" title="coordenadas" src="http://www.tuxtilt.com/wp-content/uploads/2011/06/coordenadas.png" alt="" width="346" height="219" /></p>
<p style="text-align: justify;">Temos aí então a longitude e latitude do meu endereço. Eu posso aumentar a exatidão inserindo o CEP, bairro, etc. Bem como posso definir apenas a cidade e o país.</p>
<p style="text-align: justify;">Caso seja passado como parâmetro um endereço inválido, o geocode ira retornar (0.0, 0.0). Por exemplo, se alguém passasse a localização da <a href="http://www.4shared.com/audio/Jtn8nIyE/_Os_Garotos_de_Ouro_-_A_Bailan.htm">Bailanta do sem Fim</a>, que todo mundo sabe que fica lá no fim do mundo pra diante dos cafundós, não ia ter sucesso:</p>
<pre class="brush: python; title: ; notranslate">
def index():
    from gluon.tools import geocode
    coordenadas = geocode(&quot;fim do mundo, cafundó, Brasil&quot;)

    return dict(coordenadas=coordenadas)

</pre>
<p><img class="aligncenter size-full wp-image-858" title="Captura_de_tela-1" src="http://www.tuxtilt.com/wp-content/uploads/2011/06/Captura_de_tela-1.png" alt="" width="327" height="202" /></p>
<p style="text-align: justify;">Agora que já sabemos que entrando um endereço válido é retornado as coordenadas geográficas do endereço, e que um endereço inválido retorna (0.0, 0.0), vamos preparar o controlador para receber a entrada do usuário.</p>
<p style="text-align: justify;">Primeiramente, devemos criar um simples formulário na view index.html a fim de receber a localização que será passada para o controlador:</p>
<pre class="brush: xml; title: ; notranslate">
{{extend 'layout.html'}}

&lt;form enctype=&quot;multipart/form-data&quot; method=&quot;post&quot;&gt;
    &lt;input type=&quot;text&quot; size=&quot;30&quot; name=&quot;local&quot; /&gt;
    &lt;input type=&quot;submit&quot; name=&quot;submit&quot; value=&quot;enviar&quot; /&gt;
&lt;/form&gt;

&lt;br /&gt;

{{=coordenadas}}
</pre>
<p>Também temos que alterar o controlador para processar as informações do formulário que acabamos de criar:</p>
<pre class="brush: python; title: ; notranslate">
def index():
    from gluon.tools import geocode
    coordenadas = geocode('%s' % request.vars.local)

    return dict(coordenadas=coordenadas)
</pre>
<p>Temos agora um pequeno form que vai receber uma localidade e passar o valor para o controlador, que irá devolver as coordenadas respectivas, ou 0.0 caso a localização seja desconhecida:</p>
<p><a href="http://www.tuxtilt.com/wp-content/uploads/2011/06/Captura_de_tela-2.png"><img class="aligncenter size-full wp-image-860" title="Captura_de_tela-2" src="http://www.tuxtilt.com/wp-content/uploads/2011/06/Captura_de_tela-2.png" alt="" width="429" height="259" /></a></p>
<p>Um exemplo disso interagindo com o Google Maps ficaria dessa forma:</p>
<pre class="brush: jscript; title: ; notranslate">
{{extend 'layout.html'}}

&lt;script type=&quot;text/javascript&quot; src=&quot;http://maps.google.com/maps/api/js?sensor=false&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
  function initialize() {
    var myLatlng = new google.maps.LatLng({{=coordenadas[1]}},{{=coordenadas[0]}});
    var myOptions = {
      zoom: 15,
      center: myLatlng,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    }
    var map = new google.maps.Map(document.getElementById(&quot;map_canvas&quot;), myOptions);

    var marker = new google.maps.Marker({
        position: myLatlng,
        map: map,
        title:&quot;Hello World!&quot;
    });
  }
&lt;/script&gt;

&lt;form enctype=&quot;multipart/form-data&quot; method=&quot;post&quot;&gt;
    &lt;input type=&quot;text&quot; size=&quot;30&quot; name=&quot;local&quot; /&gt;
    &lt;input type=&quot;submit&quot; name=&quot;submit&quot; value=&quot;enviar&quot; /&gt;
&lt;/form&gt;

&lt;br /&gt;

&lt;div id=&quot;map_canvas&quot; style=&quot;width: 400px; height: 400px;&quot;&gt;&lt;/div&gt;

&lt;script&gt;initialize();&lt;/script&gt;

</pre>
<p>É um código básico da própria documentação da API do Google Maps, nesse exemplo estamos passando as coordenadas para o script renderizar o mapa (linha 6). Não é o intuito desse se aprofundar na API do Google Maps, isso fica para um próximo post, mais informações podem ser conseguidas na documentação da mesma <a href="http://code.google.com/intl/pt-BR/apis/maps/documentation/javascript/">clicando aqui</a>.</p>
<p>Abaixo o mapa renderizado:</p>
<p><a href="http://www.tuxtilt.com/wp-content/uploads/2011/06/Captura_de_tela-3.png"><img class="aligncenter size-full wp-image-864" title="Captura_de_tela-3" src="http://www.tuxtilt.com/wp-content/uploads/2011/06/Captura_de_tela-3.png" alt="" width="425" height="572" /></a></p>
<p>Bueno, para quem não tinha utilizado ainda a funcionalidade no web2py fica aí dica. Os usos para o geocode são os mais variados, como por exemplo um cadastro de clientes geo-localizado, muito útil para empresas de tele-entrega, um cadastro de eventos, etc.</p>
<p>Qualquer dúvida é só prenderem o grito!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tuxtilt.com/geolocalizacao-com-web2py-geocode/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Host gratuito para web2py</title>
		<link>http://www.tuxtilt.com/host-gratuito-web2py/</link>
		<comments>http://www.tuxtilt.com/host-gratuito-web2py/#comments</comments>
		<pubDate>Wed, 15 Jun 2011 00:07:19 +0000</pubDate>
		<dc:creator>Relsi Hur Maron</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[web2py]]></category>
		<category><![CDATA[web2py host]]></category>

		<guid isPermaLink="false">http://www.tuxtilt.com/?p=837</guid>
		<description><![CDATA[Se tu precisa de uma alternativa ao GAE para fazer o deploy de uma aplicação web2py de forma simples e sem custos, uma boa alternativa é o www.alwaysdata.com, que oferece hospedagem com python, MySQL, PostgreSQL, MongoDB e CouchDB em uma &#8230; <a href="http://www.tuxtilt.com/host-gratuito-web2py/">Continuar lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><a href="http://www.tuxtilt.com/wp-content/uploads/2011/06/text2818.png"><img class="alignleft size-medium wp-image-844" title="text2818" src="http://www.tuxtilt.com/wp-content/uploads/2011/06/text2818-300x167.png" alt="" width="234" height="130" /></a>Se tu precisa de uma alternativa ao GAE para fazer o deploy de uma aplicação web2py de forma simples e sem custos, uma boa alternativa é o <a href="www.alwaysdata.com" target="_blank">www.alwaysdata.com</a>, que oferece hospedagem com python, MySQL, PostgreSQL, MongoDB e CouchDB em uma conta gratuita. O espaço é espartano, apenas 10 MB para a conta gratuíta, mas é o suficiente para pequenas aplicações, testes de funcionalidades na web, ou para quem está aprendendo a utilizar o framework.</p>
<p>A seguir vou ilustrar os passos para fazer o deploy da sua aplicação. Em apenas alguns minutos o ambiente está rodando.<span id="more-837"></span></p>
<p>Primeiramente acesse o site e faça o seu cadastro:</p>
<p><a href="http://www.tuxtilt.com/wp-content/uploads/2011/06/cadastro_1.png"><img class="aligncenter size-medium wp-image-839" title="cadastro_1" src="http://www.tuxtilt.com/wp-content/uploads/2011/06/cadastro_1-300x137.png" alt="" width="300" height="137" /></a></p>
<p style="text-align: justify;">O nome de usuário vai ser o seu endereço, no formato http://nome-do-usuario.alwaysdata.net/. Escolha o plano gratuito e clique em Next step.</p>
<p><a href="http://www.tuxtilt.com/wp-content/uploads/2011/06/profile.png"><img class="aligncenter size-medium wp-image-843" title="profile" src="http://www.tuxtilt.com/wp-content/uploads/2011/06/profile-300x114.png" alt="" width="300" height="114" /></a></p>
<p style="text-align: justify;">Serão solicitados alguns dados para criação da conta, insira um email válido e defina um senha para acessar o painel de controle da hospedagem.</p>
<p><a href="http://www.tuxtilt.com/wp-content/uploads/2011/06/check_info.png"><img class="aligncenter size-medium wp-image-840" title="check_info" src="http://www.tuxtilt.com/wp-content/uploads/2011/06/check_info-300x194.png" alt="" width="300" height="194" /></a></p>
<p>Confirme seus dados e clique em Sign up. Aguarde finalizar o processo e serão exibidos os dados de acesso de ftp e ssh.</p>
<p style="text-align: justify;">Bem, se tu quiser efetuar as operações via SSH, primeiro vai ter que entrar no painel de controle e habilitar o teu usuário. Aqui fiz via FTP, então primeira coisa que tu vai fazer é dar uma enxugada no web2py. Eu eliminei todas as aplicações padrão e deixei apenas a minha aplicação e subi os arquivos para a raiz do servidor (se preferir pode enviar os arquivos para um diretório).</p>
<p style="text-align: justify;">Feito isso crie um diretório chamado /public na raiz do servidor (ou no diretório do web2py, caso tenha subido para um diretório). Após criar o diretório, crie um arquivo chamado <em>web2py.fcgi </em>com o seguinte conteúdo:<em><br />
</em></p>
<pre class="brush: plain; title: ; notranslate">
#!/usr/bin/python

import os, sys
_PROJECT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, _PROJECT_DIR)
os.chdir(_PROJECT_DIR)

import gluon.main
import gluon.contrib.gateways.fcgi as fcgi
fcgi.WSGIServer(gluon.main.wsgibase, environ={'web2py_path': _PROJECT_DIR}).run()

</pre>
<p>Envie o arquivo para o diretório /public e de permissão de execução (775)</p>
<p>Agora crie um arquivo <em>.htaccess </em>com o seguinte conteúdo:</p>
<pre class="brush: plain; title: ; notranslate">
AddHandler fcgid-script .fcgi
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ web2py.fcgi/$1 [QSA,L]

</pre>
<p>Envie o arquivo para o diretório /public também.</p>
<p>Estamos quase lá.</p>
<p style="text-align: justify;">Agora acesse o painel administrativo da hospedagem e, no menu lateral esquerdo, clique na opção Domains. Na tela que se abre, tu vai ver o caminho para a raiz de sua aplicação, clique em Edit e altere o caminho para o teu diretório /public. Se tu enviou os arquivos do web2py para a raiz, a configuração deve ficar assim:</p>
<p><a href="http://www.tuxtilt.com/wp-content/uploads/2011/06/alterando_path.png"><img class="aligncenter size-full wp-image-838" title="alterando_path" src="http://www.tuxtilt.com/wp-content/uploads/2011/06/alterando_path.png" alt="" width="559" height="93" /></a><br />
Caso tenha subido os arquivos para outro diretório, basta inserir o caminho de acordo com o teu diretório.</p>
<p>Feito isso, já pode acessar a aplicação no teu domínio, para ver a aplicação que eu instalei basta acessar: <a href="http://tuxtilt.alwaysdata.net/" target="_blank">http://tuxtilt.alwaysdata.net/</a></p>
<p style="text-align: justify;">E isso aí, espero que a dica possa ser útil, assim como foi pra mim que tive que testar uma aplicação fora do GAE e não tive sucesso com os hosts nacionais (de forma rápida e simples). Caso precise de mais espaço, como por exemplo para colocar uma app em produção, basta contratar um plano pago, que estão bem em conta. em relação à performance do host não sei dizer, pois conheci hoje também, vou fazer mais uns testes e se for o caso volto a publicar por aqui.</p>
<p>Os passos realizados aqui foram retirados do wiki da hospedagem:<a href="http://migre.me/53ypX" target="_blank">http://migre.me/53ypX </a>. Dica originalmente publicada no grupo oficial do web2py: <a href="http://migre.me/53ytO" target="_blank">http://migre.me/53ytO</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.tuxtilt.com/host-gratuito-web2py/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Convertendo DBF para MYSQL</title>
		<link>http://www.tuxtilt.com/converter-dbf-para-mysql/</link>
		<comments>http://www.tuxtilt.com/converter-dbf-para-mysql/#comments</comments>
		<pubDate>Thu, 19 May 2011 03:45:49 +0000</pubDate>
		<dc:creator>Relsi Hur Maron</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[tutoriais]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://www.tuxtilt.com/?p=824</guid>
		<description><![CDATA[Estou fazendo um sistema de gestão para uma instituição de caridade, e dentre as tarefas vou migrar um sistema desenvolvido em Clipper para o sistema que estou desenvolvendo em PHP/MySQL. Bem a primeira coisa que necessitava era converter as bases &#8230; <a href="http://www.tuxtilt.com/converter-dbf-para-mysql/">Continuar lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img class="size-full wp-image-832 alignleft" style="margin-left: 10px; margin-right: 10px;" title="Converter DBF para MySQL" src="http://www.tuxtilt.com/wp-content/uploads/2011/05/dbf-to-mysql.png" alt="Converter DBF para MySQL" width="230" height="157" /></p>
<p>Estou fazendo um sistema de gestão para uma instituição de caridade, e dentre as tarefas vou migrar um sistema desenvolvido em Clipper para o sistema que estou desenvolvendo em PHP/MySQL.</p>
<p>Bem a primeira coisa que necessitava era converter as bases de dados DBF para Mysql, fui direto no PHPClasses [<a href="http://www.phpclasses.org/">1</a>], de primeira encontrei essa interessante classe dbf2mysql [<a href="http://www.phpclasses.org/package/5628-PHP-Import-data-from-DBF-files-into-MySQL-databases.html">2</a>].</p>
<p>Muito tri, só que tem um porém. No Ubuntu, o PHP não vem com suporte ao dbase, então seria necessário compilar a extensão.<span id="more-824"></span></p>
<p>Abaixo segue a receita do bolo para quem por ventura vier a precisar.</p>
<p>Primeiramente baixe o fonte do PHP e salve em algum diretório.</p>
<p>Tu vai precisar ter instalado o pacote de desenvolvimento:</p>
<pre class="brush: plain; title: ; notranslate">sudo apt-get install php5-dev</pre>
<p>Feito isso, precisamos do fonte da extensão dbase, pois ele foi removido do PHP 5.3+.</p>
<p>Navegue até o diretório /ext do código fonte que tu baixou do PHP e crie um diretório para o código fonte da extensão:</p>
<pre class="brush: plain; title: ; notranslate">mkdir dbase</pre>
<p>Agora baixe o fonte através do svn:</p>
<pre class="brush: plain; title: ; notranslate">svn co http://svn.php.net/repository/pecl/dbase/trunk dbase</pre>
<p>Entre no diretório dbase:</p>
<pre class="brush: plain; title: ; notranslate">cd dbase</pre>
<p>Execute o comando:</p>
<pre class="brush: plain; title: ; notranslate">phpize</pre>
<p>Execute o comando:</p>
<pre class="brush: plain; title: ; notranslate">./configure</pre>
<p>Espere terminar o processo e execute o comando make:</p>
<pre class="brush: plain; title: ; notranslate">make</pre>
<p>Agora copie a extensão para o diretório /usr/lib/php5/20090626+lfs/</p>
<pre class="brush: plain; title: ; notranslate">sudo cp modules/dbase.so /usr/lib/php5/20090626+lfs/
</pre>
<p>(PHP 5.3.2)</p>
<p>Abra o php.ini</p>
<pre class="brush: plain; title: ; notranslate">sudo gedit /etc/php5/apache2/php.ini</pre>
<p>E insira a seguinte linha:</p>
<pre class="brush: plain; title: ; notranslate"> extension=dbase.so</pre>
<p>Salve e feche o arquivo, agora reinicie o apache:</p>
<pre class="brush: plain; title: ; notranslate">sudo /etc/init.d/apache2 restart</pre>
<p>Agora seu PHP já tem suporte a bases DBF.</p>
<p>Bueno, o uso da classe dbf2mysql é bem simples, segue um exemplo abaixo:</p>
<pre class="brush: php; title: ; notranslate">
//inclui a classe dbf2mysql
include 'dbf2mysql';

//abre o arquivo DBF
$filename = &quot;ARQUIVO.DBF&quot;;

//exibe o resultado do sql na tela
dbf2mysql::mostrarSQL($filename);

</pre>
<p>A partir daqui é só automatizar o trabalho, como por exemplo lêr todos os arquivos DBF e já fazer a inserção no banco de dados.</p>
<p>A base desse artigo foi tirada do zenware [<a href="http://zenware.net/blog/?p=179">3</a>]</p>
<p>[1] <a href="http://www.phpclasses.org/">PHPClasses</a><br />
[2] <a href="http://www.phpclasses.org/package/5628-PHP-Import-data-from-DBF-files-into-MySQL-databases.html">dbf2mysql</a><br />
[3] <a href="http://zenware.net/blog/?p=179">Zenware</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.tuxtilt.com/converter-dbf-para-mysql/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
