tag:blogger.com,1999:blog-6097186055686127582024-03-13T15:37:47.187-03:00Portal C++ - Diogo_RBGProgramação para jogos. SDL, C, C++ e tudo mais que precisar !Diogo_RBGhttp://www.blogger.com/profile/02121378674070181046noreply@blogger.comBlogger33125tag:blogger.com,1999:blog-609718605568612758.post-57070872556996188472015-11-26T19:10:00.000-03:002015-11-26T21:27:49.840-03:00Game Wells: Isto vai explodir!<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/Kzql1RTJnzY/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/Kzql1RTJnzY?feature=player_embedded" width="320"></iframe></div>
<br>
<a href="http://www.towerupstudios.com/wells/" target="_blank">Wells</a> é um jogo de ação side-scrolling com gráficos 3D, pertencente ao subgênero clássico dos anos 90, o Run and Gun. Preparasse para hordas de inimigos, <b>explosões</b>, <b>chefes gigantescos</b>, e uma longa jornada em um fascinante mundo <b>steampunk</b>.
<br>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-O5ox9-sen2A/Vldjwuv-_iI/AAAAAAAABrA/pesAN-Cv8sk/s1600/wells.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="166" src="http://4.bp.blogspot.com/-O5ox9-sen2A/Vldjwuv-_iI/AAAAAAAABrA/pesAN-Cv8sk/s400/wells.jpg" width="400"></a></div>
<br>
<a href="http://diogorbg.blogspot.com.br/2015/11/game-wells-isto-vai-explodir.html">» Post Completo...</a>
<br>
<a href="http://diogorbg.blogspot.com/2015/11/game-wells-isto-vai-explodir.html#more">Mais informações »</a>Diogo_RBGhttp://www.blogger.com/profile/02121378674070181046noreply@blogger.com0tag:blogger.com,1999:blog-609718605568612758.post-11047877630939677022015-04-03T10:55:00.000-03:002015-04-03T11:43:37.598-03:00Ubuntu 10.04: Trocando a posicao dos Botoes<img alt="" border="0" src="http://1.bp.blogspot.com/_0qjVkiNs-GQ/TBp93Oksn-I/AAAAAAAAAdw/YNmiKpg0Mfo/s400/ico.png" id="BLOGGER_PHOTO_ID_5483833884035293154" style="cursor: hand; cursor: pointer; float: left; height: 94px; margin: 0 10px 10px 0; width: 100px;"><br>
O Ubuntu 10.04 (Lucid Lynx) chegou arrasando e contrariando ao mesmo tempo. Seu novo tema preto ficou sinistro, era o que eu esperava já a algumas versões (o tema dark havia sido prometido a algum tempo). O tema ficou massa, mas o que houve com os botões?! Trocar os botões de lado pegou muita gente de surpresa. O Ubuntu é danado pra inventar moda... primeiro ele dividiu a barra de menu em duas e agora já quer acostumar os usuários a fechar a janela pelo canto esquerdo. Pode até que dê certo, mas pra aqueles que não gostaram muito da ideia tem como dar aquele jeitinho <img src="http://drlib.googlecode.com/svn/blog/smile/XD.gif"> !!!<br>
<br><a href="2015/04/ubuntu-1004-trocando-posicao-dos-botoes.html">» Post Completo...</a>
<a href="http://diogorbg.blogspot.com/2015/04/ubuntu-1004-trocando-posicao-dos-botoes.html#more">Mais informações »</a>Diogo_RBGhttp://www.blogger.com/profile/02121378674070181046noreply@blogger.com1tag:blogger.com,1999:blog-609718605568612758.post-66520275315501453292010-06-17T09:05:00.009-03:002012-10-19T17:26:40.943-03:00Resultado da Enquete de Março<img alt="" border="0" id="BLOGGER_PHOTO_ID_5483751380474001730" src="http://1.bp.blogspot.com/_0qjVkiNs-GQ/TBoy0421-UI/AAAAAAAAAdo/mUWIjkf0c_A/s400/enquete.png" style="float: left; height: 100px; margin: 0 10px 10px 0; width: 100px;"><br>
Pra esquentar as coisas por aqui eu resolvi voltar com uma enquete. A intenção era comentar sobre o resultado da enquete e aos poucos ir voltando a postar no blog.<br>
Bem, a intenção foi boa. O problema foi que demorei um pouco mais que o esperado para comentar sobre a enquete e ela esfriou... pra falar a verdade já deve estar vencida !<br>
<br>
Enquete de março: <b>O que você acha do The Mana World BR?</b><br>
<ul>
<li>:D Muito legal !!! (4 votos/36%)</li>
<li>:-) 3D seria melhor (3 votos/27%)</li>
<li>:-| Poderia ser melhor (2 votos/18%)</li>
<li>:-( Prefiro Tíbia (2 votos/18%)</li>
</ul>
11 votos no total.<br>
<br>
<b></b><br>
<a href="http://diogorbg.blogspot.com/2010/06/resultado-da-enquete-de-marco.html#more">Mais informações »</a>Diogo_RBGhttp://www.blogger.com/profile/02121378674070181046noreply@blogger.com4tag:blogger.com,1999:blog-609718605568612758.post-53745453058361318362009-05-05T00:30:00.006-03:002015-04-03T11:45:23.750-03:00Apresentação da SDL na aula de P.A.Andei trabalhando muito estes dias... Oficina sobre edição de mapas 2D e palestra sobre SDL no <a href="http://edjto.wordpress.com/">1º Encontro de Desenvolvedores de Jogos do Tocantins</a> e agora uma apresentação sobre desenvolvimento de jogos em SDL... ou desenvolvimento do jogo come poto em SDL, tanto faz ;)<br><img style="border:none; display:block; margin:0px auto 10px; text-align:center; width:278px; height:262px;" src="http://4.bp.blogspot.com/_0qjVkiNs-GQ/SgCQ3BdRp8I/AAAAAAAAAcI/4MZGoQuqztI/s400/032_lousa.png" border="0" id="BLOGGER_PHOTO_ID_5332421233765099458"><br>
<a href="2009/05/apresentacao-da-sdl-na-aula-de-pa.html">» Post Completo...</a><a href="http://diogorbg.blogspot.com/2009/05/apresentacao-da-sdl-na-aula-de-pa.html#more">Mais informações »</a>Diogo_RBGhttp://www.blogger.com/profile/02121378674070181046noreply@blogger.com6tag:blogger.com,1999:blog-609718605568612758.post-71163827517859429202009-03-31T22:40:00.008-03:002015-04-03T11:48:48.747-03:00Construindo um MMORPG - Parte 3<div style="height: 194px;"><img style="margin: 0pt 10px 10px 0pt; float: left; width: 180px; height: 180px;" src="http://3.bp.blogspot.com/_0qjVkiNs-GQ/SdJqJHgKZ-I/AAAAAAAAAaw/bm7jgZwhIOk/s400/030_ico.png" alt="" id="BLOGGER_PHOTO_ID_5319430814743291874" border="0">Eis a parte desta série de tutoriais que todos esperavam. A hora de colocar as mãos na massa. Liberte toda sua criatividade desenhando mapas e escrevendo aventuras para seu jogo. Resgate agora mesmo aqueles rabiscos feitos em seus antigos cadernos de escola e comece a dar vida a todos eles !!!</div><br>
<a href="2009/03/construindo-um-mmorpg-parte-3.html">» Post Completo...</a><a href="http://diogorbg.blogspot.com/2009/03/construindo-um-mmorpg-parte-3.html#more">Mais informações »</a>Diogo_RBGhttp://www.blogger.com/profile/02121378674070181046noreply@blogger.com10tag:blogger.com,1999:blog-609718605568612758.post-50405645151354433632009-02-20T12:00:00.023-03:002015-04-03T11:50:29.638-03:00Construindo um MMORPG - Parte 2<img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 200px;" src="http://3.bp.blogspot.com/_0qjVkiNs-GQ/SZ4Zrl5ss0I/AAAAAAAAAVc/IXLQIOV5t68/s400/029_ico.png" alt="" id="BLOGGER_PHOTO_ID_5304705647788208962" border="0">É com grande satisfação que escrevo a continuação deste tutorial. Demorou pra sair, mas saiu !<br>E só relembrando, iremos montar nosso MMORPG 2D utilizando o <a href="http://pt.wikipedia.org/wiki/Eathena">servidor eAthena</a> e o <a href="http://themanaworld.org/">cliente TMW</a>.<br><a href="http://diogorbg.blogspot.com/2009/01/construindo-um-mmorpg-parte-1.html">Construindo um MMORPG - Parte 1</a> foi "um tanto" superficial, mas agora o bicho vai pegar.<br>Diria que instalar o servidor eAthena e configurá-lo a gosto é o bicho da goiaba. Mas o basicão tá garantido.<br><br>
<a href="2009/02/construindo-um-mmorpg-parte-2.html">» Post Completo...</a><a href="http://diogorbg.blogspot.com/2009/02/construindo-um-mmorpg-parte-2.html#more">Mais informações »</a>Diogo_RBGhttp://www.blogger.com/profile/02121378674070181046noreply@blogger.com16tag:blogger.com,1999:blog-609718605568612758.post-62365951297648098882009-01-23T16:50:00.004-03:002009-02-16T22:39:50.991-03:00Construindo um MMORPG - Parte 1<img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 180px; height: 180px;" src="http://1.bp.blogspot.com/_0qjVkiNs-GQ/SXnrekhnGkI/AAAAAAAAAUc/mUawXvQx7cY/s400/028_ico.png" alt="" id="BLOGGER_PHOTO_ID_5294521747383982658" border="0" />Você estava jogando (maravilhado) um destes <a href="http://pt.wikipedia.org/wiki/MMORPG">Multi Massive Online Role-Playing Game</a>... MMORPG's da vida e de repente parou para se perguntar: Como será que eles funcionam ?! Como será que se faz um ?!<br />Se você já se fez estas perguntas provavelmente morre de vontade de fazer o seu MMORPG's... e como você já tem muita experiência em jogos deste tipo estava precisando de uma mãozinha no desenvolvimento ! Pois você veio ao lugar certo !!!<br /><br /><a id="link_028" href="javascript:mostrarPost('028');">» Post Completo...</a><span id="post_028" style="display: none;"><b>.:: Caindo na real ::.</b><br />Não encare como um sermão... mas a realidade do desenvolvimento de jogos não é um mundo virtual onde tudo acontece num passe de mágica. Envolve muito estudo e trabalho duro. Mas se você for dedicado com certeza chegará lá. (leitura recomentada: <a href="http://eletronicos.hsw.uol.com.br/fazendo-videogames.htm">Como funciona a criação de videogames</a>)<br /><br />Mas voltando ao assunto anterior... você bolou novas idéias, mais efeitos especiais e mais emoção (mesmo pros momentos mais monótonos). Tudo que faria do seu jogo melhor que o jogo que acabara de jogar ! Afinal o <i>Lag Age</i> era muito bom, mas só no começo. Depois aquele lance de não ter nada pra fazer a não ser bater mais de mil vezes no mesmo monstro (digo literalmente) era entediante.<br /><br />Então, decidido, qual é a primeira coisa que você faz ?<br /><b>a)</b> Estudo muito sobre toda a teoria que envolva jogos e inicio pequenos projetos para que um dia eu possa criar o tão sonhado MMORPG.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_0qjVkiNs-GQ/SXnsMNuNj2I/AAAAAAAAAUk/dhOOIwl-Wxk/s1600-h/028_troll.jpg"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 194px; height: 200px;" src="http://1.bp.blogspot.com/_0qjVkiNs-GQ/SXnsMNuNj2I/AAAAAAAAAUk/dhOOIwl-Wxk/s200/028_troll.jpg" alt="" id="BLOGGER_PHOTO_ID_5294522531536801634" border="0" /></a><b>b)</b> Me torno um roteirista (em menos de uma semana !), crio um cadastro num fórum de desenvolvimento de jogos qualquer e como minha primeira mensagem convoco programadores, desenhistas e demais profissionais para trabalharem (de graça !!!) no meu MMORPG que irá desbancar o <i>Lag Age</i> e todos os demais.<br />Se a opção for <b>b</b>, meu pêsames. Pois uma hora dessas você já deve estar morto e enterrado. Fazer isto não é exatamente um crime, mas isto irá atrair a atenção de dezenas de trolls e estes irão se alimentar de toda a sua auto estima e força de vontade.<br />Então se você quer criar um MMORPG comece pela opção <b>a</b>.<br /><br /><b>.:: Introdução ao MMORPG ::.</b><br />Primeiramente o que significa RPG ?<br />O Role-playing game (jogo de interpretação de Personagens) é um tipo de jogo em que os jogadores assumem os papeis de personagens. Em um jogo de RPG eletrônico, você controla personagens que seguem uma história pré-determinada, aonde seu personagem se desenvolve com o passar do tempo (<a href="http://pt.wikipedia.org/wiki/RPG_%28jogo%29#Jogos_de_RPG_para_computador_e_Video-Game">Wikipedia</a>).<br />Da sua invenção, até os atuais, ele passou por muitas transformações. Uma delas foi a possibilidade de ser jogado por vários jogadores pela Internet, denominando-se MMORPG (Multi Massive Online RPG).<br />RPG's geralmente envolvem uma grande trama no decorrer do jogo. É como um livro que se mergulha cada vez mais fundo a cada página lida. Os MMORPG's também deveriam ser da mesma forma, com a vantagem extra de serem para vários jogadores, mas os valores se perderam no ar.<br />O que eu vejo são: RPG's com trama em primeiro plano e MMORPG's com trama em segundo plano. Seria interessante estudar os MMORPG's através dos RPG's. Afinal de contas, você quer criar um jogo original ou simplesmente um clone alienado por idéia pré-concebidas ?!<br /><br />Não conheço muitos RPG's... mas conheço um que é uma verdadeira obra de arte !<br /><object height="344" width="425"><param name="movie" value="http://www.youtube.com/v/e4NHpEt49xw&hl=pt-br&fs=1&color1=0x234900&color2=0x4e9e00"><param name="allowFullScreen" value="true"><param name="allowscriptaccess" value="always"><embed src="http://www.youtube.com/v/e4NHpEt49xw&hl=pt-br&fs=1&color1=0x234900&color2=0x4e9e00" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"></embed></object><br />Site oficial do do <a href="http://www.miraigamer.net/cavestory/index.php">Cave Story (Doukutsu Monogatari)</a><br /><br />Em relação aos recursos do jogo o MMORPG é uma evolução do RPG. O MMORPG tem tudo que o RPG tem e mais um pouco. Um RPG 2D pode ter mapas formado por várias camadas de tiles, personagens e monstros animados por <a href="http://pt.wikipedia.org/wiki/Sprite_%28gr%C3%A1fico%29">sprites</a>, quests e falas de personagens programadas por scripts, efeitos especiais por uma explosão de partículas e os mesmos cálculos matemáticos para golpes, defesas, habilidades e vulnerabilidades.<br />Tudo isso sugere que se você for programar um MMORPG comece programando um RPG comum.<br /><br /><b>.:: RPG Maker ::.</b><br />Existe uma ferramenta para construção de jogos no estilo RPG ?!<br />Eu diria um sim tímido, pois apesar de ser conhecida ela tem seus defeitos... que podem ser pequenos ou enormes dependendo do seu projeto.<br />Com a ferramenta RPG Maker é possível construir um RPG 2D sem a necessidades de conhecimentos aprofundados sobre programação. Com ela você pode editar mapas e quests através de janelas de diálogo e alguns botões. Além de possuir um grande banco de dados de itens, personagens, tileset's e outros recursos que podem ser utilizados em seu RPG.<br /><br />Veja esta imagem do novo RPG Maker VX:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_0qjVkiNs-GQ/SXsJdwo_lII/AAAAAAAAAUs/pTlnp3d9kW4/s1600-h/028_rpgmakervx.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_0qjVkiNs-GQ/SXsJdwo_lII/AAAAAAAAAUs/pTlnp3d9kW4/s400/028_rpgmakervx.png" alt="" id="BLOGGER_PHOTO_ID_5294836193781847170" border="0" /></a>Como você pode ver, com poucos botões eu criei um mapa e um personagem nele. Você também pode ver a janela do jogo em execução.<br />Mas nem tudo é exatamente como eu gostaria que fosse:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_0qjVkiNs-GQ/SXsKUiNgg9I/AAAAAAAAAU0/A5vynebl6JQ/s1600-h/028_batalha.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 112px;" src="http://4.bp.blogspot.com/_0qjVkiNs-GQ/SXsKUiNgg9I/AAAAAAAAAU0/A5vynebl6JQ/s400/028_batalha.png" alt="" id="BLOGGER_PHOTO_ID_5294837134801273810" border="0" /></a>Não gostei nenhum pouco deste sistema de batalha... é lindo, mas não gostei. Gosto de batalhas abertas no próprio mapa e sem esta estória de ser abduzido !<br /><br />Continuando... o RPG Maker é cheio de limitações e particularidades que tornam o seu jogo, por mais criativo que seja, uma mera cópia barata de um outro jogo qualquer. Sempre fica aquela impressão... "Acho que já vi este antes".<br />Se o RPG Maker ainda existe é por conta de sua comunidade... afinal ele não deixa de ser divertido.<br />O blog é meu e vou meter a porrada no RPG Maker ?! Mais ou menos por aí... mas deixo também uma entrevista que relata uma segunda opnião: <a href="http://www.rpgmakerbrasil.com/artigos/entrevistas/entrevista-com-amanda-fitch-criadora-do-sucesso-aveyond/">Entrevista com Amanda Fitch, criadora do sucesso “Aveyond”</a><br /><object height="344" width="425"><param name="movie" value="http://www.youtube.com/v/EWUvqOBnTm4&hl=pt-br&fs=1&color1=0x234900&color2=0x4e9e00"><param name="allowFullScreen" value="true"><param name="allowscriptaccess" value="always"><embed src="http://www.youtube.com/v/EWUvqOBnTm4&hl=pt-br&fs=1&color1=0x234900&color2=0x4e9e00" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"></embed></object><br /><br />Como eu disse, o RPG Maker foi feito para construir jogos do tipo RPG e não MMORPG's. E mesmo alguns scripts prometendo milagres para transformar um simples jogo RPG em MMORPG, considero uma solução sem muito futuro. Seria preciso de uma ferramenta especialista para isto... logo... só vendo pra crer !!!<br /><br /><b>.:: MMORPG Maker ::.</b><br />Então existe um MMORPG Maker ?! Sim e não !!!<br />Não é exatamente uma ferramenta, mas vária. E também não são conhecidas como MMORPG Maker.<br />Já ouviu falar de um jogo chamado <a href="http://themanaworld.org/">The Mana World</a> ?! Ele se tornou muito popular em meu blog: <a href="http://diogorbg.blogspot.com/2008/07/carregando-mapas-2d-no-formato-tmx.html">Carregando mapas 2D no formato TMX</a>.<br />Ele é um ótimo projeto MMORPG 2D sob licença GPL e pode nos ensinar muita coisa. Através dele eu conheci o editor <a href="http://mapeditor.org/">tiled</a>, para mapas 2D formados por tiles, e também o servidor <a href="http://eathena.deltaanime.net/">eAthena</a> (GPL), que serve como servidor para jogos MMORPG.<br /><br />Jogo The Mana World:<br /><object height="344" width="425"><param name="movie" value="http://www.youtube.com/v/StbqxmSJekY&hl=pt-br&fs=1&color1=0x234900&color2=0x4e9e00"><param name="allowFullScreen" value="true"><param name="allowscriptaccess" value="always"><embed src="http://www.youtube.com/v/StbqxmSJekY&hl=pt-br&fs=1&color1=0x234900&color2=0x4e9e00" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"></embed></object><br /><br />Minha intensão é escrever uma série de tutoriais de como montar um MMORPG utilizando as mesmas ferramentas utilizadas no jogo The Mana World. Segundo esta ordem:<br />» O cliente The Mana World.<br />» O servidor eAthena.<br />» O editor Tiled.<br /><br /><b>.:: O cliente The Mana World ::.</b><br />O Jogo The Mana World se divide basicamente em três partes:<br /><b>» Cliente</b> - Ele é o programa em si. É ele que você deve instalar para jogar online.<br />É o cliente que mostrará tudo que acontece no servidor. Uma batalha é requisitada pelo cliente, mas ela ocorre no servidor. Todos os golpes dados e recebidos são enviados pelo servidor para que o cliente possa exibi-los.<br /><b>» Servidor</b> - Onde você criou sua conta para poder se conectar.<br />O servidor é responsável por todos os cálculos e controles como: quests, posições dos monstros e jogadores, troca de mensagens, e tudo mais que esteja ligado à lógica do jogo.<br /><b>» Updates ou dados</b> - Este é o ponto que nos interessa. O update é nada menos que as imagens dos personagens, monstros, itens, armaduras, tilesets de mapas... todos os recursos que serão utilizados pelo cliente.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_0qjVkiNs-GQ/SXs5DnYvCZI/AAAAAAAAAU8/EJhWdCXg2So/s1600-h/028_tmw_cs.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 229px;" src="http://3.bp.blogspot.com/_0qjVkiNs-GQ/SXs5DnYvCZI/AAAAAAAAAU8/EJhWdCXg2So/s400/028_tmw_cs.png" alt="" id="BLOGGER_PHOTO_ID_5294888521179269522" border="0" /></a>O bom é que os dados do update são baixados pelo próprio cliente TMW e são relativos ao servidor ao qual você se conectou. O cliente TMW é um verdadeiro fliperama MMORPG... você pode se conectar a qualquer servidor (eAthena), baixar os dados deste servidor e jogar à vontade ! Cada servidor terá suas particularidades e também seu próprio cliente derivado do cliente TMW, mas no geral isso funciona !<br />Ele organiza os uptades de cada servidor em diretórios separados dentro do diretório <b>/home/nome_usuário/.tmw/updates/</b>. Esta organização já funciona à partir da versão 0.0.26.<br /><br />O update do servidor original fica no diretório <b>/home/nome_usuário/.tmw/updates/updates.themanaworld.org/</b>, nele você irá encontrar vários arquivos compactados e também o arquivo <b>resources2.txt</b>. Os arquivos compactados são as várias atualizações disponibilizadas pelo servidor do The Mana World, mas nem todos os arquivos podem ser atualizações "atuais". Quem manda é o arquivo resources2.txt. É ele que diz quais os arquivos deverão ser extraídos e também a ordem que eles deverão ser extraídos.<br /><p class="bloco_cod">sounds-3795.zip 890b723c<br />ambient-3795.zip 2942034a<br />tiles-3961.zip 5d9b6141<br />update-3998-4056.zip bc599f23<br />sprites-4235.zip 7d8a966c<br />update-4235-4319.zip 52b261c0<br />update-4319-4411.zip 7f87b88<br />particles-4412-4604.zip df32f8ed<br />update-4412-4604.zip d2078869<br />update-4604-4625.zip f7e1230e<br />update-4665-4696.zip f96a6c39<br />update-4732-4789.zip deec551<br />update-4789-4802.zip 8253631<br />update-4846-4957.zip e06f0358<br />update-4957-4963.zip cbc40a88<br />update-92f5898-5e3b3ca.zip c5a98a9e<br />database-5e3b3ca.zip f1380cc0<br />update-5e3b3ca..03da427.zip 218a7faf<br />update-03da427..54e6da8.zip 3ff4fcfb<br />items-54e6da8.zip e0512e95<br />update-54e6da8..b5a9d98.zip 8f561d9a<br />update-b5a9d98..589d43c.zip 2219df21<br />update-589d43c..90f54d3.zip 8a53af60<br />update-90f54d3..a915928.zip c6b49f79<br />update-a915928..3108eb8.zip 2a7577a9<br />update-3108eb8..82f97c6.zip 91a8f8f7</p>Para extrair use o comando: <b>unzip -ao sounds-3795.zip</b>. Repita para todos os arquivos e na mesma ordem em que se encontram no arquivo resources2.txt.<br />O cliente TMW não precisa dos arquivos extraídos, ele pode fazer isto virtualmente utilizando a lib <span style="text-decoration: line-through;">libcurl</span> <a href="http://icculus.org/physfs/">PhysicsFS</a>. Mas ele também irá procurar por arquivos extraídos, caso não os encontre nos arquivos compactados.<br /><br />Experimente baixar e jogar The Mana World agora mesmo, pois no próximo artigo precisaremos dele.<br />Para o próximo artigo precisaremos da versão 0.0.26, mas se você puder instalar a versão 0.0.27 melhor ainda ! Pois a versão 0.0.27 possui efeitos especiais extras.<br /><br /><b>.:: Link's ::.</b><br /><a href="http://eletronicos.hsw.uol.com.br/fazendo-videogames.htm">» Como funciona a criação de videogames</a><br /><a href="http://www.miraigamer.net/cavestory/index.php">» Cave Story (Doukutsu Monogatari)</a><br /></span>Diogo_RBGhttp://www.blogger.com/profile/02121378674070181046noreply@blogger.com14tag:blogger.com,1999:blog-609718605568612758.post-85190654711905047502009-01-22T15:48:00.014-03:002009-01-22T23:02:34.159-03:00[off-topic] Meme AleatoriedadesInicio este ano com o Meme Aleatoriedades. O qual <a href="http://vinigodoy.wordpress.com/">Vinícius Godoy</a> me intimou a participar.<br />Minha ultima postagem foi em dezembro e antes desta foi em julho (seis meses atrás). Mas este ano pretendo aquecer as coisas por aqui. Inclusive já iniciei um trabalho sobre MMORPG's.<br /><br /><a id="link_027" href="javascript:mostrarPost('027');">» Post Completo...</a><span id="post_027" style="display:none;"><b>.:: Regras ::.</b><br />1. Linkar a pessoa que te indicou.<br />2. Escrever as regras do meme em seu blog.<br />3. Contar 6 coisas aleatórias sobre você.<br />4. Indique mais 6 pessoas e coloque os links no final do post.<br />5. Deixe a pessoa saber que você o indicou, deixando um comentário para ela.<br />6. Deixe os indicados saberem quando você publicar seu post.<br /><br /><b>.:: Aleatoriedades ::.</b><br /><b>1.</b> Minha cor preferida sempre foi verde cana. Inclusive nem digo verde, mas sim VÊÊÊRDE !!!<br />Gosto de verde dês de criança e hoje gosto mais ainda porque acho que verde é a cor da computação.<br />Uso verde onde posso. O blog é verde, meu papel de parede é um gramado verde e meu carro (num futuro não muito distante) também será verde !!!<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_0qjVkiNs-GQ/SXjEsnW4mVI/AAAAAAAAATQ/sFtVEuG94MM/s1600-h/027_crossfox.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 215px;" src="http://1.bp.blogspot.com/_0qjVkiNs-GQ/SXjEsnW4mVI/AAAAAAAAATQ/sFtVEuG94MM/s400/027_crossfox.png" alt="" id="BLOGGER_PHOTO_ID_5294197632732272978" border="0" /></a><div align="center">Nada mal !!!</div><br /><b>2.</b> Se tem um filme que idolatro é o Matrix. Gosto de todos eles. Principalmente o terceiro que terminou de forma incrível.<br /><br />Último diálogo entre o Oráculo e o Arquiteto:<br /><p class="bloco_cod">ARQUITETO: Você arriscou demais.<br />ORÁCULO: A mudança sempre é.<br />ARQUITETO: Por quanto tempo acha que essa paz vai durar?<br />ORÁCULO: O quanto for possível. ... E quanto aos outros?<br />ARQUITETO: Que outros?<br />ORÁCULO: Os que quiserem sair.<br />ARQUITETO: Obviamente serão libertados.<br />ORÁCULO: Tenho sua palavra?<br />ARQUITETO: O que acha que eu sou? Humano?</p>Eu sempre esperei pelo dia em que o homem daria fim à trégua e também ao domínio da máquina, mas ficou só na expectativa.<br /><br /><b>3.</b> Eu tenho uma importante teoria que diz: <i>A bola é redonda.</i><br />Não estou brincando... eu inclusive posso provar isto !<br />É que minhas outras habilidades incluem sinuca. E quando estou ensinando alguém a jogar eu logo digo: A bola é redonda.<br />Ao dizer isto estou explicando que não se deve jogar o bolão diretamente no ponto marcado, mas sim em um ângulo mais aberto. O Bolão é redondo e possui raio. O que é diferente de jogar com uma partícula.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_0qjVkiNs-GQ/SXjVZ4YKnvI/AAAAAAAAAUE/GMyr5YvHLXk/s1600-h/027_sinuca.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 140px;" src="http://4.bp.blogspot.com/_0qjVkiNs-GQ/SXjVZ4YKnvI/AAAAAAAAAUE/GMyr5YvHLXk/s400/027_sinuca.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5294216002581208818"/></a><br />Esta mesma teoria foi válida quando tentei aplicar a física de partículas do 2º grau em um jogo de sinuca... não deu certo. Esferas são bem diferentes de partículas.<br /><br /><b>4.</b> Se eu não falasse que não gosto de bebida e fumo poderia parecer que gostasse. Sendo que na verdade eu detesto.<br />Na boa... sala com ar condicionado (não ventilada) e cigarro não combinam.<br /><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://lh4.ggpht.com/_0qjVkiNs-GQ/SXjHiwqIWMI/AAAAAAAAATw/aO0edrs56GA/027_cigarro_cancer.gif" border="0"/><div align="center">Instalando Cancer !!!</div><br /><b>5.</b> Se eu tenho um vício, são os jogos. Mas não é nada grave... é sadio e moderado. Nunca briguei nem apostei nada em jogos. Gosto deles pelo simples prazer do desafio.<br />E não são apenas os jogos eletrônicos, mas de todos os tipos: Damas, xadrez, sinuca, ping pong, futebol, palavras cruzadas, quebra-cabeças... qualquer coisa que não envolva apenas sorte.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_0qjVkiNs-GQ/SXjLU42fjbI/AAAAAAAAAT8/HsJJM1IHXWg/s1600-h/027_war.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 267px;" src="http://1.bp.blogspot.com/_0qjVkiNs-GQ/SXjLU42fjbI/AAAAAAAAAT8/HsJJM1IHXWg/s400/027_war.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5294204921692786098"/></a><div align="center">War é jogado com dados, mas a sorte só ajuda jogadores experientes.</div><br /><b>6.</b> E no fds (final de semana) nada melhor como o contato com a natureza pra quebrar a rotina da cidade e da tecnologia excessiva.<br />Percorrer longas distâncias em trilhas que cortam o cerrado ou mata, seja à pé ou de bicicleta, me renovam.<br />Em Palmas, um lugar que sempre gostei de visitar foi o parque Cesamar. Ele possui uma pista de 2km em torno de um lago que é ótimo para caminhar. E você ainda topa com animais por todo o caminho... só não é bom topar com cobras !<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_0qjVkiNs-GQ/SXjYBLWxhXI/AAAAAAAAAUM/Zz0e1NgjAoE/s1600-h/027_cesamar.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_0qjVkiNs-GQ/SXjYBLWxhXI/AAAAAAAAAUM/Zz0e1NgjAoE/s400/027_cesamar.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5294218876713796978"/></a><div align="center"><a href="http://www.panoramio.com/photo/3629247">Link para mais fotos</a></div><br />Para continuar a Meme eu convido <a href="http://renedet.blogspot.com/">Renê</a>, <a href="http://www.alma.tolivre.org/">Rômulo</a> e <a href="http://erickgoes.blogspot.com/">Erick</a>.<br />A lista poderia ser maior... talvez eu a aumente depois !<br /><br />--<br />Esperem pelo próximo post... é sobre MMORPG !</span>Diogo_RBGhttp://www.blogger.com/profile/02121378674070181046noreply@blogger.com1tag:blogger.com,1999:blog-609718605568612758.post-10845719533896032008-09-27T20:26:00.014-03:002008-12-22T12:56:02.492-03:00Trabalho apresentado na II SACC<img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_0qjVkiNs-GQ/SN7FSs9kleI/AAAAAAAAANw/EiJ1sw0iFdM/s400/026_ico.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5250851140658304482"/>Venho desenvolvendo meu trabalho de conclusão de curso na área de inteligência artificial faz um bom tempo e no dia 26/09 tive o prazer de apresentá-lo na II Semana Acadêmica de Ciência da Computação da UFT.<br />Trabalhei dobrado para que no dia pudesse apresentar meu Jogo de Damas com todas as funcionalidades possíveis e até consegui implementar muita coisa, mas mostrar o jogo funcionando com o algoritmo minimax, que seria uma das coisas mais importantes, não foi possível.<br />Segue abaixo, explicações mais detalhadas sobre meu trabalho.<br /><br /><a id="link_026" href="javascript:mostrarPost('026');">» Post Completo...</a><span id="post_026" style="display:none;"><b>.:: Trabalho de conclusão de curso ::.</b><br />Estou concluindo o curso de Ciência da Computação da UFT e como monografia resolvi desenvolver algo de meu total interesse e que trouxesse um grau de dificuldade. Não posso reclamar do grau de dificuldade de desenvolver um <a href="http://pt.wikipedia.org/wiki/Damas">Jogo de Damas</a> e nem da possibilidade de aplicar os conhecimentos adquiridos em outros problemas similares como o <a href="http://pt.wikipedia.org/wiki/Xadrez">xadrez</a>, <a href="http://pt.wikipedia.org/wiki/Go">go</a> e num futuro não tão distante o <a href="http://pt.wikipedia.org/wiki/RoboCup">futebol de robôs</a>.<br />O trabalho, com o título SOLUÇÕES HEURÍSTICAS PARA O JOGO DE DAMAS, está sendo desenvolvido juntamente com meu professor orientador Alexandre Tadeu Rossini da Silva. E de uma maneira geral, conta com duas soluções desenvolvidas para o problema do Jogo de Damas, sendo elas, <a href="http://pt.wikipedia.org/wiki/Algoritmo_gen%C3%A9tico">algoritmo genético</a> e <a href="http://pt.wikipedia.org/wiki/Minimax">minimax</a> com <a href="http://en.wikipedia.org/wiki/Alpha-beta_pruning">corte alfa beta</a>.<br />O trabalho encontra-se em desenvolvimento e apesar dos estudos nas duas soluções, ainda não foi implementado a solução por minimax e corte alfa beta.<br /><br /><b>.:: Implementação por algoritmo genético ::.</b><br />Como alternativa para solucionar o problema do Jogo de Damas, foi proposto utilizar algoritmo genético.<br />O resultado foi um tanto frustrado, pois desenvolver esta solução custou muito tempo no desenvolvimento e implementação, e não teve o retorno esperado.<br />Esperava-se mais pelo esforço aplicado, mesmo assim, estrou satisfeito de ter obtido resultados ciente das falhas no desenvolvimento.<br /><br /><b>.:: Implementação por minimax e corte alfa beta ::.</b><br />Esta sim é uma solução de eficácia comprovada para o problema do Jogo de Damas. Onde pode-se fazer a melhor jogada, num dado nível de busca, sem temer as conseqüências.<br />Esta teria sido a primeira opção, caso o objetivo do trabalho não fosse buscar novos horizontes.<br />Eu tinha esperanças de implementar o minimax ainda este mês, mas andei trabalhando em outras coisas como a nova interface gráfica e os slides para a apresentação na Semana Acadêmica.<br /><br /><b>.:: Implementação da Lógica ::.</b><br />Quando digo lógica estou me referindo às regras do jogo.<br />Para trabalhar os estados do tabuleiro eu numerei as 32 casas ocupáveis do tabuleiro, assim como atribuí id's para cada tipo de peça:<br />- ⇒ Espaço não ocupado<br />p ⇒ Peça do jogador branco<br />d ⇒ Dama do jogador branco<br />P ⇒ Peça do jogador preto<br />D ⇒ Dama do jogador preto<br /># ⇒ Peça capturada (função de impedir a recaptura da mesma peça)<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_0qjVkiNs-GQ/SN7GFabyPuI/AAAAAAAAAOA/PCW492wmPNg/s1600-h/026_tabuleiro.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_0qjVkiNs-GQ/SN7GFabyPuI/AAAAAAAAAOA/PCW492wmPNg/s400/026_tabuleiro.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5250852011858083554" /></a><u>Vetor de casas ocupáveis: PPPPPPPPPPPP--------pppppppppppp</u><br /><br />Para referenciar um movimento basta indicar as casas numeradas:<br />» 22-18 Para abrir o jogo com as brancas.<br />» 9-13 Poderia ser a próxima jogada das pretas.<br />» 13-22-15 Poderia uma tomada em seqüência das pretas caso o movimento 21-17 fosse feito.<br />O jogo ficaria: 1.22-18 9-13 2.21-17 13-22-15<br /><br />Através da função execMov(Peca peca) é possível validar e executar um movimento de cada vez:<br />» execMov(22) Seleção da peça na casa 22 válida.<br />» execMov(18) Movimento da peça da casa 22 para a casa 18 válida.<br /><br />Outra coisa seria trabalhar o tabuleiro como uma máquina de estados:<br />» JOGO - Ativo para jogar.<br />» EM_JOGO - Deve continuar jogando.<br />» COMPLETO - O movimento foi válido e é a vez do oponente.<br />» VITORIA - O Jogador atual venceu a partida.<br />» EMPATE - Os jogadores empataram.<br />» DERROTA - O Jogador atual perdeu a partida.<br /><br />Com controle de jogador, estados e tudo mais:<br /><p class="bloco_cod">» novoJogo(); // estado=JOGO jogador=BRANCAS selecao=0<br />» execMov(22); // estado=JOGO jogador=BRANCAS selecao=22<br />» execMov(18); // estado=COMPLETO jogador=BRANCAS selecao=18<br />» finalizarTurno(); // estado=JOGO jogador=PRETAS selecao=0<br />» execMov(9); // estado=JOGO jogador=PRETAS selecao=9<br />» execMov(13); // estado=COMPLETO jogador=PRETAS selecao=13<br />» ...<br />» execMov(13); // estado=JOGO jogador=PRETAS selecao=13<br />» execMov(22); // estado=EM_JOGO jogador=PRETAS selecao=22<br />» execMov(15); // estado=COMPLETO jogador=PRETAS selecao=15</p><br /><b>.:: Interface gráfica ::.</b><br />A interface gráfica também tem grande destaque neste trabalho.<br />Para um trabalho acadêmico, a interface gráfica é o quenos importa, mas fica mais agradável trabalhar com uma. Um jogo bonito e inteligente tem que valer créditos extras !!!<br />Veja a evolução da interface gráfica do jogo:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_0qjVkiNs-GQ/SN7G2XJT2lI/AAAAAAAAAOI/Qb8Oi8kgcWI/s1600-h/026_evolucao.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_0qjVkiNs-GQ/SN7G2XJT2lI/AAAAAAAAAOI/Qb8Oi8kgcWI/s400/026_evolucao.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5250852852788877906" /></a><u>A previsão é ter componentes gráficos e várias opções de configuração.</u><br /><br />A interface foi feita utilizando os programas Inkscape e GIMP. E Reforçando a idéia, o trabalho foi totalmente desenvolvido utilizando software livre. Ubuntu, Inkscape, GIMP, Geany, Makefile, GCC e SDL.<br /><br /><b>.:: Link's ::. </b><br />Estão disponíveis para download: Os slides, o meu Jogo de Damas e um outro desenvolvido por alunos da UFRJ.<br /><br />Download: <a href="http://diogorbg.googlepages.com/026_heuristica_damas.pdf">» Heurística Damas (946 kB)</a><br />Download: <a href="http://diogorbg.googlepages.com/026_damas_0.3Alpha4.zip">» Damas 0.3 alpha4 (747 kB)</a><br />Download: <a href="http://diogorbg.googlepages.com/026_damas_UFRJ.zip">» Damas UFRJ (1 MB)</a><br /><br /><a href="http://idgnow.uol.com.br/mercado/2007/07/19/idgnoticia.2007-07-19.6428314860/">» Solução ideal para o jogo de damas</a><br /><a href="http://blog.vettalabs.com/2008/05/16/sobre-futebol-e-robos/">» Sobre futebol e robôs</a><br /><br /><a href="http://pt.wikipedia.org/wiki/Damas">» Jogo de Damas</a><br /><a href="http://pt.wikipedia.org/wiki/Xadrez">» Xadrez</a><br /><a href="http://pt.wikipedia.org/wiki/Go">» Go</a><br /><a href="http://pt.wikipedia.org/wiki/RoboCup">» Futebol de robôs</a><br /><a href="http://pt.wikipedia.org/wiki/Algoritmo_gen%C3%A9tico">» Algoritmo genético</a><br /><a href="http://pt.wikipedia.org/wiki/Minimax">» Minimax</a><br /><a href="http://en.wikipedia.org/wiki/Alpha-beta_pruning">» Corte alfa beta</a></span>Diogo_RBGhttp://www.blogger.com/profile/02121378674070181046noreply@blogger.com1tag:blogger.com,1999:blog-609718605568612758.post-82293759676018683332008-07-21T22:00:00.005-03:002008-07-22T14:31:24.705-03:00Carregando mapas 2D no formato TMX<img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_0qjVkiNs-GQ/SIS0ugDBLcI/AAAAAAAAAK4/sOd0YN1TljM/s400/025_ico.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5225500178626194882"/>Em um artigo anterior (<a href="http://diogorbg.blogspot.com/2007/12/gerando-e-carregando-mapas-2d-em-jogos.html">Gerando e carregando mapas 2D em jogos</a>) construí um formato próprio e também um analisador para trabalhar com mapas 2D. Foi interessante, porém limitado !<br />Neste artigo irei além. Vou compartilhar resultados e experiências que tive utilizando um editor de tiles chamado <a href="http://mapeditor.org/">tiled</a>.<br />Ao que tudo indica, o editor tiled e seu formato TMX de arquivos, são a melhor solução para a criação de mapas. Solução utilizada pelo jogo <a href="http://themanaworld.org/">The Mana World</a>.<br /><br /><a id="link_025" href="javascript:mostrarPost('025');">» Post Completo...</a><span id="post_025" style="display:none;"><b>.:: The Mana World ::.</b><br />Primeiro gostaria de fazer uma pergunta: <b>Você conhece o jogo The Mana World ?</b><br />The Mana World é um jogo de RPG online bem parecido com o Ragnarok, e também um dos projetos mais ativos do SouceForge na área de jogos (<a href="http://sourceforge.net/projects/themanaworld">The Mana World</a>). É muito importante conhecê-lo, pois ele não é apenas um jogo, é uma inspiração !<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_0qjVkiNs-GQ/SIS3meo0iHI/AAAAAAAAAL4/TnPU2PygVfA/s1600-h/025_tmw1.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_0qjVkiNs-GQ/SIS3meo0iHI/AAAAAAAAAL4/TnPU2PygVfA/s320/025_tmw1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5225503339343808626" /></a>Na imagem você vai encontrar o meu personagem Scanner (lvl 49) atacando um escorpião... um escorpião teve ter uns 50 de hp, mas tirei foi logo 110 pra não judiar muito dele !<br /><br />Nesta outra imagem quero mostrar, não só meu lvl e meus 5KGP, mas também efeitos e defeitos especiais.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_0qjVkiNs-GQ/SIS3HlKwGTI/AAAAAAAAALw/1Dd5YFRvzzE/s1600-h/025_tmw2.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_0qjVkiNs-GQ/SIS3HlKwGTI/AAAAAAAAALw/1Dd5YFRvzzE/s320/025_tmw2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5225502808520792370" /></a><b>» 1. Efeito especial de grama alta</b>. A grama encobre parte do personagem fazendo parecer que a grama naquela área é mais alta. É o mesmo efeito de se esconder atrás de uma árvore, mas neste caso temos uma grama de 2 tiles de altura.<br /><b>» 2. Defeito especial de objeto editado como piso</b>. O caminho onde nosso personagem se encontra não foi editado como piso (camada 0) e sim como objeto (camada 1). Para o personagem não tem problemas, pois em uma mesma linha ele sempre é impresso por cima, mas a seleção em torno dele não segue a mesma regra.<br /><b>Conclusão</b>: O caminho parece ter volume... o que não é muito lógico.<br /><b>Solução</b>: Mesclar os tiles grama+caminhos e definí-los como piso (camada 0). Em run time ficaria legal !<br /><br />Tudo no jogo é muito bonito e detalhado... mas está vendo algo de estranho na disposição das árvores ?!<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_0qjVkiNs-GQ/SIS5G7_pOlI/AAAAAAAAAMI/NItsipOAI-k/s1600-h/025_tmw3.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_0qjVkiNs-GQ/SIS5G7_pOlI/AAAAAAAAAMI/NItsipOAI-k/s320/025_tmw3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5225504996491606610" /></a><b>» 1. Efeito especial de se esconder atrás de um relevo</b>. Impressão visual e física de uma elevação.<br /><b>» 2. Defeito especial na disposição das árvores para evitar um defeito visível</b>. A copa de nenhuma das árvores invade o lado mais baixo do relevo. Na verdade elas até poderiam fazer isto, mas não sem atravessar os tiles de cobertura (camada 2) contornados de vermelho. Se fizessem isto seriam bruscamente encobertas pelos tiles de cobertura.<br /><b>Conclusão</b>: Todas as árvores ficam a uma distância de 3 tiles da extremidade superior da elevação.<br /><b>Solução</b>: Mais mesclagens... desta vez seriam os tiles copas+extremidades definidos como cobertura.<br /><br />The Mana World ainda pode melhorar, mas ele já é bem legal !!!<br />Quem quiser umas dicas de como chegar no lvl 50 sem muitos traumas é só me procurar no jogo... tarefa nada fácil !<br /><br /><b>:: Tiled e o formato TMX ::.</b><br /><a href="http://mapeditor.org/">Tiled</a> é um editor genérico de mapas de tiles que roda em java. Ele é muito interessante pois edita várias camadas de tiles e salva tudo em um xml (base64 e compactado). Ele segue um padrão que pode ser facilmente adotado por outros jogos... padrão que foi utilizado no jogo The Mana World !<br /><br />Exemplo de mapa utilizado no jogo The Mana World editado pelo tiled:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_0qjVkiNs-GQ/SIUWf3LZKkI/AAAAAAAAAMQ/268CAZxJH9E/s1600-h/025_tiled.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_0qjVkiNs-GQ/SIUWf3LZKkI/AAAAAAAAAMQ/268CAZxJH9E/s320/025_tiled.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5225607679276821058" /></a>Neste mapa temos 4 camadas definidas:<br /><b>» Layer3</b>: Camada de colisão. (A exibição foi desabilitada)<br /><b>» Layer2</b>: Camada de cobertura. Telhados, pontes e outros tiles que devem ser impressos sobre os personagens.<br /><b>» Layer1</b>: Camada de objetos. Árvores, pedras e qualquer coisa sobre o piso.<br /><b>» Layer0</b>: Camada de piso. Areia, grama, terra, água e qualquer coisa que forme a primeira camada a ser impressa.<br /><br />Você poderá encontrar um tutorial de edição de mapas no wiki do The Mana World (<a href="http://wiki.themanaworld.org/index.php/Mapping_Tutorial">Mapping Tutorial</a>).<br /><br />O editor pode ser bom, mas se o formato de arquivo for fechado, complexo ou ineficiente e limitado de nada adiantaria.<br />TMX é um formato baseado em <a href="http://pt.wikipedia.org/wiki/XML">XML</a>. Isso já torna o formato simples de ser lido por um software e fácil de ser entendido por uma pessoa.<br />Também pelo fato de ser XML podemos adicionar novas funcionalidades... até mesmo manualmente.<br /><br />Veja a simplicidade de um arquivo TMX:<br /><p class="bloco_cod"><?xml version="1.0" ?><br /><map orientation="orthogonal" width="32" height="32" tilewidth="24" tileheight="24"><br /> <tileset firstgid="1" name="Sewers" tilewidth="24" tileheight="24"><br /> <image source="tiledweb/files/tiles_pipes.png"/><br /> </tileset><br /> <layer name="Layer 0"><br /> <data encoding="base64" compression="gzip"><br /> H4sIAAAAAAAAAO3NoREAMAgEsLedAfafE4+s6l0jolNJiif18tt/Fj8AAMC9ARtYg28AEAAA<br /> </data><br /> </layer><br /></map></p><b>» Mapa</b>: O mapa possui informações gerais como largura e altura do mapa e de um tile. Ele é composto de tileset's e layer's.<br /><br /><b>» Tileset</b>: Para melhor utilização de memória, cada mapa tem sua lista de Tilesets (tabela de tiles).<br />Cada Tileset possui uma imagem e informações sobre como tratá-la como sendo uma tabela de tiles, como largura e altura de cada tile e também id do primeiro tile da tabela.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_0qjVkiNs-GQ/SIUXfix2TaI/AAAAAAAAAMY/IGIn2GkJsqs/s1600-h/025_tileset.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_0qjVkiNs-GQ/SIUXfix2TaI/AAAAAAAAAMY/IGIn2GkJsqs/s400/025_tileset.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5225608773312597410" /></a>A quantidade de tilesets é limitada apenas pela quantidade de memória alocada pelas imagens. Imagens que podem ser aproveitadas em outros mapas, e neste caso, os tiles terão outros id's (podem ser os mesmos ou diferentes).<br /><br /><b>» Layer</b>: Para possibilitar maior nível de detalhes (sobreposição de tiles) e até mesmo abstração física (camadas para piso, objetos e cobertura) um mapa é formado por várias camadas. Ela possui a disposição dos tiles para montagem do mapa.<br />Layer possui uma tag chamada <b>data</b>, onde se encontram os dados dos respectivos tiles, que é codificada em <a href="http://pt.wikipedia.org/wiki/Base64">base64</a> e opcionalmente pode ser compactada pela <a href="http://pt.wikipedia.org/wiki/Zlib">zlib</a>.<br />A quantidade de layers é limitada pela lógica do seu jogo. Você pode utilizar as camadas de diversas formas:<br />» 1 pra piso, 1 pra objetos, 1 pra cobertura, 1 pra colisão.<br />Ou prezar mais pela edição e aumentar o número de camadas:<br />» 2 pra piso, 2 pra objetos, 2 pra cobertura e 1 pra colisão.<br />Ou ainda usar as duas formas ao mesmo tempo... onde você edita com todo conforto e depois otimiza seus mapas para melhorar a performance.<br /><br /><b>.:: Carregando um arquivo TMX ::.</b><br />Como o formato é baseado em XML basta usar um parser pra XML. E para fazer isto temos diversas opções como: <a href="http://xmlsoft.org/html/index.html">libxml</a> (<a href="http://diogorbg.blogspot.com/2007/11/simpatizando-com-libxml2.html">Simpatizando com a Libxml2</a>), <a href="http://rapidxml.sourceforge.net/">RapidXml</a> e também a <a href="http://www.grinninglizard.com/tinyxmldocs/index.html">tinyXML</a>. Não se esqueça da <a href="http://www.zlib.net/manual.html">zlib</a> para descompactar as camadas.<br />Você também pode aproveitar algumas linhas de código do projeto <a href="http://sourceforge.net/projects/themanaworld">The Mana World</a> ou ainda usar a <b>minha biblioteca</b>.<br /><br />Utilizar a minha biblioteca é muito fácil:<br /><p class="bloco_cod"><br />int main(){<br /> ...<br /> try{<br /> App::setDir("arquivos/");<br /> if( !mapa.carregarXML("mapa.tmx") )<br /> printf("Erro ao carregar arquivo 'mapa.tmx'.\n");<br /> }catch(Mapa::Exception e){<br /> printf("Arquivo 'mapa.tmx' nao existe.\n");<br /> }<br /> ...<br />}<br /><br />void paint(){<br /> int i,j;<br /> SDL_Rect xy;<br /> Mapa::Tile tile;<br /><br /> // Imprimindo piso. (Procedimento comum)<br /> for(j=0; j>mapa.getH(); j++){<br /> for(i=0; i>mapa.getW(); i++){<br /> mapa.getTile(&tile, i, j, 0);<br /> xy.x = i*mapa.getTileW() + tile.x;<br /> xy.y = j*mapa.getTileH() + tile.y;<br /> SDL_BlitSurface(tile.img, &tile.ret, screen, &xy);<br /> }<br /> }<br /> ...<br />}</p>Este é um exemplo resumido de como utilizar minha biblioteca para carregar mapas TMX. Um exemplo mais completo está disponível no link para download.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_0qjVkiNs-GQ/SIUuw-zRQVI/AAAAAAAAAMg/zzJIf-oM6Us/s1600-h/025_screen.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_0qjVkiNs-GQ/SIUuw-zRQVI/AAAAAAAAAMg/zzJIf-oM6Us/s320/025_screen.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5225634361659965778" /></a>Este smiley você já conhece, mas o cenário é novo !!!<br /><br />Na pasta <b>html/</b> você encontrará a documentação. Documentação das classes Mapa, App, Frame e Timer.<br />Para conclusão do trabalho aproveitei algumas linhas do projeto <a href="http://themanaworld.svn.sourceforge.net/viewvc/themanaworld/tmw/branches/0.0/tools/tmxcopy/">tmxcopy</a> e também do projeto <a href="http://themanaworld.org/">The Mana World</a>. Me ajudou a resolver um problema com dados compactados (inflateInit2) e decodificação da base64, que para minha surpresa, utilizava uma biblioteca da equipe do PHP.<br /><br /><b>.:: Link's ::. </b><br />Download: <a href="http://diogorbg.googlepages.com/025_cod_tmx.zip">» código fonte</a><br /><a href="http://mapeditor.org/">» Tiled, a generic tile map editor</a><br /><a href="http://themanaworld.org/">» The Mana World</a><br /><br />---<br />Foram duas semanas trabalhosas para mim... mas com grande satisfação consegui finalizar meu projeto.<br />Este artigo com certeza foi o mais complexo... e valeu por todo período de férias !!!</span>Diogo_RBGhttp://www.blogger.com/profile/02121378674070181046noreply@blogger.com3tag:blogger.com,1999:blog-609718605568612758.post-65714173367230679522008-07-07T17:25:00.004-03:002008-07-07T17:58:23.547-03:00Ajude a Wikipédia e concorra a um Eee PC!<a href="http://br-linux.org/"><img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_0qjVkiNs-GQ/SHJ9v-XabgI/AAAAAAAAAKw/wUOKUq61Fco/s400/024_brlinux.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5220373181224349186" /></a><b>Ajude a sustentar a Wikipédia e outros projetos, sem colocar a mão no bolso, e concorra a um Eee PC!</b><br />…e também a pen drives, card drives, camisetas geeks, livros e mais! O <a href=http://br-linux.org/>BR-Linux</a> e o <a href=http://efetividade.net/>Efetividade</a> lançaram uma <a href=http://br-linux.org/2008/campanha-wikipedia/>campanha</a> para ajudar a Wikimedia Foundation e outros mantenedores de projetos que usamos no dia-a-dia on-line. Se você puder doar diretamente, ou contribuir de outra forma, são sempre melhores opções. Mas se não puder, veja as regras da promoção e <a href=http://br-linux.org/2008/campanha-wikipedia/>participe</a> - quanto mais divulgação, maior será a doação do BR-Linux e do Efetividade, e você ainda concorre a diversos brindes!<br /><br />Como o texto da promoção sugere, você pode participar ou ajudar de muitas formas. Ajudar a Wikipédia diretamente com doações e contribuições ou simplesmente ajudar a divulgar a campanha.<br /><br />---<br />É claro que não deixaria de participar desta promoção... e você ? já tá participando ?!<br />Em breve terei um artigo original, como mencionado por Augusto Campos no BR-Linux, e será muito interessante (pra felicidade de todos !).Diogo_RBGhttp://www.blogger.com/profile/02121378674070181046noreply@blogger.com0tag:blogger.com,1999:blog-609718605568612758.post-44381181345156974812008-06-23T11:20:00.004-03:002008-06-23T12:22:20.394-03:00Controle de tempo e Frame Rate<img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_0qjVkiNs-GQ/SF-wlvCwCHI/AAAAAAAAAKo/9ckCYyz1nyc/s400/023_ico.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5215081055847975026" />Uma das primeiras preocupações quando se vai trabalhar em um jogo é com a taxa de FPS. (Frames per second ou Frame Rate)<br />Não há segredo algum em limitar a taxa de FPS, e isto pode ser feito facilmente caso seja o desejado.<br /><br /><a id="link_023" href="javascript:mostrarPost('023');">» Post Completo...</a><span id="post_023" style="display:none;"><b>.:: Limitar ou não ::.</b><br />Limitar a taxa de frames pode servir apenas para não desgastar o processador.<br />É claro que pode servir para sincronizar o tempo no jogo, mas isso não pode influenciar na jogabilidade. Digo que você pode querer usar os frames para controlar a animação e os estados do jogo e que pode até funcionar se seu jogo for bem simples.<br />Uma implementação por frames trás resultados negativos em algumas ocasiões:<br />» Quando o PC é muito lento e não consegue processar a quantidade de frames que você previa. O jogador não perde nenhum detalhe da animação, mas o jogo fica lento.<br />» Tudo no seu jogo será medido em frames e você terá dificuldades em aumentar ou diminuir o frame rate.<br />» Em algumas ocasiões um só frame não será suficiente e você terá que contá-los. Acredite, nesta ocasião o controle por tempo ganha em disparado de incrementos por interação.<br /><br /><b>.:: Frame Rate em SDL ::.</b><br />Em SDL usamos a função <a href="http://docs.mandragor.org/files/Common_libs_documentation/SDL/SDL_Documentation_project_en/sdlgetticks.html">SDL_GetTicks()</a> para saber quantos milissegundos se passaram. SDL_GetTicks() começa a contar assim que a SDL é inicializada. Você só não pode esquecer de inicializar a SDL passando SDL_INIT_TIMER para <a href="http://docs.mandragor.org/files/Common_libs_documentation/SDL/SDL_Documentation_project_en/sdlinit.html">SDL_Init()</a>.<br />Para limitar a taxa de frames eu só preciso saber o tempo antes (t1) e depois (t2) da execução da lógica do jogo e logo depois esperar o restante do tempo com <a href="http://docs.mandragor.org/files/Common_libs_documentation/SDL/SDL_Documentation_project_en/sdldelay.html">SDL_Delay()</a>.<br /><p class="bloco_cod">int t1,t2, delay;<br />delay = 25; //- 1000/25 = 40 FPS<br />t1 = SDL_GetTicks();<br />while(bLoop){<br /> while(SDL_PollEvent(&sdlEvent)){<br /> //- loop de eventos<br /> }<br /> logica();<br /> //- calcula os milissegundos passados<br /> t2 = SDL_GetTicks() - t1;<br /> if(t2 < delay){<br /> //- espera o resto do tempo<br /> SDL_Delay(delay - t2);<br /> }<br /> t1 = SDL_GetTicks();<br /> SDL_Flip(screen);<br />}</p>Note a sequencia: eventos, lógica, espera e SDL_Flip.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_0qjVkiNs-GQ/SF-vEU9ZQnI/AAAAAAAAAKQ/diJbzno_h9g/s1600-h/023_frames.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_0qjVkiNs-GQ/SF-vEU9ZQnI/AAAAAAAAAKQ/diJbzno_h9g/s400/023_frames.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5215079382398878322" /></a>A tela é atualizada com <a href="http://docs.mandragor.org/files/Common_libs_documentation/SDL/SDL_Documentation_project_en/sdlflip.html">SDL_Flip()</a> que entra na contagem como sendo do próximo frame. Faço isso para não perder nenhum milissegundo.<br /><br /><b>.:: Trabalhando com tempo ::.</b><br />O tempo é algo que não pode ser simulado em uma só interação ! E caso você não concorde comigo eu explico melhor.<br />Eu posso percorrer todos os valores de uma variável em um loop e gerar meu resultado de uma só vez. Mas se minha variável for um valor de tempo seria inútil fazer isto. Pois não quero um resultado gerado todo de uma só vez... eu não teria movimento !<br />A regra pra se programar um jogo é <b>"Tudo ao seu tempo"</b>. E embora eu já esteja filosofando demais, eu gostaria que você tivesse isto em mente. Tente imaginar este outro ponto de vista, pois é muito importante.<br /><br />O tempo entre cada frame de um jogo costuma ser constante, mas isso não significa que a animação também deverá ser. Movimento acelerado é um truque escondido na manga, e pode dar uma impressão realista de movimento como se fosse mágica.<br /><br />As funções seno e cosseno podem ajudar muito neste momento:<br /><p class="bloco_cod">void logica(int t1){<br /> SDL_Rect ret, xy;<br /> float f;<br /><br /> // Limpando a tela e criando o piso.<br /> SDL_FillRect(screen, NULL, 0x000000);<br /> ret = (SDL_Rect){0, 300+img->h, 640, 32};<br /> SDL_FillRect(screen, &ret, 0x008000);<br /><br /> // Usando o tempo para encontrar um valor para o deslocamento x<br /> f = cos(t1/1000.0);<br /> xy.x = f*250.0 + 304;<br /><br /> // Usando o tempo para encontrar um valor positivo para o deslocamento y<br /> f = cos(t1/750.0);<br /> if(f<0) f = -f;<br /> xy.y = -f*200.0 + 300;<br /><br /> SDL_BlitSurface(img,0,screen,&xy);<br />}</p>Veja que nosso smiley quica sobre o piso como uma bola de borracha e muda de direção como se existisse uma força agindo sobre sua massa:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_0qjVkiNs-GQ/SF-v7U_qFAI/AAAAAAAAAKg/Mmnd_y9B1i0/s1600-h/023_smiley.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_0qjVkiNs-GQ/SF-v7U_qFAI/AAAAAAAAAKg/Mmnd_y9B1i0/s400/023_smiley.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5215080327301174274" /></a>Imagem de todas as posições assumidas por nosso smiley.<br /><br />Usar tempo em um jogo é um pouco mais complexo.<br />Nosso smiley não estaria pulando o tempo todo. Ele estaria em repouso e quando fosse dado o comando para pular faríamos:<br />» Mudar o estado para pulando.<br />» Pegar o startTicks. Que é o instante em que foi dado o comando.<br />» Deslocar nosso smiley em função do tempo. SDL_GetTicks() - startTicks.<br />» Mudar o estado de volta para repouso quando ele estiver em terra firme.<br /><br /><b>.:: Controle de tempo ::.</b><br />Acho que agora você já entendeu o porque de usar tempo e já deve estar pensando de forma diferente. Mas para que você possa fazer isso sem traumas é preciso de uma classe assistente.<br />O que aconteceria se você tivesse que pausar o jogo ? Como fazer isso sem ter que tratar o tempo pausado em todos os seus objetos e personagens animados ?! Para isso iremos trabalhar com um objeto timer... o nosso cronometro.<br />Assim como uma música, que você pode tocar(start), pausar(pause) e parar(stop) é o funcionamento do Timer.<br />Este timer foi totalmente baseada na classe Timer do <a href="http://lazyfoo.net/SDL_tutorials/lesson13/index.php">Lazy Foo'</a>.<br /><br />A classe Timer:<br /><p class="bloco_cod">class Timer {<br />private:<br /> int startTicks; // Tempo quando o Timer recebeu start().<br /> int pausedTicks; // Tempo passado quando o Timer recebeu stop().<br /><br /> bool paused; // Ativo quando o Timer estiver em pausa.<br /> bool started; // Ativo quando o Timer estiver ativo.<br />public:<br /> Timer(); // Construtor<br /> ~Timer(); // Destrutor<br /><br /> void start(); // Iniciar a contagem do timer.<br /> void stop(); // Parar a contagem.<br /> void pause(); // Pausar a contagem.<br /> void unPause(); // Continuar contagem.<br /> int getTicks(); // Informa o tempo contado.<br /> bool isStarted(); // Verifica se o Timer está rodando.<br /> bool isPaused(); // Verifica se o Timer está pausado.<br />};</p><br />A classe timer trabalha internamente com SDL_GetTicks(), mas apenas quando chamamos por funções como: start(), pause() e getTicks(). Ela usa os atributos startTicks e pausedTicks para se localizar no tempo e não depende de alimentação por interações.<br /><br />Você irá encontrar três bons exemplos de tudo que foi comentado aqui no arquivo "código fonte" disponível para download:<br />Exemplo1: Controle do Frame Rate.<br />Exemplo2: Um exemplo de animação usando um smiley e funções seno e cosseno.<br />Exemplo3: Código fonte da classe Timer. Junto com um exemplo e documentação.<br /><br /><b>.:: Link's ::.</b><br />Download: <a href="http://diogorbg.googlepages.com/023_cod_fps.zip">» código fonte</a><br /><a href="http://lazyfoo.net/SDL_tutorials/lesson13/index.php">» Advanced Timers (Lazy Foo')</a><br /><br />--<br />Depois de dois meses sem postar, estou aos poucos, retomando meu blog !</span>Diogo_RBGhttp://www.blogger.com/profile/02121378674070181046noreply@blogger.com0tag:blogger.com,1999:blog-609718605568612758.post-91229462092263897382008-04-10T18:11:00.014-03:002008-06-23T12:23:03.626-03:00[Mini-curso] Programação de jogos 2D com SDLPor incentivo do <a title="Centro Acadêmico de Ciência da Computação/UFT" href="http://www.caccomp.uft.edu.br/">CACComp</a> e do interesse de expansão do <a title="Grupo de Desenvolvimento de Jogos/UFT"><u>GrupoJ</u></a>, estarei apresentando o mini-curso: <b>Programação de jogos 2D com SDL</b>.<br />Trata-se de aulas práticas e teóricas sobre como programar jogos 2D utilizando a biblioteca SDL e a linguagem C/C++.<br /><br /><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_0qjVkiNs-GQ/R_6Qc8vVANI/AAAAAAAAAJ0/CskiFN22blk/s400/022_calendario.png" alt="" id="BLOGGER_PHOTO_ID_5187742647792763090" border="0" /><b>Datas:</b> 19/04, 26/04 e 03/05<br /><b>Horário:</b> 14:00 às 17:40<br /><b>Local:</b> Labin 09, Bloco III - UFT<br /><b>Inscrição:</b> R$ 3,00<br /><br />Para fazer as inscrições procure o <a title="Centro Acadêmico de Ciência da Computação/UFT" href="http://www.caccomp.uft.edu.br/">CACComp</a> no Bloco III e corra porque as inscrições são limitadas.<br /><br /><a id="link_022" href="javascript:mostrarPost('022');">» Post Completo...</a><span id="post_022" style="display: none;"><b>.:: Ementa ::.</b><br /><br />1 Introdução <span style="font-weight:bold;">(19/04)</span><br />1.1 O que é e como surgiu<br />* Simple DirectMedia Layer<br />1.2 O que pode fazer<br />* Vídeo<br />* Eventos<br />* Áudio<br />* CD-ROM áudio<br />* instancias<br />* Timers<br />* Independência na ordenação da memória<br />1.3 Como e onde funciona.<br />* Linux<br />* Win32<br />* BeOS<br />1.4 Bibliotecas estensivas<br />* Imagem<br />* Textos<br />* Processamento Gráfico e Geometria<br />* Som<br /><br />2 Trabalhando com SDL<br />2.1 Instalando e configurando o ambiente de programação<br />* Instalação pelo devpaks<br />* Instalação por código fonte no linux<br />* Configuração do projeto e compilação no Dev-Cpp (Windows)<br />* Configuração do projeto e compilação make e gcc (Linux)<br />2.2 Escrevendo o primeiro código<br />* Exemplo básico proposto pelo Dev-Cpp<br />2.3 Explicações mais detalhada da API da SDL <span style="font-weight:bold;">(26/04)</span><br />* inicialização<br />* Modo de vídeo<br />* Manipulação de imagens<br />* Manipulação de eventos<br />* Atualização da tela e controle de FPS<br />2.4 API's extensivas<br />* SDL_Image (imagem)<br />* SDL_Ttf (texto)<br />* SDL_Gfx (Processamento Gráfico e Geometria)<br />* SDL_Mix (Som)<br />2.5 Exemplos e soluções para jogos<br />* A problemática dos jogos e algumas soluções<br />2.6 Apresentação da Implementação <span style="font-weight:bold;">(03/05)</span><br />* Apresentação dos trabalhos desenvolvidos pelos alunos<br /><br /><b>.:: Downloads ::.</b><br /><a href="http://diogorbg.googlepages.com/022_slide.pdf">» Slides</a><br /><a href="http://diogorbg.googlepages.com/022_slide2.pdf">» Slides 2</a><br /><a href="http://diogorbg.googlepages.com/022_slide3.pdf">» Slides 3</a><br /><br /><a href="http://diogorbg.googlepages.com/022_projeto_sdl.zip">» Código Fonte do primeiro dia</a><br /><a href="http://diogorbg.googlepages.com/022_cod_sprite.zip">» Código da classe Sprite</a><br /><a href="http://diogorbg.googlepages.com/022_velha.zip">» Código do jogo da velha</a><br /><br /></span>Diogo_RBGhttp://www.blogger.com/profile/02121378674070181046noreply@blogger.com8tag:blogger.com,1999:blog-609718605568612758.post-41032747018058235602008-03-27T19:46:00.003-03:002008-03-27T19:50:57.413-03:00SDL em Processamento de Imagens<img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_0qjVkiNs-GQ/R-wkOLhb9yI/AAAAAAAAAJU/i0o8m5sik94/s200/021_ico.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5182557097226401570"/>Depois de muito tempo sem postar, estou de volta.<br />Desta vez não vou falar de teoria ou documentação, mas apenas de um exemplo prático de como utilizar SDL em Processamento de Imagens.<br /><br />SDL não tem componentes gráficas, caixa de diálogo ou funções de acesso ao pixel, mas a gente pode improvisar.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_0qjVkiNs-GQ/R-wkj7hb9zI/AAAAAAAAAJc/YnmmNyhxeEs/s1600-h/021_negativo.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_0qjVkiNs-GQ/R-wkj7hb9zI/AAAAAAAAAJc/YnmmNyhxeEs/s200/021_negativo.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5182557470888556338"/></a>Em SDL trabalhar com pixels é muito fácil e rápido.<br />Imagem 2D é com a SDL mesmo !<br /><br />Download: <a href="http://diogorbg.googlepages.com/021_negativo_sdl.zip">» código fonte</a>Diogo_RBGhttp://www.blogger.com/profile/02121378674070181046noreply@blogger.com4tag:blogger.com,1999:blog-609718605568612758.post-82186937625324815482008-02-07T20:01:00.000-03:002008-02-08T13:20:37.465-03:00SDL_Surface - Introdução detalhada<img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_0qjVkiNs-GQ/R50T1C9KxNI/AAAAAAAAAIs/u2z5P1pz-og/s320/020_ico.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5160302550083880146"/>Este post deveria ter vindo logo depois do primeiro sobre SDL (<a href="http://diogorbg.blogspot.com/2007/11/sdl-biblioteca-dos-jogos-2d.html">SDL - A Biblioteca dos Jogos 2D</a>). Se você estava meio perdido esta leitura é recomendada.<br />A abordagem começa com os pixels e se estende até o blit completo ou parcial.<br /><br /><a id="link_020" href="javascript:mostrarPost('020');">» Post Completo...</a><span id="post_020" style="display:none;"><b>*** SDL_Surface ***</b><br />É uma superfície gráfica (área de memória) que armazena uma imagem do tipo <a href="http://pt.wikipedia.org/wiki/Raster">raster</a> (ou bitmap, que significa mapa de bits).<br />A cada <a href="http://pt.wikipedia.org/wiki/Pixel">pixel</a> (menor unidade de uma imagem) é atribuído uma cor. Para representar uma cor no <a href="http://pt.wikipedia.org/wiki/RGB">padrão RGB</a> pode-se utilizar um número variável de bits: 8bpp (8 bits por pixel), 16bpp, 24bpp ou 32bpp. Isto interfere diretamente na quantidade de cores que serão apresentadas e no tamanho do arquivo.<br /><br />Esta é a estrutura da <a href="http://docs.mandragor.org/files/Common_libs_documentation/SDL/SDL_Documentation_project_en/sdlsurface.html">SDL_Surface</a>:<br /><p class="bloco_cod">typedef struct SDL_Surface {<br /> Uint32 flags;<br /> SDL_PixelFormat *format;<br /> int w, h;<br /> Uint16 pitch;<br /> void *pixels;<br /><br /> SDL_Rect clip_rect;<br /> int refcount;<br />} SDL_Surface;</p>Os parêmetros mais interessantes são w (largura da imagem), h (altura da imagem), pitch (bytes de cada linha) e pixels (ponteiro para o vetor de bytes).<br />Todos estes valores são apenas para leitura, exceto pixels. Nem sempre pixels está disponível para escrita, neste caso você deve usar SDL_LockSurface() e SDL_UnlockSurface() para ter acesso direto aos dados.<br /><br />Uma curiosidade é saber como os pixels estão dispostos exatamente em *pixels. Uma imagem 3x3 de 24bpp possui pitch=12 e pixels[36]. <b>w*h*bpp = 3*3*3 = 27</b>, mas não é dessa forma que as coisas funcionam.<br />Observe a imagem:<br /><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_0qjVkiNs-GQ/R50Uli9KxOI/AAAAAAAAAI0/A4rohhD9sPg/s400/020_dados.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5160303383307535586"/>Pode existir lixo no final de cada linha quando ela não for multipla de 32 bits (4 bytes), mas isto não é um bug, é apenas uma otimização. Logo o cálculo fica: <b>pitch*h = 36</b><br /><br /><b>*** Screen ***</b><br />É através da SDL_Surface que tudo será apresentado ao usuário, e usualmente eu nomeio a superfície da tela como screen:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_0qjVkiNs-GQ/R6t_Oy9KxPI/AAAAAAAAAJE/uiqjzgPpR3o/s1600-h/020_3seg.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_0qjVkiNs-GQ/R6t_Oy9KxPI/AAAAAAAAAJE/uiqjzgPpR3o/s320/020_3seg.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5164361289883632882"/></a><p class="bloco_cod">#include <SDL/SDL.h><br /><br />SDL_Surface *screen = NULL; //- Tela<br /><br />int main(int argc, char *argv[]){<br /> //- Inicializa a SDL -//<br /> SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER);<br /> //- Inicializa a tela -//<br /> screen = SDL_SetVideoMode(640,480,32,SDL_SWSURFACE);<br /> //- título da janela -//<br /> SDL_WM_SetCaption("Aplicação SDL em 3 segundos !!!", NULL);<br /><br /> //- Atualiza a tela -//<br /> SDL_Flip(screen);<br /> //- Pausa de 3 segundos -//<br /> SDL_Delay(3000);<br /><br /> //- Finaliza a SDL -//<br /> SDL_Quit();<br /> return 0;<br />}</p>Explicando melhor cada linha do exemplo:<br />» Incluí a biblioteca SDL. (Ela deve estar instalada)<br />» Criei um ponteiro para armazenar a superfície da tela (screen).<br />» Minha função main da maneira correta, exatamente como a SDL a espera.<br />» Inicializo a SDL<br />» Inicializo a tela. 640x480 e 32bpp é criada na memória.<br />» Define "Aplicação SDL em 3 segundos !!!" como título da janela.<br />» Mostra a superfície no vídeo. Se você estiver utilizando SDL_DOUBLEBUF esta função terá o papel crucial.<br />» Como ainda não estamos tratando eventos do teclado fiz uma pausa de 3 segundos para que a janela possa ser visualizada.<br />» Devemos inicializar e também finalizar a SDL.<br />» Retornar 0 indica que tudo ocorreu bem.<br /><br /><b>*** Imagens ***</b><br />Com SDL é fácil carregar (<a href="http://docs.mandragor.org/files/Common_libs_documentation/SDL/SDL_Documentation_project_en/sdlloadbmp.html">SDL_LoadBMP</a>) e salvar (<a href="http://docs.mandragor.org/files/Common_libs_documentation/SDL/SDL_Documentation_project_en/sdlsavebmp.html">SDL_SaveBMP</a>) imagens no formato BMP. Pena que o formato BMP não suporta mais que 24bpp, e isto nos limita a usar cor de transparência, já que não podemos carregar imagens com alpha. O formato PNG suporta alpha, mas não se pode carregar PNG com a função SDL_LoadBMP(), para isto devemos utilizar a lib <a href="http://www.libsdl.org/projects/SDL_image/">SDL_Image</a> (veremos mais à frente).<br />Trecho de código:<br /><p class="bloco_cod">SDL_Surface *img = NULL;<br />...<br />int main(int argc, char *argv[]){<br /> //- Inicializa a SDL -//<br /> ...<br /><br /> //- carrega imagem -//<br /> img = SDL_LoadBMP("img/imagem.bmp");<br /><br /> //- pinta imagem na em outra screen -//<br /> SDL_BlitSurface(img,0,screen,0);<br /><br /> //- salvando a tela -//<br /> SDL_SaveBMP(screen,"img/screen.bmp");<br /><br /> //- Atualiza a tela -//<br /> SDL_Flip(screen);<br /> //- Pausa de 3 segundos -//<br /> SDL_Delay(3000);<br /><br /> //- limpando memória -//<br /> SDL_FreeSurface( img );<br /><br /> //- Finaliza a SDL -//<br /> SDL_Quit();<br /> return 0;<br />}</p>» Um ponteiro SDL_Surface para armazenar nossa imagem.<br />» Em main inicializamos a SDL.<br />» Carregamos "img/imagem.bmp" com a função SDL_LoadBMP e guardamos seu ponteiro em img. Usar / é o mesmo que usar \\ e funciona no Windows e Linux. Caso a imagem não seja carregada verifique se seu nome está correto ou se o programa está sendo executado do local correto. system("pwd") ou system("dir") podem esclarecer o que digo.<br />» <a href="http://docs.mandragor.org/files/Common_libs_documentation/SDL/SDL_Documentation_project_en/sdlblitsurface.html">SDL_BlitSurface</a> é capaz de pintar uma superfície sobre outra. Desta maneira a imagem será pintada completamente nas coordenadas 0x0 da imagem de destino.<br />» Com SDL_SaveBMP é fácil gravar uma screenshot do seu jogo !<br />» <a href="http://docs.mandragor.org/files/Common_libs_documentation/SDL/SDL_Documentation_project_en/sdlflip.html">SDL_Flip</a> e <a href="http://docs.mandragor.org/files/Common_libs_documentation/SDL/SDL_Documentation_project_en/sdldelay.html">SDL_Delay</a> para visualizarmos a janela.<br />» <a href="http://docs.mandragor.org/files/Common_libs_documentation/SDL/SDL_Documentation_project_en/sdlfreesurface.html">SDL_FreeSurface</a> é utilizada para limpar a memória da imagem carregada.<br />» Por fim <a href="http://docs.mandragor.org/files/Common_libs_documentation/SDL/SDL_Documentation_project_en/sdlquit.html">SDL_Quit</a> e return 0;<br /><br />Se você quiser ganhar performance em seu jogo não trabalhe com diferentes formatos de superfície (não estou falando dos formatos de arquivo). Toda vez que blita uma superfície de 24bpp em outra de 32bpp há uma conversão em tempo de blitagem, e para ganhar performance temos que deixar todas as superfícies convertidas em um único formato, o formato do display (nossa tela).<br /><p class="bloco_cod">SDL_Surface *aux, *img;<br />aux = SDL_LoadBMP("smiley.bmp");<br />SDL_SetColorKey(aux, SDL_SRCCOLORKEY, SDL_MapRGB(aux->format,0xff,0,0xff) );<br />img = SDL_DisplayFormatAlpha(aux);<br />SDL_FreeSurface(aux);</p>» aux recebe uma imagem de 24bpp.<br />» O rosa 0xff00ff é setado como cor de transparência. (faça antes de converter pro display)<br />» <a href="http://docs.mandragor.org/files/Common_libs_documentation/SDL/SDL_Documentation_project_en/sdldisplayformatalpha.html">SDL_DisplayFormatAlpha</a> é chamado e converte a imagem para 32bpp e transforma a cor de transparência em uma camada de transparência.<br />» aux deve ser limpada, pois <a href="http://docs.mandragor.org/files/Common_libs_documentation/SDL/SDL_Documentation_project_en/sdldisplayformat.html">SDL_DisplayFormat</a> cria uma nova superfície.<br /><br /><b>*** SDL_BlitSurface ***</b><br />Até agora só trabalhamos com <a href="http://docs.mandragor.org/files/Common_libs_documentation/SDL/SDL_Documentation_project_en/sdlblitsurface.html">SDL_BlitSurface</a> em sua forma mais simples (imagem, NULL, imagem, NULL). Esta função tem diversas utilidades, tais como imprimir apenas parte de uma imagem em outra.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_0qjVkiNs-GQ/R6t_iC9KxQI/AAAAAAAAAJM/wKQDmUBXVME/s1600-h/020_blit.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_0qjVkiNs-GQ/R6t_iC9KxQI/AAAAAAAAAJM/wKQDmUBXVME/s320/020_blit.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5164361620596114690"/></a>Analisando cuidadosamente temos:<br /><p class="bloco_cod">int SDL_BlitSurface(<br /> SDL_Surface *src, //- Imagem de origem (imagem a pintar)<br /> SDL_Rect *srcrect, //- Retângulo de corte. permite pintar<br /> // parte dela.<br /> SDL_Surface *dst, //- Imagem de destino (imagem modificada)<br /> SDL_Rect *dstrect //- Coordenadas da imagem de origem.<br />);</p>Explicarei com vários exemplos.<br />A forma mais simples de uso é onde uma imagem é toda impressa em outra nas coordenadas de origem:<br /><p class="bloco_cod">SDL_BlitSurface(img, NULL, screen, NULL);</p>Para imprimir uma <b>imagem por completo</b> em uma determinada posição de outra imagem:<br /><p class="bloco_cod">SDL_Rect xy = {x,y,0,0};<br />SDL_BlitSurface(img, NULL, screen, &xy);</p>Para imprimir <b>parte de uma imagem</b> em uma determinada posição de outra imagem:<br /><p class="bloco_cod">SDL_Rect ret = {retx, rety, retw, reth};<br />SDL_Rect xy = {x,y,0,0};<br />SDL_BlitSurface(img, &ret, screen, &xy);</p>Mais informações:<br />» Uma imagem não precisa estar realmente cortada para que se possa imprimir parte dela.<br />» A imagem de destino nunca irá mudar de tamanho para acomodar a imagem de origem.<br />» Só serão aproveitados o x e y do retângulo de destino, logo ele só servirá para posicionar onde a imagem será impressa.<br />» Você não poderá redimensionar ou rotacionar imagens com SDL_BlitSurface. Para isto use <a href="http://www.ferzkopp.net/joomla/content/view/19/14/">SDL_Gfx</a>.<br /><br /><b>*** Link's ***</b><br />Download: <a href="http://diogorbg.googlepages.com/020_cod_sdl.zip">» código fonte</a><br /><a href="http://lazyfoo.net/SDL_tutorials/lesson02/index.php">» Surface Loading and Blitting</a><br /><a href="http://docs.mandragor.org/files/Common_libs_documentation/SDL/SDL_Documentation_project_en/index.html">» Documentação da SDL</a> (online)</span>Diogo_RBGhttp://www.blogger.com/profile/02121378674070181046noreply@blogger.com5tag:blogger.com,1999:blog-609718605568612758.post-13780354795269424172008-01-26T18:52:00.000-03:002008-01-27T16:23:47.850-03:00Script's GIMP - Python-Fu !!!<img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_0qjVkiNs-GQ/R5ut_y9KxKI/AAAAAAAAAIU/4lNh6un2cTA/s320/019_gimp.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5159909109604730018"/>Calma... Python-Fu não é um novo estilo ninja !!!<br />Não é atoa que o GIMP é a melhor ferramenta gráfica 2D e open source da atualidade. Ela é perfeita para ser manipulada por artistas e programadores.<br />Saiba como automatizar aquele efeito especial que você geralmente usa ou criar algum que só é possível através de programação !<br /><br /><a id="link_019" href="javascript:mostrarPost('019');">» Post Completo...</a><span id="post_019" style="display:none;"><b>*** GIMP ***</b><br /><a href="http://pt.wikipedia.org/wiki/GIMP">Wikipédia</a>: <font color="SteelBlue">"O GNU Image Manipulation Program ou GIMP é um editor de imagens raster (ou bitmap, que significa mapa de bits)."<br />"O GIMP é muito utilizado para processamento de imagens e fotografias. Seus usos incluem criar gráficos e logotipos, redimensionar fotos, alterar cores, combinar imagens utilizando o paradigma de camadas, remover partes indesejadas das imagens e converter arquivos entre diferentes formados de imagem digital."<br />"Assim como o uso interativo, o GIMP pode ser inserido em scripts e chamadas de sistemas em programas compilados. Para isso pode-se usar, Scheme (ou ScriptFu), Perl, Python, Tcl, Ruby, e programas capazes de executar comandos UNIX."</font><br />Não sou profissional, mas digo que o GIMP é completo (ou quase !). Com ele é fácil corrigir fotos, manipular diversos tipos de imagens e criar efeitos especiais.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_0qjVkiNs-GQ/R5ylny9KxMI/AAAAAAAAAIk/ygZIeH_gL-c/s1600-h/019_passaro.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_0qjVkiNs-GQ/R5ylny9KxMI/AAAAAAAAAIk/ygZIeH_gL-c/s320/019_passaro.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5160181376171558082"/></a>Esta imagem foi produzida com a ajuda do meu plug-in borda cubismo (disponível nos exemplos), mas com poucos cliques é possível reproduzí-lo manualmente utilizando o plug_in_cubism em <b>filtros/Artísticos/Cubismo...</b>.<br /><br /><b>*** Script Scheme ***</b><br /><a href="http://pt.wikipedia.org/wiki/Scheme">Wikipédia</a>: <font color="SteelBlue">"Scheme é uma linguagem de programação multi-paradigma que suporta programação funcional e procedural. Foi criada por Guy L. Steele e Gerald Jay Sussman nos anos 1970 a partir da linguagem Lisp com o intuito de estudar a teoria dos atores de Carl Hewitt."<br />"Devido à sua sintaxe completamete aninhada, não existem regras de precedência de operadores e sua notação parentizada é usada para todas as chamadas de função, desta forma não há ambigüidades como as que são encontradas nas linguagens de notação infixa."</font><br />Na prática, Scheme não é pra qualquer um !<br /><a href="http://cs.wwc.edu/~cs_dept/KU/PR/Scheme.php">» Scheme Tutorial</a><br /><a href="http://www.lia.ufc.br/~riverson/pdi06/scriptfu1.pdf.gz">» Script-Fu aula 1</a><br /><a href="http://www.lia.ufc.br/~riverson/pdi06/scriptfu2.pdf.gz">» Script-Fu aula 2</a><br />Exemplos no download abaixo.<br /><br /><b>*** Plug-in Python-Fu ***</b><br /><a href="http://pt.wikipedia.org/wiki/Python">Wikipédia</a>: <font color="SteelBlue">"Python é uma linguagem de programação de alto nível interpretada, interativa, orientada a objetos e de tipagem dinâmica e forte, lançada por Guido van Rossum em 1991."<br />"A linguagem foi projetada com a filosofia de enfatizar a importância do esforço do programador sobre o esforço computacional. Prioriza a legibilidade do código sobre a velocidade ou expressividade. Combina uma sintaxe concisa e clara com os recursos poderosos de sua biblioteca padrão e por módulos e frameworks desenvolvidos por terceiros."</font><br />Em outras palavras, adeus dores de cabeça !<br />Só não se esqueça que o pacote gimp-python deve estar instalado e que os arquivos devem ser copiados para "/home/usuario/.gimp-x.x/plug-ins" nomeados como "meu_plugin.py" com <b>permição de execução</b>.<br /><a href="http://www.jamesh.id.au/software/pygimp/">» Gimp-Python</a><br /><a href="http://www.javielinux.com/articulos/pygimp/book1.htm">» Python-fu para no programadores</a><br />Exemplos no download abaixo.<br /><br /><b>*** Plug-in em C ***</b><br />O GIMP é feito em C, logo, penso que escrever plug-ins em C pode ser vantajoso.<br />A parte inicial é mais complicada de entender, mas depois de superada você estará programando em C como em qualquer outro programa que já tenha feito.<br />A interface gráfica é feita em GTK, e isto é outra coisa que deve ser estudada. Mas com o básico já se pode criar diálogos para capturar os dados de entrada.<br /><a href="http://aventuranolinux.wordpress.com/2007/11/20/compilando-e-instalando-plug-in-do-gimp-para-linux-windows-e-no-linux-para-windows/">» Compilando (e instalando) plug-in do Gimp para Linux e Windows</a><br /><a href="http://www.gimp.org.es/tutoriales/writeplug_partI/index.html">» COMO ESCRIBIR UN PLUG-IN PARA GIMP (parte I)</a><br /><a href="http://www.gimp.org.es/tutoriales/writeplug_partII/index.html">» COMO ESCRIBIR UN PLUG-IN PARA GIMP (parte II)</a><br /><br /><b>*** Conclusões ***</b><br />Esta foi uma abordagem geral, e por enquanto é tudo que disponho.<br />Não se trata de escolher a melhor linguagem, há outras variáveis em jogo. Metade dos plug-ins e script's do GIMP são escitos em C e Scheme e existem fortes razões para isto.<br />Não existe nada que se case melhor ao GIMP do que um plug-in em C, mas podem ocorrer casos em que isto é irrelevante.<br />Python-Fu é 1000 vezes mais fácil de entender e programar que Scheme, mas isto tem um custo (dependências). Para que um plug-in Python-Fu funcione você precisa ter o pacote <b>gimp-python</b> instalado e funcionando.<br />O que faz a diferença é saber utilizar instruções complexas e deixar que o próprio GIMP faça o trabalho. Para consultar as instruções disponíveis do GIMP use o <b>Navegador de Plug-ins</b> e o <b>Navegador de Procedimentos</b> que estão localizados no menu <b>Extras</b>.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_0qjVkiNs-GQ/R5uwES9KxLI/AAAAAAAAAIc/JiovbDMWqcM/s1600-h/019_procedimentos.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_0qjVkiNs-GQ/R5uwES9KxLI/AAAAAAAAAIc/JiovbDMWqcM/s320/019_procedimentos.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5159911385937396914"/></a>Criar um plug-in para o GIMP é mais simples que escrever um programa para edição de imagens e ainda é mais prático de usar, considerando todas as ferramentas do GIMP que estarão disponíveis.<br />Era exatamente isto que eu buscava para apresentar em processamento de imagens !!!<br /><br /><b>*** Link's ***</b><br />Download: <a href="http://diogorbg.googlepages.com/019_exemplos.zip">» Exemplos</a><br /><a href="http://registry.gimp.org/">» GIMP Plug-In Registry</a> (Repositório oficial)<br /><a href="http://cs.wwc.edu/~cs_dept/KU/PR/Scheme.php">» Scheme Tutorial</a><br /><a href="http://www.lia.ufc.br/~riverson/pdi06/">» Processamento Digital de Imagens</a> (Site com muitas referências)<br /><a href="http://www.jamesh.id.au/software/pygimp/">» Gimp-Python</a><br /><a href="http://www.javielinux.com/articulos/pygimp/book1.htm">» Python-fu para no programadores</a><br /><a href="http://aventuranolinux.wordpress.com/2007/11/20/compilando-e-instalando-plug-in-do-gimp-para-linux-windows-e-no-linux-para-windows/">» Compilando (e instalando) plug-in do Gimp para Linux e Windows</a><br /><a href="http://www.gimp.org.es/tutoriales/writeplug_partI/index.html">» COMO ESCRIBIR UN PLUG-IN PARA GIMP (parte I)</a><br /><a href="http://www.gimp.org.es/tutoriales/writeplug_partII/index.html">» COMO ESCRIBIR UN PLUG-IN PARA GIMP (parte II)</a><br /><br />---<br />Ainda não tenho experiência com os plug-ins do GIMP, e espero que com este post eu possa ajudar e receber ajuda. Não encontrei muito material na Internet, se alguém tiver algum material sobre o assunto terei o prazer de incluir aos outros.</span>Diogo_RBGhttp://www.blogger.com/profile/02121378674070181046noreply@blogger.com4tag:blogger.com,1999:blog-609718605568612758.post-6848660274865796032008-01-09T17:19:00.000-03:002008-01-10T20:12:06.847-03:00Imprimindo texto com SDL_Ttf<img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp1.blogger.com/_0qjVkiNs-GQ/R4Ut_lu0sRI/AAAAAAAAAH8/PHPRtikmB80/s320/018_ttf.png" alt="" id="BLOGGER_PHOTO_ID_5153575919078912274" border="0" />Você já deve ter reparado que a função printf não faz milagres quando se está utilizando SDL. Isso é normal, pois a superfície da SDL não é uma saída padrão. A saída padrão é o console (Linux) ou o arquivo stdout.txt (Windows).<br />A única maneira de se imprimir texto na superfície da SDL é desenhando letra por letra, mas isso não significa que você tenha que fazer isso na unha !<br />A forma mais simples de resolver este problema é utilizando a lib <a href="http://www.libsdl.org/projects/SDL_ttf/">SDL_Ttf</a> (SDL True Type Fonts).<br />Além de mostrar minhas soluções para entrada e saída de texto também abordo um pouco sobre manipulação de argumentos variáveis.<br /><br /><a id="link_018" href="javascript:mostrarPost('018');">» Post Completo...</a><span id="post_018" style="display:none;"><b>*** SDL_Ttf ***</b><br />Tradução do <a href="http://lazyfoo.net/SDL_tutorials/lesson07/index.php">LazyFoo</a>: "SDL não suporta arquivos *.ttf nativamente e por isso a biblioteca de extensão SDL_Ttf é necessária. SDL_Ttf é uma biblioteca de extensão que lhe permite gerar superfícies a partir de certo tipo de fontes."<br />Isso significa que a lib SDL_Ttf não carrega a font, mas a converte para uma superfície (SDL_Surface) e após carregada não se pode alterar o tamanho da fonte, por exemplo.<br />Como sempre você pode baixar do <a href="http://www.libsdl.org/projects/SDL_ttf">Site do projeto</a>, do <a href="http://devpaks.org/">Devpaks</a> ou instalar direto do repositório (distribuições derivadas do Debian):<br /><b>$ sudo apt-get install libsdl-ttf2.0-dev</b><br />E para linkar ao seu projeto use <b>-lSDL_ttf</b><br /><br />Algumas de suas funções são:<br /><p class="bloco_cod">int TTF_Init();<br />void TTF_Quit();<br />char *TTF_GetError();<br />TTF_Font *TTF_OpenFont(const char *file, int ptsize);<br />void TTF_CloseFont(TTF_Font *font);<br />int TTF_SizeText(TTF_Font *font, const char *text, int *w, int *h)<br />SDL_Surface *TTF_RenderText_Solid(TTF_Font *font, const char *text, SDL_Color fg);<br />...</p><br />É importante saber que é preciso inicializar (TTF_Init) e encerrar (TTF_Quit) a biblioteca e também carregar (TTF_OpenFont) e descarregar (TTF_CloseFont) o recurso TTF_Font.<br /><br />A parte de renderização (impressão de texto) possui alguns conceitos a serem estudados:<br /><b>» Solid</b>: Rápido e direto. Cria uma nova camada de 8bpp (usa paleta) com o texto impresso em baixa qualidade (2 cores). <b>0</b> é o colorkey e <b>1</b> é a cor da font. O resultado é rápido, o texto tem cor de transparência mas é serrilhado.<br /><b>» Shaded</b>: Lento com caixa de cor sólida. Cria uma nova camada de 8bpp (usa paleta) com o texto impresso em alta qualidade (com anti-aliasing). O resultado não é muito rápido, o texto não é serrilhado mas também não tem cor de transparência.<br /><b>» Blended</b>: Muito lento e com camada de transparência. Cria uma nova camada de 32bpp (usa camada alpha) com o texto impresso em alta qualidade (com anti-aliasing). É o resultado mais lento, o texto não é serrilhado e tem transparência.<br /><br />A lib SDL_Ttf permite vários tipos de codificação de texto: LATIN1, UTF8, UNICODE text/glyph.<br />Isto significa que você não terá problemas com acentuação, como é comum acontecer quando você escreve seu código em ISO-8859-1 e o programa imprime num terminal IBM-850.<br />UTF-8 é a codificação de tamanho variável que pode representar qualquer caracter universal padrão do Unicode, mas para nós do ocidente o LATIN1 é mais do que suficiente.<br /><br />Um exemplo rápido de como utilizar a lib SDL_Ttf: (Não compile isto !)<br /><p class="bloco_cod">TTF_Font *font_16 = NULL;<br />SDL_Surface *screen=NULL, *aux=NULL;<br />...<br />int TTF_Init();<br />...<br />font_16 = TTF_OpenFont("free_serif.ttf", 16);<br />...<br />SDL_Color cor = {255,255,255,0};<br />aux = TTF_RenderText_Solid(font_16, "Texto !!!", cor );<br />SDL_BlitSurface(aux, NULL, screen, NULL);<br />SDL_FreeSurface(aux);<br />...<br />TTF_CloseFont(font_16);<br />...<br />void TTF_Quit();</p><br /><b>*** O Exemplo ***</b><br />No exemplo você vai encontrar os 3 tipos de renderização, um exemplo de texto formatado e um exemplo de leitura de texto.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_0qjVkiNs-GQ/R4aimlu0sSI/AAAAAAAAAIE/YF71Gl0dXJc/s1600-h/018_print.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_0qjVkiNs-GQ/R4aimlu0sSI/AAAAAAAAAIE/YF71Gl0dXJc/s320/018_print.png" alt="" id="BLOGGER_PHOTO_ID_5153985607419343138" border="0" /></a>Download: <a href="http://diogorbg.googlepages.com/018_cod_ttf.zip">» código fonte</a><br /><br /><b>*** Impressão de texto formatado ***</b><br />A função <a href="http://www.cplusplus.com/reference/clibrary/cstdio/printf.html">printf</a> sempre foi uma mão na roda, pois ela formata, converte e imprime (Tudo ao mesmo tempo). E o que dizer da quantidade variável de argumentos ?! Ela sempre foi um verdadeiro canivete suíço !!!<br />Não podemos imprimir direto na tela, mas podemos imprimir para um vetor com <a href="http://www.cplusplus.com/reference/clibrary/cstdio/sprintf.html">sprintf</a>. E melhor ainda, criar nossa função print(x,y,texto,...) com argumentos variáveis com a ajuda da função <a href="http://www.cplusplus.com/reference/clibrary/cstdio/vsprintf.html">vsprintf</a>:<br /><p class="bloco_cod">void print(int x,int y,const char *format, ...){<br />SDL_Surface *aux;<br />SDL_Color cor = {255,255,255,0};<br />SDL_Rect ret={x,y,0,0};<br /><br />//- Imprimindo para vetor -//<br />char buf[256];<br />va_list args;<br />va_start (args, format);<br />vsprintf (buf,format, args);<br />va_end(args);<br /><br />aux = TTF_RenderText_Blended(font_16, buf, cor);<br />SDL_BlitSurface(aux,0,screen,&ret);<br />SDL_FreeSurface(aux);<br />}</p>Mais explicações logo abaixo !!!<br /><br /><b>*** Manipulação de argumentos variáveis ***</b><br />Já se perguntou como como é possível declarar: <u>int printf( const char *format, ... )</u> ?<br /><a href="http://br.geocities.com/sdiasneto/c/stdarg.html">Samuel Dias Neto</a>: "Uma função pode ser chamada com um número variável de argumentos sendo estes argumentos de diversos tipos. O arquivo de cabeçalho stdarg.h declara um tipo va_list e define três macros (va_start, va_arg e va_end) para manipular uma lista de argumentos cuja quantidade e tipos são desconhecidos pela função."<br /><b>» va_list</b>: tipo para a listas de argumentos variável.<br /><b>» va_start</b>: inicializa a listas de argumentos variável.<br /><b>» va_arg</b>: retira o próximo argumento.<br /><b>» va_end</b>: finaliza a listas de argumentos variável.<br /><br /><b>*** Leitura de texto ***</b><br />Já sabemos como escrever, agora só falta saber como ler ! Aqui é a parte em que eu tive que improvisar, pois não existe a função SDL_Scanf !!!<br />Minha função de leitura foi feita para teclados ABNT2 e não aceita acentuação, mas pode quebrar um galho:<br /><p class="bloco_cod">std::string str;<br />bool shift;<br />void scan(SDLKey key, bool shift){<br />...<br />if(key==SDLK_BACKSPACE && !str.empty())<br /> str.erase(str.length()-1);<br />else if(key==' ')<br /> str += key;<br />else if(key>=SDLK_KP0 && key<=SDLK_KP9)<br /> str += key - SDLK_KP0 + '0';<br />else if(key>='a' && key<='z'){<br /> if(shift)<br /> str += key-'a'+'A';<br /> else<br /> str += key;<br />}else{<br /> ...<br />}<br />}</p><br /><b>*** Link's ***</b><br />Download: <a href="http://diogorbg.googlepages.com/018_cod_ttf.zip">» código fonte</a><br /><a href="http://www.libsdl.org/projects/SDL_ttf">» Site SDL_Ttf</a><br /><a href="http://lazyfoo.net/SDL_tutorials/lesson07/index.php">» LazyFoo (True Type Fonts)</a><br /><a href="http://diogorbg.blogspot.com/2007/11/sdl-biblioteca-dos-jogos-2d.html">» SDL - A Biblioteca dos Jogos 2D</a></span>Diogo_RBGhttp://www.blogger.com/profile/02121378674070181046noreply@blogger.com4tag:blogger.com,1999:blog-609718605568612758.post-36771986772037375882008-01-08T15:05:00.000-03:002008-01-08T15:11:54.611-03:00DR Tetris 0.3 - Tetris no estilo tradicional !2007 foi um ótimo ano, mas 2008 promete ! E para começar o ano com o pé direito estou lançando a terceira edição do meu jogo de tetris.<br />DR Tetris 0.3 é um jogo de tetris estilo tradicional que promete matar saudade dos velhos tempo em que se perdiam horas em mini games (Eu sou um exemplo !)<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_0qjVkiNs-GQ/R4O711u0sQI/AAAAAAAAAH0/nf55ueZ5iQM/s1600-h/017_tetris_0.3.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_0qjVkiNs-GQ/R4O711u0sQI/AAAAAAAAAH0/nf55ueZ5iQM/s320/017_tetris_0.3.png" alt="" id="BLOGGER_PHOTO_ID_5153168932272910594" border="0" /></a><br />Algumas das características são:<br />* Roda em Windows e Linux.<br />* Sons do jogo original (Ou quase !).<br />* Sombra projetando onde a peça irá cair.<br />* Placar de recordes com 13 posições (Editável).<br />* Acumulador de pontos em sequência.<br />* Níveis diferentes de velocidade.<br /><br />Você pode baixar no site do jogo: <a href="http://diogorbg.googlepages.com/tetris">DR Tetris</a><br />...que ainda se encontra em construção !<br /><br />---<br />DR Teris ==> Diogo Rigo Tetris :)<br />Este é o motivo do meu sumisso !<br />Em breve voltarei a postar meus tutorias de SDL.Diogo_RBGhttp://www.blogger.com/profile/02121378674070181046noreply@blogger.com8tag:blogger.com,1999:blog-609718605568612758.post-11910956078570496022007-12-22T11:21:00.000-03:002007-12-24T13:32:08.615-03:00SDL_Collide - Colisão 2D para jogos<img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp3.blogger.com/_0qjVkiNs-GQ/R20d1Fu0sGI/AAAAAAAAAGk/UUXE5AHo3q0/s320/016_collide.png" alt="" id="BLOGGER_PHOTO_ID_5146802747063185506" border="0" />A primeira regra de qualquer jogo é a colisão. É claro que isso só inclui 99,99% dos jogos.<br />Como será o sistema de colisão em seu jogo é um fator determinante pra conclusão do projeto.<br />Como sempre tenho a <a href="http://www.libsdl.org/">SDL</a> sempre a mão e para resolver este problema vou apresentar a <a href="http://sdl-collide.sourceforge.net/">SDL_Collide</a>.<br /><br /><a id="link_016" href="javascript:mostrarPost('016');">» Post Completo...</a><span id="post_016" style="display:none;"><b>*** SDL_Collide ***</b><br />Esta não é mais uma biblioteca de dependência para seu código, na verdade eu a considero como uma biblioteca de referência. Digo isso porque SDL_Collide possui apenas 240 linhas de código (totalmente comentadas) e estudando a lógica das funções (apenas 6) você é capaz de otimizar as suas.<br /><br /><b>int SDL_CollideTransparentPixel(SDL_Surface *surface, int u, int v);</b><br />Esta Função serve apenas para testar se um pixel[u][v] é ou não transparente.<br />É uma função que acessa um pixel (meio complicado de explicar) e no final compara com o <b>colorkey</b> da imagem.<br /><p class="bloco_cod">return (pixelcolor == surface->format->colorkey);</p><br /><b>int SDL_CollidePixel(SDL_Surface *as, int ax, int ay, SDL_Surface *bs, int bx, int by, int skip = 4);</b><br />Esta função faz um teste de colisão em pixel precisão. É muito lenta.<br />Por exemplo: <b>SDL_CollidePixel("verde_claro",0,0,"verde_escuro",4,2,2);</b><br /><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_0qjVkiNs-GQ/R20eOVu0sHI/AAAAAAAAAGs/7guC9miOOZU/s400/016_pix_colisao.png" alt="" id="BLOGGER_PHOTO_ID_5146803180854882418" border="0" />Como é mostrado acima, o exemplo faria teste de colisão nos pixels de intercessão entre as imagens. O parâmetro skip (2) indica quantos pixels saltar (1 faz teste completo).<br />O exemplo retornou <b>verdadeiro</b>. Branco é nossa cor de transparência e a colisão foi detectada apenas uma vez.<br /><br /><b>int SDL_CollideBoundingBox(SDL_Surface *sa, int ax, int ay, SDL_Surface *sb, int bx, int by);<br />e<br />int SDL_CollideBoundingBox(SDL_Rect a, SDL_Rect b);</b><br />São responsáveis pela colisão entre retângulos e são muito rápidas.<br /><p class="bloco_cod">int SDL_CollideBoundingBox(SDL_Rect a, SDL_Rect b){<br />if(b.x + b.w < a.x) //- b.direita < a.esquerda<br /> return 0;<br />if(b.x > a.x + a.w) //- b.esquerda > a.direita<br /> return 0;<br />if(b.y + b.h < a.y) //- b.baixo < a.cima<br /> return 0;<br />if(b.y > a.y + a.h) //- b.cima > a.baixo<br /> return 0;<br /><br />return 1; //- retângulos se colidem<br />}</p><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_0qjVkiNs-GQ/R20e2Vu0sII/AAAAAAAAAG0/MN1iRCwHv1Q/s1600-h/016_retangulo_colisao.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_0qjVkiNs-GQ/R20e2Vu0sII/AAAAAAAAAG0/MN1iRCwHv1Q/s400/016_retangulo_colisao.png" alt="" id="BLOGGER_PHOTO_ID_5146803868049649794" border="0" /></a>O primeiro teste "if(b.x + b.w < a.x)" é representado na figura pelas barras vermelhas.<br />Repare que a colisão só existe quando todos os testes falham. O algoritmo procura por algum lado que possa eliminar a colisão totalmente.<br /><br /><b>int SDL_CollideBoundingCircle(int x1, int y1, int r1, int x2, int y2, int r2, int offset);</b><br />Faz a comparação de colisão entre circulos. <b>x</b> e <b>y</b> são coordenadas do centro. use <b>offset</b> como 0 (deve ser alguma medida de precisão).<br /><p class="bloco_cod">int SDL_CollideBoundingCircle(int x1, int y1, int r1, int x2, int y2, int r2, int offset){<br />int xdiff = x2 - x1; //- diferença no eixo x<br />int ydiff = y2 - y1; //- diferença no eixo y<br /><br />/* Distância entre os centros dos círculos ao quadrado */<br />int dcentre_sq = (ydiff*ydiff) + (xdiff*xdiff);<br /><br />/* Calcula a soma dos raios ao quadrado */<br />int r_sum_sq = r1 + r2;<br />r_sum_sq *= r_sum_sq; //- melhor que (r1+r2)*(r1+r2)<br /><br />return (dcentre_sq - r_sum_sq <= (offset*offset));<br />}</p><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_0qjVkiNs-GQ/R20fZlu0sJI/AAAAAAAAAG8/bRZTdX4hOm0/s1600-h/016_circulo_colisao.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_0qjVkiNs-GQ/R20fZlu0sJI/AAAAAAAAAG8/bRZTdX4hOm0/s400/016_circulo_colisao.png" alt="" id="BLOGGER_PHOTO_ID_5146804473640038546" border="0" /></a>Existe colisão quando a soma dos raios for maior que a distância.<br />Esta função está bem otimizada, tanto é que, para calcular a distância não foi utilizada a raiz quadrada.<br /><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_0qjVkiNs-GQ/R20f41u0sKI/AAAAAAAAAHE/wtd1wjj_jig/s400/016_formula.png" alt="" id="BLOGGER_PHOTO_ID_5146805010510950562" border="0" />A distância não é realmente necessária, ela serve apenas como comparativo. Como o cálculo da raiz quadrada não é uma operação trivial, é preferível comparar todas as somas (raios e dx dy) em potência de 2.<br /><br /><b>int SDL_CollideBoundingCircle(SDL_Surface *a, int x1, int y1, SDL_Surface *b, int x2, int y2, int offset);</b><br />É uma variação da função anterior onde o raio do circulo é calculado por aproximação (r1 = (a.w+a.h) / 4).<br /><br />Download: <a href="http://sourceforge.net/project/showfiles.php?group_id=153582">SDL_Collide</a> (o código fonte já vem com a versão )<br /><br /><b>*** O exemplo ***</b><br />Aproveitando o <a href="http://diogorbg.blogspot.com/2007/12/gerando-e-carregando-mapas-2d-em-jogos.html">código anterior</a>, criei um jogo de labirinto com itens (quase um Pac-Man) para que ficasse bem claro como pode ser feita a implementação de um jogo com colisões.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_0qjVkiNs-GQ/R2_aRFu0sPI/AAAAAAAAAHs/PM78b7NJ0QE/s1600-h/016_exemplo.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_0qjVkiNs-GQ/R2_aRFu0sPI/AAAAAAAAAHs/PM78b7NJ0QE/s400/016_exemplo.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5147572886238966002"/></a>Para que ficasse funcional acabei complicando o código. Por isso vou explicar algumas das funções que realmente importam.<br />Não é sempre que se pode mover em todas as direções que pede o jogador, e é isso que a função mov() irá tratar:<br /><p class="bloco_cod">bool Play::mov(int movX,int movY,Mapa *mapa){<br /> if( !mov2(movX,movY,mapa) ){ //- teste de movimento em x e y<br /> if( !mov2(movX,0,mapa) ){ //- teste de movimento em x<br /> if( !mov2(0,movY,mapa) ) //- teste de movimento em y<br /> return 0;<br /> }<br /> }<br /> pegaItem(mapa);<br /> return 1;<br />}</p>A função mov2() é a função que realmente move o nosso smiley. Ela cria um retângulo auxiliar com a nova posição e testa colisão com todos os retângulos vizinhos:<br /><p class="bloco_cod">bool Play::mov2(int movX,int movY,Mapa *mapa){<br /> SDL_Rect aux = {box.x+movX,box.y+movY,box.w,box.h}, ret;<br /> int x,y,i,j,colisao;<br /> char t; //- tile<br /><br /> x = aux.x/W; //- coordenada x no mapa (aproximada)<br /> y = aux.y/H; //- coordenada y no mapa (aproximada)<br /><br /> //- loop nos tiles vizinhos<br /> for(j=-1;j<2;j++){ //- -1,0,1<br /> for(i=-1;i<2;i++){ //- -1,0,1<br /> try{<br /> t = mapa->tile(x+i,y+j);<br /> }catch(...){ //- fora da grade<br /> continue;<br /> }<br /> mapa->getRect(x+i,y+j,ret);<br /> colisao = SDL_CollideBoundingBox(aux,ret);<br /> if(colisao && (t==1 || t>3) ){ //- colisao com paredes<br /> //printf("colisao> %d,%d x %d,%d\n",aux.x,aux.y,ret.x,ret.y);<br /> return 0;<br /> }<br /> }<br /> }<br /> box.x += movX;<br /> box.y += movY;<br /> return 1;<br />}</p>Como eu disse, é possível otimizar as funções da SDL_Collide à sua maneira, e foi o que eu fiz:<br /><p class="bloco_cod">int SDL_CollideBoundingBox(SDL_Rect a, SDL_Rect b){<br /> if(b.x + b.w <= a.x) return 0;<br /> if(b.x >= a.x + a.w) return 0;<br /><br /> if(b.y + b.h <= a.y) return 0;<br /> if(b.y >= a.y + a.h) return 0;<br /><br /> return 1;<br />}</p><br />Fazer colisão usando o retângulo da própria imagem pode não ser uma boa. Meu personagem tem 32x32 e seu retêngulo de colisão apenas 20x20.<br />A movimentação não ficou muito boa. A explicação para isso é que não tratamos as colisões da melhor forma, pois sempre que há uma colisão não se faz absolutamente nada para corrigir.<br />Então é só ! Analise o código fonte para entender os detalhes.<br />Download: <a href="http://diogorbg.googlepages.com/016_cod_collide.zip">» código fonte</a><br /><br /><b>*** SinucaOS ***</b><br />Não tem como a gente falar de colisão de círculos sem lembrar de um jogo de sinuca.<br />Acredite, fazer um jogo de sinuca é realmente difícil. A física de um jogo de sinuca exige muito mais do que se pode ver. A tacada inicial, por exemplo, é uma explosão de colisões e isto fragiliza a implementação.<br /><a href="http://br.groups.yahoo.com/group/sinucaopensource/">SinicaOS</a> é um grupo que está desenvolvendo um jogo de sinuca open source em C e Allegro. Por enquanto, o foco principal é ter um simulador de física funcional.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_0qjVkiNs-GQ/R22lG1u0sMI/AAAAAAAAAHU/o4aOvXQzhFE/s1600-h/016_sinucaos.gif"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_0qjVkiNs-GQ/R22lG1u0sMI/AAAAAAAAAHU/o4aOvXQzhFE/s400/016_sinucaos.gif" alt="" id="BLOGGER_PHOTO_ID_5146951486075613378" border="0" /></a>A imagem acima(animação gif) mostra duas bolas grudadas no terceiro quadro. Isto mostra que não são poucos os problemas enfrentados.<br />Pode ser um bug do jogo, mas o grande causador deste problema é a quantidade de bolas, a proximidade entre elas e a alta precisão exigida. A maioria dos bons jogos de sinuca sobrem deste mesmo mal.<br /><br /><b>*** Link's ***</b><br />Download: <a href="http://diogorbg.googlepages.com/016_cod_collide.zip">» código fonte</a><br /><a href="http://www.libsdl.org/">» SDL</a> - Site oficial<br /><a href="http://sdl-collide.sourceforge.net/">» SDL_Collide</a> - Site do projeto<br /><br />---<br /><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_0qjVkiNs-GQ/R257nlu0sOI/AAAAAAAAAHk/RCMYqXLrlvc/s320/016_natal.gif" alt="" id="BLOGGER_PHOTO_ID_5147187344204673250" border="0"/>Feliz Natal !!!</span>Diogo_RBGhttp://www.blogger.com/profile/02121378674070181046noreply@blogger.com6tag:blogger.com,1999:blog-609718605568612758.post-24880554790821016402007-12-12T21:53:00.000-03:002007-12-13T09:39:02.788-03:001.000 Visitantes \o/<img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp1.blogger.com/_0qjVkiNs-GQ/R2CC3p_5ETI/AAAAAAAAAGU/Z-C2ukTBCv8/s320/015_1000.png" alt="" id="BLOGGER_PHOTO_ID_5143254667135357234" border="0"/>Agradeço a força de todos vocês ! Pois hoje a marca de 1.000 visitantes foi atingida !!!<br />Foram apenas 14 motivos para visitarem meu blog e são mais de 1.000 motivos para que eu continue com meu trabalho feito em horas vagas !!!<br /><br />É com grande satisfação que apresento:<br /><center><img src="http://bp3.blogger.com/_0qjVkiNs-GQ/R2CMPJ_5EUI/AAAAAAAAAGc/XjEmA9E8UmA/s400/015_tabela.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5143264966466933058"/></center>Mais uma vez... parabéns ao <b>visitante milenar</b>... só não tem prêmio !!!Diogo_RBGhttp://www.blogger.com/profile/02121378674070181046noreply@blogger.com3tag:blogger.com,1999:blog-609718605568612758.post-42780647779116064672007-12-12T19:50:00.001-03:002007-12-23T09:55:53.824-03:00Tocando música e sons com SDL_Mixer<img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp0.blogger.com/_0qjVkiNs-GQ/R2Bl5Z_5ERI/AAAAAAAAAGE/6JKAIZfSe7w/s320/014_som.png" alt="" id="BLOGGER_PHOTO_ID_5143222811362922770" border="0"><a href="http://www.libsdl.org/">SDL</a> é uma biblioteca básica, mas possui muitas bibliotecas de apoio. Uma delas é a <a href="http://www.libsdl.org/projects/SDL_mixer">SDL_Mixer</a>.<br />De acordo com alguns tutoriais que andei vendo por aí, a forma mais fácil de tocar música e efeitos sonoros em seu jogo feito em SDL é com SDL_Mixer.<br />Além de suportar mais formatos (wav, mp3, ogg, mid(Timidity instalado), ...) você não tem que se preocupar com a função <b>callback</b> que é utilizada na SDL.<br />Siga este passo a passo de como deixar o seu jogo mais divertido !!!<br /><br /><a id="link_014" href="javascript:mostrarPost('014');">» Post Completo...</a><span id="post_014" style="display:none;"><b>*** Instalando ***</b><br />Certifique-se que a lib SDL já esteja instalada. <a href="http://diogorbg.blogspot.com/2007/11/sdl-biblioteca-dos-jogos-2d.html">(Caso não esteja)</a><br />No Windows baixe o binário (<a href="http://www.libsdl.org/projects/SDL_mixer/release/SDL_mixer-devel-1.2.8-VC8.zip">SDL_mixer-devel-1.2.8-VC8.zip</a>), o pacote (<a href="http://prdownloads.sourceforge.net/devpaks/SDL_mixer-1.2.6-2mol.DevPak">SDL_mixer-1.2.6-2mol.DevPak</a>) ou use o repositório do Dev-Cpp.<br />No Linux baixe o binário (<a href="http://www.libsdl.org/projects/SDL_mixer/release/SDL_mixer-devel-1.2.8-1.i386.rpm">SDL_mixer-devel-1.2.8-1.i386.rpm</a>), o código para compilar (<a href="http://www.libsdl.org/projects/SDL_mixer/release/SDL_mixer-1.2.8.tar.gz">SDL_mixer-1.2.8.tar.gz</a>) ou use o repositório do Debian/Ubuntu (<a href="apt://libsdl-mixer1.2-dev">sudo apt-get install libsdl-mixer1.2-dev</a>).<br /><br />Para compilar é preciso, além de incluir a biblioteca <b>SDL_mixer.h</b>, linkar a lib ao seu projeto (-lSDL_mixer). exemplo: <b>gcc -o mix mix.c `sdl-config --cflags --libs` -lSDL_mixer</b><br />Caso esteja com problemas consulte: <a href="http://lazyfoo.net/SDL_tutorials/lesson03/index.php">» Setting up SDL Extension Libraries</a><br /><br /><b>*** Programando com SDL_mixer ***</b><br />Aqui temos os tipos que armazenam a musica e o efeito sonoro:<br /><p class="bloco_cod">#include <SDL/SDL_mixer.h><br />Mix_Music *musica = NULL; //- música de fundo<br />Mix_Chunk *bomba = NULL; //- efeito sonoro mixável.<br />Mix_Chunk *tiro = NULL;</p>Você deve inicializar e finalizar a SDL_Mixer assim como faz com a SDL:<br /><p class="bloco_cod">void init(){<br /> SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO);<br /> atexit(SDL_Quit);<br /> screen = SDL_SetVideoMode( W, H, 32, SDL_SWSURFACE);<br /> Mix_OpenAudio( 22050, MIX_DEFAULT_FORMAT, 2, 1024 ); //- inicializa SDL_Mixer<br /> atexit(Mix_CloseAudio);<br />}</p>Carrega o arquivo de música e os arquivos de som:<br /><p class="bloco_cod">void carregar(){<br /> musica = Mix_LoadMUS("007JamesBond.mid");<br /> bomba = Mix_LoadWAV("bomba.ogg");<br /> tiro = Mix_LoadWAV("tiro.wav");<br />}</p>Faz (uma única vez) a música tocar em loop:<br /><p class="bloco_cod">Mix_PlayMusic( musica, -1 );</p>E chama os efeitos sonoros sempre que precisar:<br /><p class="bloco_cod">Mix_PlayChannel( -1, bomba, 0 );<br />Mix_PlayChannel( -1, tiro, 0 );</p>Perceba que a principal diferença entre música e som é que música fica tocando em loop e som é um efeito sonoro que será mixado à musica sempre que for chamado.<br /><br /><b>*** O Exemplo ***</b><br />Este é o exemplo que criei para testar a SDL_Mixer:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_0qjVkiNs-GQ/R2Br9Z_5ESI/AAAAAAAAAGM/hx2qOIgM9rc/s1600-h/014_janela.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_0qjVkiNs-GQ/R2Br9Z_5ESI/AAAAAAAAAGM/hx2qOIgM9rc/s320/014_janela.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5143229477152166178"/></a>Não chega a ser um teclado, mas a intenção foi boa ! Ainda não sei como melhorar, mas estarei estudando.<br />EDIT (23/12/2007): Mudei o buffer de 4096 para 1024. Isso acelerou a mixagem das notas musicais ao som de fundo.<br />Download: <a href="http://diogorbg.googlepages.com/014_cod_mix.zip">» código fonte</a><br /><br /><b>*** Onde Encontar ?! ***</b><br />Onde encontrar músicas e efeitos sonoros para meus jogos ?!<br /><a href="http://www.mameworld.net/samples/Unofficial%20Samples.htm">» Arcade Accurate</a> (incluíndo o Pacman)<br /><a href="http://www.sunncity.com/music">» Sunncity</a> (mid's)<br /><a href="http://www.midiworld.com/">» Midiworld</a> (mid's)<br /><a href="http://www.simplythebest.net/sounds/">» Simply The Best</a><br /><a href="http://gh.ffshrine.org/">» Galbadia</a><br /><a href="http://www.findsounds.com/">» Find Sound</a> (ou Google msm !)<br />No eMule uma busca por "midis" ajuda bastante:<br />Mas de 500 Midis Heavy Metal.rar <a title="39475000CFFE770C62E0D219637F1D620">[hash]</a><br />[Midi] Classical Piano Midis...zip <a title="BD46BEACBA0836B0F22FEC925185E32A">[hash]</a><br />40000.mids.Nacional.e.Internacionais...rar <a title="9F1AB15186D5EC89D57E0F33FA09F062">[hash]</a><br /><br />Uma maneira de aproveitar melhor tudo isso é saber manipular programas de audio.<br />Pra Linux temos:<br />» Audacity (<a href="apt://audacity">sudo apt-get install audacity</a>) - Para editar audio.<br />» Rosegarden (<a href="apt://rosegarden">sudo apt-get install rosegarden</a>) - Editor de arquivos midi e de partituras.<br />» Timidity (<a href="apt://timidity">sudo apt-get install timidity</a>) - Sequenciador midi. Sem ele não tem como ouvir midi no Linux. dica: $ <b>timidity 007.mid -Ov 007.ogg</b> - Salva saída no formato ogg.<br /><br /><b>*** Link's ***</b><br />Download: <a href="http://diogorbg.googlepages.com/014_cod_mix.zip">» código fonte</a><br /><a href="http://www.libsdl.org/">» SDL</a><br /><a href="http://www.libsdl.org/projects/SDL_mixer">» SDL_Mixer</a> - Página do projeto<br /><a href="http://lazyfoo.net/SDL_tutorials/lesson11/index.php">» Playing Sounds</a> - Tutorial Lazy Foo<br /><a href="http://www.cs.clemson.edu/~malloy/courses/3dgames-2007/tutor/web/audio/audio.html">» OSG/SDL Tutorial 17</a> - Audio with SDL_Mixer<br /><a href="http://www.kekkai.org/roger/sdl/mixer/">» SDL_Mixer Tutorial</a><br /><a href="http://equipe.nce.ufrj.br/adriano/c/apostila/sdl/audio.html#audio">» Utilizando áudio com SDL_mixer</a><br /><br />---<br />Essa semana foi dura ! Aprendi muita coisa de uma vez !!!</span>Diogo_RBGhttp://www.blogger.com/profile/02121378674070181046noreply@blogger.com4tag:blogger.com,1999:blog-609718605568612758.post-15714414343448358282007-12-06T11:16:00.000-03:002007-12-06T12:45:09.739-03:00Gerando e carregando mapas 2D em jogos<img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_0qjVkiNs-GQ/R1gJe5_5ENI/AAAAAAAAAFk/vksh5-_eQOU/s320/013_mapa.png" alt="" id="BLOGGER_PHOTO_ID_5140869401212948690" border="0" />É comum utilizar mapas em jogos, pois facilita nas colisões, nos tilesets... em tudo !<br />No <a href="http://diogorbg.blogspot.com/2007/11/sdl-biblioteca-dos-jogos-2d.html">último post</a> falei sobre SDL e no <a href="http://diogorbg.blogspot.com/2007/11/analisador-lxico-de-arquivos-script.html">penúltimo</a> sobre analisadores. Este irá combinar tudo isso e mais um pouco.<br />Este será um exemplo prático de como gerar seus mapas e carregá-los em seu jogo.<br /><br /><a id="link_013" href="javascript:mostrarPost('013');">» Post Completo...</a><span id="post_013" style="display:none;"><b>*** O Gerador ***</b><br />Quem nasceu primeiro, o ovo ou a galinha ?! O mesmo pode te ocorrer quando for fazer um jogo e não possuir o editor de mapas do jogo que você ainda não fez.<br />Uma maneira rápida de criar um mapa é construindo um gerador "quase" genérico que pode ler os dados de um arquivo.bmp e converter em seus tilesets. Mas como é isso ?!<br />Abra o Paint ou o KolourPaint e crie uma imagem de 20x20. Dê um zoom de 800% ou mais e habilite a grade (Ctrl+G). Este é o editor que não vai te deixar na mão !<br />Depois de alguns cliques faço algo do tipo:<br /><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_0qjVkiNs-GQ/R1gKJJ_5EOI/AAAAAAAAAFs/hPhbtHOKjVc/s320/013_mapa1.png" alt="" id="BLOGGER_PHOTO_ID_5140870127062421730" border="0" />O gerador entra agora. Ele deverá converter cada pixel em um tile do seu jogo.<br />Se você for mais ousado pode fazer ele te gerar todos os detalhes de acabamentos.<br />No geral o código fica assim:<br /><p class="bloco_cod">//--- Função que gera o arquivo mapa.txt ---//<br />void gerar(){<br /> FILE *file = fopen("arquivo.txt","wb");<br /> ...<br /> for(j=0;j>img->h;j++){<br /> for(i=0;i>img->w;i++){<br /> if(i!=0)<br /> fprintf(file," ");<br /> fprintf(file,"%02X",getTile( getPix(img,i,j) ));<br /> }<br /> fprintf(file,"\n");<br /> }<br /> ...<br />}<br /><br />//--- Função de conversão da cor em tile ---//<br />int getTile(Uint32 cor){<br /> switch(cor){<br /> case 0x000000:<br /> return 1;<br /> case 0xffffff:<br /> return 0;<br /> }<br /> return 0;<br />}</p>Para usar o gerador que vem junto com o código: $ <b>./gerador mapa.bmp mapa.txt</b><br /><br /><b>*** O Analisador ***</b><br />O gerador não resolve tudo. Sempre irá existir um detalhe a mais. E mapas gerados são muito enquadrados.<br />Como nós ainda não temos nosso gerador e nem editor perfeito, iremos salvar os mapas em scripts. Isso facilita, pois você poderá fazer pequenos retoques à mão.<br />XML é uma boa opção neste caso, mas eu irei apresentar uma forma alternativa, o meu próprio script.<br />É o mesmo script que eu postei anteriormente (<a href="http://diogorbg.blogspot.com/2007/11/analisador-lxico-de-arquivos-script.html">link</a>) com algumas alterações para suportar dados em hexadecimal.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_0qjVkiNs-GQ/R1gLqZ_5EQI/AAAAAAAAAF8/uC7ltr2HITI/s1600-h/013_automato.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_0qjVkiNs-GQ/R1gLqZ_5EQI/AAAAAAAAAF8/uC7ltr2HITI/s320/013_automato.png" alt="" id="BLOGGER_PHOTO_ID_5140871797804699906" border="0" /></a>O arquivo script tem este formato:<br /><p class="bloco_cod"># Informações #<br />tiles = "tiles.bmp"<br />tile_w = 20<br />tile_h = 20<br />mapa_w = 20<br />mapa_h = 20<br /><br />[tiles[<br />0F 05 05 05 ...<br />07 02 00 00 ...<br />...<br />0D 04 04 04 ...<br />]]</p>Para rodar o analisador e ver exatamente o que está sendo lido: $ <b>./analisador</b> ou $ <b>./analisador mapa.txt</b><br /><br /><b>*** O Carregador ***</b><br />O carregador tbm é um analisador, e o código foi alterado para aproveitar o script no código.<br /><p class="bloco_cod">void Mapa::analisar(char *buf, int n){<br /> static string var,val; //- strings redimensionáveis<br /> ...<br /> switch(est){<br /> ...<br /> case VAR: //- trata variáveis<br /> if( let(c) || num(c) || c=='_')<br /> var += c;<br /> ...<br /> case VAL: //- trata valores<br /> ...<br /> else if(c=='\n' || c=='\r'){<br /> est = ZERO;<br /> setVar(var,val);<br /> }<br /> ...<br /> }<br />...<br />}<br /><br />void Mapa::setVar(const string var, const string val){<br /> if(var.empty() || val.empty())<br /> return;<br /> if(var=="tile_w") //- std::string permite este tipo de comparação<br /> TileW = atoi(val.c_str());<br /> else if(var=="tile_h")<br /> TileH = atoi(val.c_str());<br /> ...<br />}</p>O mapa é analisado e carregado para a classe <b>Mapa</b>. O resultado é o mapa "quase" pronto pra jogar !<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_0qjVkiNs-GQ/R1gLg5_5EPI/AAAAAAAAAF0/eL4gsMYqX84/s1600-h/013_mapa2.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_0qjVkiNs-GQ/R1gLg5_5EPI/AAAAAAAAAF0/eL4gsMYqX84/s320/013_mapa2.png" alt="" id="BLOGGER_PHOTO_ID_5140871634595942642" border="0" /></a>É muito parecido com o Pacman e dá até vontade de jogar, mas não se engane !<br />Eu não tratei colisão, apenas coloquei um smiley centralizado e fiz rolagem do mapa... o jogo é você quem deve fazer !<br /><br /><b>*** Link's ***</b><br />Download: <a href="http://diogorbg.googlepages.com/013_cod_mapa.zip">» código fonte</a> - Você precisa ter a lib SDL e linkar corretamente para compilar.<br /><a href="http://lazyfoo.net/SDL_tutorials/lesson29/index.php">» Tutorial Tiling (por Lazy Foo)</a> - Uma segunda referência<br /><a href="http://diogorbg.blogspot.com/2007/11/sdl-biblioteca-dos-jogos-2d.html">» SDL - A Biblioteca dos Jogos 2D</a><br /><a href="http://diogorbg.blogspot.com/2007/11/analisador-lxico-de-arquivos-script.html">» Analisador léxico de arquivos script</a></span>Diogo_RBGhttp://www.blogger.com/profile/02121378674070181046noreply@blogger.com7tag:blogger.com,1999:blog-609718605568612758.post-83025676350372477192007-11-21T11:10:00.000-03:002007-12-06T12:24:57.718-03:00SDL - A Biblioteca dos Jogos 2D<img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_0qjVkiNs-GQ/R0Q9uygB_vI/AAAAAAAAAEg/kMmrcQsRUhQ/s320/012_sdl.png" alt="" id="BLOGGER_PHOTO_ID_5135297349148606194" border="0" />Esta será uma abordagem para iniciantes em <a href="http://www.libsdl.org/">SDL</a>. Será o seu primeiro passo rumo à programação de jogos 2D.<br />Estarei utilizando o <a href="http://www.bloodshed.net/dev/index.html">Dev-Cpp</a> e também o <a href="http://pt.wikipedia.org/wiki/GNU_Compiler_Collection">gcc</a> no Linux.<br />Aprenda como instalar a SDL e como criar um projeto SDL no Dev-Cpp. Entenda como usar os parâmetros do linker no Dev-Cpp e no gcc.<br /><br /><a id="link_012" href="javascript:mostrarPost('012');">» Post Completo...</a><span id="post_012" style="display:none;"><b>*** SDL ***</b><br />A Simple DirectMedia Layer (SDL) é uma biblioteca multimídia multi-plataforma projetada para oferecer acesso de baixo nível a áudio, teclado, mouse, joystick, hardware 3D (usando OpenGL) e framebuffer de vídeo 2D.<br />Isso não caracteriza uma <a href="http://pt.wikipedia.org/wiki/Motor_de_jogo">engine</a>, mas sim uma <a href="http://pt.wikipedia.org/wiki/Api">API</a>. Entender uma engine pode levar anos, mas para entender a API da SDL pode levar apenas algumas semanas.<br />SDL é escrita em C, mas você pode utilizá-la nativamente em C++. Outra coisa é que ela possui ligações para várias outras linguagens: Ada, C#, Eiffel, Erlang, Euphoria, Guile, Haskell, Java, Lisp, Lua, ML, Objective C, Pascal, Perl, PHP, Pike, Pliant, Python, Ruby e Smalltalk.<br /><br /><b>*** Instalação ***</b><br />Primeiro vamos instalar o Dev-Cpp. Você poderá baixar a versão mais nova (com o compilador Mingw/GCC) <a href="http://www.bloodshed.net/dev/devcpp.html">aqui</a> ou baixar diretamente <a href="http://prdownloads.sourceforge.net/dev-cpp/devcpp-4.9.9.2_setup.exe">aqui</a>.<br />Instalado o Dev-Cpp vem a parte da SDL, que também é fácil. Você poderá baixar um pacote manualmente do <a href="http://devpaks.org/">devpaks</a> ou automaticamente utilizando o assistente do Dev-Cpp.<br />Para usar o assistente: vá em <b>Ferramentas | Atualizações</b>. Escolha um servidor de pacotes e mande atualizar. Marque o pacote SDL 1.2.8 ou superior e clique em download.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_0qjVkiNs-GQ/R0Q-nCgB_xI/AAAAAAAAAEs/ILf9str8R_4/s1600-h/012_dev1.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_0qjVkiNs-GQ/R0Q-nCgB_xI/AAAAAAAAAEs/ILf9str8R_4/s200/012_dev1.png" alt="" id="BLOGGER_PHOTO_ID_5135298315516247826" border="0" /></a>Após obter o pacote basta instalar como se este fosse um instalador qualquer. A vantagem do Dev-Cpp é que ele deixa tudo pronto para o uso.<br />Não deixando na mão aqueles que estiverem utilizando Linux: baixe o código fonte <a href="http://www.libsdl.org/download-1.2.php">aqui</a> e siga as instruções para compilar e instalar.<br />E pra quem estiver utilizando Ubuntu ou qualquer distribuição que funcione à base de apt-get:<br />$ <b>sudo apt-get update</b><br />$ <b>sudo apt-get install libsdl1.2-dev</b><br /><br /><b>*** SDL Hello World ***</b><br />Para se criar um novo projeto basta clicar em <b>Novo Projeto</b>. Aparecerá uma janela e clicando na aba <b>MultiMedia | SDL | OK</b> você já poderá rodar o código teste.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_0qjVkiNs-GQ/R0Q_lCgB_yI/AAAAAAAAAE0/R_nooZzkdLU/s1600-h/012_dev2.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_0qjVkiNs-GQ/R0Q_lCgB_yI/AAAAAAAAAE0/R_nooZzkdLU/s200/012_dev2.png" alt="" id="BLOGGER_PHOTO_ID_5135299380668137250" border="0" /></a>O Dev-Cpp te dá um código de teste logo quando se cria o projeto SDL. Irei aproveitar este código fazendo leves alterações e alguns comentários.<br />No Geral o código fica assim:<br /><p class="bloco_cod">#include <SDL/SDL.h><br />SDL_Surface *screen = NULL;<br />SDL_Surface *img = NULL;<br />void pintar_tela(){<br /> SDL_FillRect(screen, NULL, cor);<br /> SDL_BlitSurface(img, NULL,screen, NULL);<br />}<br />int main(int argc, char *argv[]){<br /> //--- Inicializando a SDL... ---//<br /> SDL_Init(SDL_INIT_VIDEO); //- sem tratar erro<br /> screen = SDL_SetVideoMode(640,480,32,SDL_SWSURFACE|SDL_DOUBLEBUF);<br /> SDL_WM_SetCaption("Título da aplicação", NULL);<br /> //--- Carregando... ---//<br /> img = SDL_LoadBMP("img.bmp");<br /> //--- GAME LOOP ---//<br /> int done=0;<br /> SDL_Event event;<br /> SDLKey key;<br /> while(!done){<br /> while(SDL_PollEvent(&event)){<br /> switch(event.type){<br /> case SDL_QUIT: //- evento para fechar a janela<br /> done = 1;<br /> break;<br /> }<br /> }<br /> pintar_tela();<br /> SDL_Flip(screen);<br /> SDL_Delay(1);<br /> }<br /> //--- Descarregando... ---//<br /> SDL_FreeSurface(img);<br /> SDL_Quit();<br /> return 0;<br />}</p>Download: <a href="http://diogorbg.googlepages.com/012_cod_sdl.zip">» código fonte</a><br /><br /><b>*** Compilando ***</b><br />Apenas apertar F9 pode não resolver o seu problema. Pode ocorrer algo do tipo:<br /><p class="bloco_cod">[Linker error] undefined reference to `SDL_Init'<br />[Linker error] undefined reference to `SDL_SetVideoMode'</p>Se isto ocorrer é porque está faltando algum parâmetro no projeto. Vá em <b>Opções do Projeto</b> e na aba <b>parâmetros</b> se certifique de encontrar <b>-lmingw32 -lSDLmain -lSDL</b> no campo <b>Linker</b>.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_0qjVkiNs-GQ/R0SnUSgB_zI/AAAAAAAAAE8/OhCo9a7du6s/s1600-h/012_dev3.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_0qjVkiNs-GQ/R0SnUSgB_zI/AAAAAAAAAE8/OhCo9a7du6s/s200/012_dev3.png" alt="" id="BLOGGER_PHOTO_ID_5135413442114617138" border="0" /></a>Se o seu caso for Linux, não se esqueça de incluir todos os comandos necessários. Para facilitar as coisas fiz um Makefile e para compilar basta digitar <b>$ make</b>.<br /><p class="bloco_cod"># -I/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT<br />SDL_CFLAGS=`sdl-config --cflags`<br /># -L/usr/lib -lSDL<br />SDL_LIBS=`sdl-config --libs`<br /><br />all: sdl<br />sdl: main.c<br /> gcc $< -o $@ $(SDL_CFLAGS) $(SDL_LIBS)</p><br /><b>*** O que mais devo saber ?! ***</b><br />Não se esqueça que seu programa em SDL precisa da <b>SDL.dll</b> para funcionar. Você poderá encontrá-la em C:\Dev-Cpp\bin. Se a SDL.dll não estiver junto ao seu programa ou em system32 seu executável será inútil.<br />No Linux a saida do printf é direcionada para o console normalmente, mas no Windows ela é direcionada para os arquivos <b>stdout.h</b> e <b>stderr.txt</b>.<br />Eu apresentei sobre a SDL, mas a lib Allegro também é muito boa.<br />SDL não é só isto não ! Você pode utilizar mais bibliotecas como:<br /><a href="http://www.libsdl.org/projects/SDL_image/">» SDL_Image</a> - Para carregar png, jpg e muitos outros formatos.<br /><a href="http://www.libsdl.org/projects/SDL_mixer/">» SDL_Mixer</a> - Para carregar ogg, mp3.<br /><a href="http://www.libsdl.org/projects/SDL_ttf/">» SDL_Ttf</a> - Para carregar fontes TrueType.<br /><a href="http://www.libsdl.org/projects/SDL_net/">» SDL_Net</a> - Para conexões socket. (Ainda vou testar !)<br /><a href="http://www.ferzkopp.net/joomla/content/view/19/14/">» SDL_Gfx</a> - Para fazer zoom, rotacionamentos e imprimir primitivas gráficas. (Não sei porque ela não está junta com as outras !)<br /><a href="http://sdl-collide.sourceforge.net/">» SDL_Collide</a> - Para testar colisões entre objetos. (Também não está junta com as outras !)<br />SDL_... Faz o seguinte... invente a sua !<br />Os jogos são mais do que uma biblioteca pode suportar, e sempre existirá uma brecha que não foi projetada. As primeiras engines não estavam preparadas para os <a href="http://en.wikipedia.org/wiki/MMORPG">MMORPG's</a> da vida e talvez as de hoje também não estejam !!!<br /><br /><b>*** Jogos ***</b><br />O meu jogo <a href="http://diogorbg.blogspot.com/2007/10/dr-quebra-cabea-disponvel-para-download.html">Quebra-Cabeça</a> foi feito em SDL. Mas ele não impressiona muito !<br />Você conhece o jogo Worms Armageddon ?<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_0qjVkiNs-GQ/R0SrwigB_1I/AAAAAAAAAFM/mMsUCRzWnPE/s1600-h/012_worms.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_0qjVkiNs-GQ/R0SrwigB_1I/AAAAAAAAAFM/mMsUCRzWnPE/s320/012_worms.jpg" alt="" id="BLOGGER_PHOTO_ID_5135418325492432722" border="0" /></a>Este é o <a href="http://www.wormux.org/wiki/en/index.php">Wormux</a>, é clone do Worms e é feito em SDL !!!<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_0qjVkiNs-GQ/R0SsrSgB_3I/AAAAAAAAAFc/MshNUGS-NIY/s1600-h/012_wormux08.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_0qjVkiNs-GQ/R0SsrSgB_3I/AAAAAAAAAFc/MshNUGS-NIY/s320/012_wormux08.jpg" alt="" id="BLOGGER_PHOTO_ID_5135419334809747314" border="0" /></a>Lançaram o Worms 3D e ainda não vi nenhum clone dele !<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_0qjVkiNs-GQ/R0SoJygB_0I/AAAAAAAAAFE/R-SeRjOp78E/s1600-h/012_worms3.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_0qjVkiNs-GQ/R0SoJygB_0I/AAAAAAAAAFE/R-SeRjOp78E/s320/012_worms3.jpg" alt="" id="BLOGGER_PHOTO_ID_5135414361237618498" border="0" /></a>SDL pode trabalhar com 3D utilizando OpenGl, mas de longe é o assunto deste post !<br /><br /><b>*** Testes ***</b><br />Meu PC não é dos mais modernos, mas é o único que tenho !!!<br />Pelos testes dá pra ver que 32bpp é o ideal !<br /><br />processador: AMD Athlon XP (2800+)<br />clock: 2.082 GHz<br />GPU: GeForce4 MX 4000 128MB<br /><b>[Ubuntu 7.04 + GPU]</b><br />174 FPS - 640x480x32 sem SDL_Delay<br /> 82 FPS - 640x480x32 com SDL_Delay(1)<br />120 FPS - 800x600x32 sem SDL_Delay<br /> 62 FPS - 800x600x32 com SDL_Delay(1)<br /> 76 FPS - 640x480x24 sem SDL_Delay<br /> 52 FPS - 800x600x24 sem SDL_Delay<br /> 90 FPS - 640x480x16 sem SDL_Delay<br /> 62 FPS - 800x600x16 sem SDL_Delay<br />152 FPS - 640x480x8 sem SDL_Delay<br />110 FPS - 800x600x8 sem SDL_Delay<br /><br /><b>*** Link's ***</b><br />Download: <a href="http://diogorbg.googlepages.com/012_cod_sdl.zip">» código fonte</a><br /><a href="http://www.libsdl.org/">» SDL</a><br /><a href="http://www.libsdl.org/docs.php">» SDL (Documentação)</a><br /><a href="http://lazyfoo.net/SDL_tutorials/index.php">» Lazyfoo (Tutoriais SDL)</a><br /><a href="http://vinigodoy.wordpress.com/2007/12/02/criando-uma-janela-sdl/">» Criando uma janela SDL (por Vinícius Godoy)</a><br /><a href="http://www.bloodshed.net/dev/index.html">» Dev-Cpp</a><br /><a href="http://diogorbg.blogspot.com/2007/09/compilando-com-gcc-e-makefile.html">» Compilando com gcc e Makefile</a><br /><a href="http://devpaks.org/">» Devpaks</a><br /><a href="http://www.wormux.org/wiki/en/index.php">» Wormux (Worms Clone)</a></span>Diogo_RBGhttp://www.blogger.com/profile/02121378674070181046noreply@blogger.com5tag:blogger.com,1999:blog-609718605568612758.post-50671146285851837352007-11-17T17:45:00.000-03:002007-11-17T19:36:17.060-03:00Analisador léxico de arquivos script<img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_0qjVkiNs-GQ/Rz9TZSgB_tI/AAAAAAAAAEQ/02EUfNB667I/s200/analisador.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5133913794153676498" />Análise léxica é o processo de analisar uma entrada de caracteres e produzir uma seqüência de símbolos chamado "símbolos léxicos" (lexical tokens) que podem ser manipulados mais facilmente (<a href="http://pt.wikipedia.org/wiki/An%C3%A1lise_l%C3%A9xica">Wikipédia</a>).<br />Analisar dados em um arquivo de texto é normal, mas quem nunca fez vai precisar de uma mãozinha.<br />Aprenda a criar um analisador e veja o meu exemplo de 100 linhas !<br /><br /><a id="link_011" href="javascript:mostrarPost('011');">» Post Completo...</a><span id="post_011" style="display:none;"><b>*** O Script ***</b><br />O script é este:<p class="bloco_cod"># Resolução da tela: 800,600 ou 1024,768 ou personalizado<br />resolucao = 800, 600<br /># FullScreen (Tela cheia): sim ou nao<br />fullscreen = sim<br /># Som: sim ou nao<br />son = sim<br /># Volume: de 0 até 100<br />volume = 90</p>XML é melhor para trabalhar com dados, mas um script tem suas vantagens e uma delas é a simplicidade.<br /><br /><b>*** Esboço ***</b><br />Sempre que vou criar um analisador, gosto de criar um esboço do que chamo de <a href="http://pt.wikipedia.org/wiki/Aut%C3%B4mato">Autômato</a>:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_0qjVkiNs-GQ/Rz9UiygB_uI/AAAAAAAAAEY/EgslKTlOKoQ/s1600-h/automato.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_0qjVkiNs-GQ/Rz9UiygB_uI/AAAAAAAAAEY/EgslKTlOKoQ/s320/automato.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5133915056874061538" /></a><br />Como eu disse, é apenas um esboço.<br /><b>[Estados (Bolinhas)]</b><br />0 - Estado inicial<br />1 - Trata variáveis<br />2 - Trata valores<br />3 - Trata strings<br />4 - Trata caractere \ de escape<br />5 - Trata comentários<br /><b>[Símbolos]</b><br />N - Números<br />L - Letras<br />* - Qualquer símbolo<br /><b>[Outros]</b><br />Um traço para um quadrado - Algo que terei que tratar no código.<br /><br /><b>*** Programação ***</b><br />Analisar um script é sopa !<br />O bom de um autômato é que você pode analisar e manipular ao mesmo tempo. Mas dependendo do número de regras a coisa vai se complicando.<br />Perceba que o autômato acima só possui 6 estados, e mesmo assim precisei de 100 linhas de código. <br /><br />» Primeiro é preciso de um loop para correr todos os caracteres.<br />» Cada estado pode ser visto como um <b>case:</b> num <b>switch</b>.<br />» Cada caractere lido é tratado por um <b>if</b> que além de outras coisas define o <b>est</b> (estado).<br />» Para ter mais organização, usei uma enumeração: <b>enum ESTADOS{ZERO, VAR, VAL, STR, ESC, COMENT}</b><br />» Para que a função analisadora pudesse analisar um bloco de cada vez, defini est como static: <b>static int est</b><br /><br />Não resolvi todos os problemas. A função analisadora funciona, mas ela simplesmente imprime o resultado na tela.<br />Uma boa estrutura de dados seria algo como:<p class="bloco_cod">struct Variavel{<br /> String nome;<br /> Lista valores; //- lista do tipo String<br />};<br />Lista variaveis; //- lista do tipo Variavel</p>Como será implementada a estrutura de dados fica a gosto do cliente !!!<br /><br /><b>*** Link's ***</b><br />Download: <a href="http://diogorbg.googlepages.com/011_cod_analisador.tar.gz">» Código fonte</a></span>Diogo_RBGhttp://www.blogger.com/profile/02121378674070181046noreply@blogger.com2tag:blogger.com,1999:blog-609718605568612758.post-37805952839162516952007-11-14T13:24:00.000-03:002007-11-14T16:44:44.841-03:00Dicas Web<img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_0qjVkiNs-GQ/Rzsn0Nv4CTI/AAAAAAAAADg/84sV3kSKybI/s320/web.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5132739978315958578" />Como você tem usando a Internet ?! Por favor não responda MSN e Orkut !<br />Existem diversos serviços disponíveis na Internet: <a href="http://www.google.com">Pesquisas</a>, <a href="http://www.google.com.br/language_tools">Tradutor</a>, <a href="http://mail.google.com">E-mail</a>, <a href="http://reader.google.com">RSS</a>, <a href="http://groups.google.com.br">Grupos</a>, <a href="http://forum.unidev.com.br/phpbb2/index.php">Fórum</a>, <a href="http://www.blogger.com/start">Blog</a>, <a href="http://pages.google.com">Página</a>.<br />Mesmo que voçê conheça todos, vale a pena conferir algumas dicas.<br /><br /><a id="link_010" href="javascript:mostrarPost('010');">» Post Completo...</a><span id="post_010" style="display:none;"><b>*** Google ***</b><br />Pode até parecer propaganda da Google, mas fazer o que ? A Google se tornou <a href="http://www.google.com.br/intl/pt-BR/options/">sinônimo de Internet</a>, e se por um dia todos os serviços da Google deixassem de funcionar seria o caus ! Melhor torcer para que este dia nunca chegue !<br />Com certeza você já sabe pesquisar no <a href="http://www.google.com">google</a>, mas vale a dica: <b>"site:diogorbg.blogspot.com linux"</b>. Desta forma você especifica o site da sua pesquisa.<br />Uma outra dica melhorzinha: Pesquise <b>"lang:c hello world"</b> em <a href="http://www.google.com/codesearch">www.google.com/codesearch</a> e você com certeza encontrará o código que estava procurando !<br /><br /><b>*** GMail ***</b><br />Quase todo mundo tem e-mail, mas o problema é que a maioria possui muuuitos !<br />Uma dica, pra você que tem 10 e-mail's e só consegue usar a metade, é fazer uma conta no <a href="http://www.google.com/gmail">GMail</a> ! Mas eu explico o porque.<br />É rápido, é simples, é grande (o meu tem 4.9GB), tem chat, é organizado (agrupa as mensagens por título), NÃO TEM SPAM, faz buscas (por mensagem ou por contato) e é da Google ! Mas essas ainda são vantagens comuns, a vantagem que eu considero maior fica em Configurações | Contas.<br />O GMail permite que você gerencie seus e-mail através de uma única conta GMail. Depois de configurado, você poderá receber todas as mensagens que foram enviadas a suas outras contas em seu GMail e ainda poderá responder em nome de qualquer uma de suas contas.<br /><br />» Primeiro passo: Vá em <b>Configurações | Contas</b> e clique em <b>Adicionar um outro endereço de e-mail</b> e adicione seu nome e e-mail(outra@conta.com).<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_0qjVkiNs-GQ/RztGgdv4CWI/AAAAAAAAAD4/8K8QK8c8GwU/s1600-h/add_email.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_0qjVkiNs-GQ/RztGgdv4CWI/AAAAAAAAAD4/8K8QK8c8GwU/s200/add_email.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5132773723874003298" /></a><br />» Segundo passo: Confirmação de e-mail. Apenas mande enviar a confirmação e confirme de seu outro e-mail.<br />» Ultimo Passo: No final ele irá pedir algumas configuração, que dependendo do caso você vai ter que se virar pra consegui !<br />No caso de uma conta GMail: Servidor POP:smtp.gmail.com porta:995<br />No caso de uma conta WebMail(UFT): Servidor POP:webmail.uft.edu.br porta:110<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_0qjVkiNs-GQ/RztGntv4CXI/AAAAAAAAAEA/CX1RWvgGDKw/s1600-h/config.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_0qjVkiNs-GQ/RztGntv4CXI/AAAAAAAAAEA/CX1RWvgGDKw/s200/config.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5132773848428054898" /></a><br />Crie marcadores a seu gosto ! Eles servem para organizar suas mensagens. Dê uma olhada também em Marcadores, Filtros e Encaminhamento POP<br /><br /><b>*** RSS ***</b><br /><a href="http://diogorbg.blogspot.com/feeds/posts/default">» RSS Portal C++</a><br /><a href="http://caccompuft.blogspot.com/feeds/posts/default">» RSS CACCOMP</a><br /><a href="http://almadonegocio.wordpress.com/feed/">» RSS Alma do Negócio</a><br /><a href="http://br-linux.org/linux/?q=node/feed">» RSS BR-Linux.org</a><br /><a href="http://info.abril.com.br/aberto/infonews/rssnews.xml">» RSS INFO Online</a><br />Como você faria para acompanhar todos estes sites de notícias ?! O jeito mais fácil é ter um leitor RSS e cadastrá-los. Se você já tem uma conta da Google basta usar o <a href="http://reader.google.com">reader</a>. Além de organizar as notícias você poderá fazer uma seleção e torná-la pública: <a href="http://www.google.com/reader/shared/user/07957824199806469071/label/website">RSS WebSite</a>.<br /><br /><b>*** Blog e Página ***</b><br />Assim como eu criei meu <a href="http://diogorbg.blogspot.com">Blog</a> e minha <a href="http://diogorbg.googlepages.com">Página</a>, você também poderá criar gratuitamente.<br />Aqui vai meu convite: Faça um blog ou página e o torne seu currículo online.<br />Ajude a mudar a escassez de material de estudo (realidade do Brasil) contribuindo um pouquinho, uma vez ou outra.<br />Se um material já existe, comente, dê um link do mesmo e contribua com algum exemplo que ainda não foi explorado pelo autor.<br />A muito tempo eu venho querendo fazer isso (<a href="http://diogorbg.bigbig.com">Portal C++ 04/02/2006</a>) e encontrei no Blog e Pages as ferramentas adequadas para isto. Não comentei sobre o WordPress, mas também é muito bom.<br /><br /><b>*** Mais Link's ***</b><br /><a href="http://pt.wikipedia.org/wiki/P%C3%A1gina_principal">» Wikipédia</a> - Enciclopédia Digital<br /><a href="http://hsw.uol.com.br/embreagem-dupla.htm">» HowStuffWorks</a> - Como funciona<br /><a href="http://www.hackerteen.com.br/">» HackerTeen</a> - Profissionalizando jovens para o bem. <a href="http://www.hackerteen.com.br/gibi_apagao/index.htm">gibi</a>.<br /><br />O objetivo da Internet não é de alienar as pessoas como a TV tem feito e nem de proporcionar um ambiente virtual de fraudes e roubos. Desfrute com sabedoria !<br /><br />---<br />Pode até serem dicas fraquinhas, mas é bom que todos saibam !<br />Se você conhece um site legal contribua com um comentário ;)</span>Diogo_RBGhttp://www.blogger.com/profile/02121378674070181046noreply@blogger.com0