<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6657623884375354590</id><updated>2011-12-31T12:26:07.615-08:00</updated><category term='Game design'/><category term='GameDev'/><category term='scratch'/><category term='XNA'/><category term='Demo'/><title type='text'>OctopusTeam blog</title><subtitle type='html'>O blog do time de desenvolvimento de games OctopusTeam</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.octopusteam.com.br/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6657623884375354590/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://blog.octopusteam.com.br/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Márcio Freitas</name><uri>http://www.blogger.com/profile/18409452405638213331</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>8</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6657623884375354590.post-7848880809702328516</id><published>2011-12-31T12:01:00.000-08:00</published><updated>2011-12-31T12:26:07.631-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scratch'/><title type='text'>Scratch de natal!</title><content type='html'>Neste natal, minha família resolveu dar um netbook pro meu sobrinho de oito anos, que já lida com o computador melhor que muita gente por aí.&lt;br /&gt;Como não podia deixar de ser, o gurí ficou todo satisfeito, e sobrou pro “tio Márcio” a tarefa de rechear o netbook com programas e jogos. E foi fazendo isso que encontrei na internet o &lt;a href="http://scratch.mit.edu/"&gt;Scratch&lt;/a&gt; . Trata-se de um ambiente de programação integrado destinado principalmente a crianças (mas não somente).&lt;br /&gt;Ao invés de digitar o código, você arrasta e conecta blocos de instruções como REPITA X VEZES ou SE-SENÃO.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;iframe allowfullscreen="" frameborder="0" height="300" mozallowfullscreen="" src="http://player.vimeo.com/video/4077929?title=0&amp;amp;byline=0&amp;amp;portrait=0" webkitallowfullscreen="" width="400"&gt;&lt;/iframe&gt;&lt;/center&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/4077929"&gt;Scratch&lt;/a&gt; from &lt;a href="http://vimeo.com/user1562133"&gt;Karen Brennan&lt;/a&gt; on &lt;a href="http://vimeo.com/"&gt;Vimeo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&amp;nbsp; Obviamente não é algo para desenvolvimento profissional, nem amador a ponto de qualquer criança conseguir fazer o que bem entender, mesmo assim é uma ferramenta incrível pra prototipar idéias e fazer jogos simples para estudo ou apenas por diversão.&lt;br /&gt;A curva de aprendizado é bem pequena e a facilidade de controlar sprites na cena e obter entrada do usuário faz do scratch o melhor ponto de partida pros leigos iniciarem na programação de jogos.&lt;br /&gt;Outra coisa bem interessante sobre o scratch é que é bem fácil publicar os projetos feitos nele. A própria IDE faz o upload pro portal do scratch, onde a comunidade pode jogar, comentar e baixar os "fontes" dos projetos. No portal, o projeto roda como uma applet java, mas há uma nova opção de rodar como flash.&lt;br /&gt;&lt;br /&gt;E claro, enquanto digeria a ceia de natal, comecei a fazer um pequeno game no scratch.&amp;nbsp;Comecei brincando com a lógica e vendo até onde poderia ir, e acabei me surpreendendo com as possibilidades desse programa. A mecânica já é conhecida e bastante simples. O jogador deve acertar as 3 bandeiras com um tiro de canhão para passar de fase. Para atirar, o jogador deve configurar o ângulo da parábola e a velocidade do tiro. São 4 fases ao todo, em especial a fase 3 é bastante desafiadora. Quantos tiros você precisa para completar as 4 fases ? &amp;nbsp;Espero que aqueles que jogarem se divirtam tanto quanto eu me diverti escrevendo. Bom Jogo! E boa programação pros que quiserem se aventurar (Se não conseguir visualizar o jogo nesta página, acesse diretamente por este &lt;a href="http://scratch.mit.edu/projects/marciovmf/2247583"&gt;link&lt;/a&gt;&amp;nbsp;).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;applet archive="ScratchApplet.jar" code="ScratchApplet" codebase="http://scratch.mit.edu/static/misc" height="387" id="ProjectApplet" style="display: block;" width="482"&gt;&lt;param name="project" value="../../static/projects/marciovmf/2247583.sb" /&gt;&lt;/applet&gt; Clique na bandeira verde no topo direito para começar o jogo.&lt;br /&gt;&lt;a href="http://scratch.mit.edu/projects/marciovmf/2247583"&gt;Saiba mais sobre este projeto&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;Feliz ano novo!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6657623884375354590-7848880809702328516?l=blog.octopusteam.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.octopusteam.com.br/feeds/7848880809702328516/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.octopusteam.com.br/2011/12/scratch-de-natal.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6657623884375354590/posts/default/7848880809702328516'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6657623884375354590/posts/default/7848880809702328516'/><link rel='alternate' type='text/html' href='http://blog.octopusteam.com.br/2011/12/scratch-de-natal.html' title='Scratch de natal!'/><author><name>Márcio Freitas</name><uri>http://www.blogger.com/profile/18409452405638213331</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6657623884375354590.post-9018563522716682578</id><published>2011-02-23T08:14:00.000-08:00</published><updated>2011-02-23T12:49:09.343-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Game design'/><title type='text'>Game Design por quem entende do assunto</title><content type='html'>Game Design é um conceito mal compreendido pela maioria das pessoas que não estão envolvidas com o mundo do desenvolvimento de jogos.&lt;br /&gt;&lt;br /&gt;É comum as pessoas confundirem com desing gráfico ou até mesmo design da arquitetura do software do jogo.Game design se trata de transformar uma idéia em um jogo de maneira que mantenha o jogador jogando. &lt;br /&gt;&lt;br /&gt;E para manter o jogador na frente do seu jogo, há uma quantidade enorme de pontos para se pensar como usabilidade, imersão, narrativa, dificuldade, rejogabilidade e inúmeras outras. Por isso o designer de um jogo precisa entender consideravelmente dos vários aspectos que envolvem a produção do jogo que pretende criar. Um game designer (na minha opinião) deve ser capaz de esboçar no papel a aparência dos personagens e ainda que de maneira simples, modelar um preview (ainda que simplista) de elementos de uma cena do jogo, conhecer tecnicamente a plataforma,linguagens, engines e ferramentas utilizadas no projeto do seu jogo.&lt;br /&gt;&lt;br /&gt;Possivelmente alguns vão discordar dessa minha visão, dizendo que o designer do jogo deve se abster dos aspéctos mais técnicos do processo. Bom, como todo apaixonado por desenvolvimento de jogos, procuro ler bastante me informar de como pensam os grandes nomes da indústria, e eis que encontro uma entrevista (antiga) com o Senhor Fumito Ueda, sobre o processo de desenvolvimento de ICO (jogo obrigatório para todo aspirante a game designer!). E nessa entrevista o Senhor Ueda, demonstra em diversos pontos sua multidisciplinaridade e como isso resultou num projeto sublime, que conhecemos como ICO.&lt;br /&gt;A entrevista pode ser lida na íntegra &lt;a href="http://www.1up.com/features/method-developing-ico"&gt;aqui&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Vou comentar aqui algumas partes da entrevista que suportam a visão que tenho do game designer:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-lYNXEaUPxxM/TWUw9RCyWqI/AAAAAAAAASU/AkpZ6ViXS8s/s1600/making-colossal-games-with-the-creators-of-iicoi-and-ishadow-of-the-colossusi--20060213043019866.jpeg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="149" src="http://1.bp.blogspot.com/-lYNXEaUPxxM/TWUw9RCyWqI/AAAAAAAAASU/AkpZ6ViXS8s/s200/making-colossal-games-with-the-creators-of-iicoi-and-ishadow-of-the-colossusi--20060213043019866.jpeg" width="200" /&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="color: #999999;"&gt;"In 1997, he got the idea to create a game with the universal theme of "boy meets girl," with the two main characters hand-in-hand during an adventure. To express the imagery behind this vague concept, he took an assistant and made a 3-minute movie using Lightwave."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ueda iniciou o projeto criando uma animação. Ok, tinha um assistente, mas não parou simplesmente na fase do "Tive uma idéia"!&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;span class="Apple-style-span" style="color: #999999;"&gt;"Full production on the game began in October 1998; the team had made the decision to go with hand-done key frame animation rather than motion capture. Ueda claims that actors weren't able to understand the situation and move appropriated..."&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;span class="Apple-style-span" style="color: #999999;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Aqui, da pra ver o quanto o designer estava comprometido com a sua visão do jogo, dispensou o uso da tecnologia de captura de movimentos e optou por animação manual por que os atores não compreendiam como se mover adequadamente.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-jXiGaR_qtkY/TWUvzoDul0I/AAAAAAAAASQ/DKfcMgVmWZM/s1600/images-1.jpeg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="121" src="http://3.bp.blogspot.com/-jXiGaR_qtkY/TWUvzoDul0I/AAAAAAAAASQ/DKfcMgVmWZM/s200/images-1.jpeg" width="200" /&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="color: #999999;"&gt;"Ueda wasn't satisfied with the results they were achieving, and became frustrated that the hardware wasn't capable of realizing his initial vision. He considered three options: either canceling the project outright, altering the design to try and finish the game on PSone, or changing platforms. After some deliberation, the team began converting the project for the PS2 hardware."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Aqui, o designer percebe que o hardware não estava sendo suficiente para alcaçar a visão inicial do jogo e ficam limitados a 3 opções: cancelar o projeto, alterar o design do jogo, ou mudar par outra plataforma. Como o jogo saiu para Playstation2 e não playstation, sabemos qual foi a decisão tomada. O importante aqui é o quanto o designer apostava na sua visão do gameplay e quanto compreendia da tecnologia em que estava trabalhando. Fico pensando na responsabilidade de entrar numa sala de reunião, e dizer para aqueles que pagam pelo projeto 2 anos depois de começado, que o hardware não é suficiente para implementar a visão inicial. Percebo que muita gente apostava na proposta inicial, afinal, não compete ao designer decidir se um jogo será cancelado ou não. Acredito que o que os executivos das empresas interessadas tinham era apenas o vídeo de 3 minutos, feito no início do projeto mostrando o gameplay que pretendiam alcançar, e ainda sim, mantiveram o design inicial e decidiram mudar a plataforma&lt;br /&gt;&lt;br /&gt;Ao longo da entrevista, as visão do Sr Ueda em relação a narrativa, roteiro e imersão são demonstradas como neste trecho onde ele explica uma decisão simples - e fundamental na atmosfera do jogo - de não legendar as falas da personagem Yorda.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-TuTXphQ1_Fc/TWUvzaq8R_I/AAAAAAAAASM/0jlZxmnDYnw/s1600/ico-351.jpeg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="135" src="http://4.bp.blogspot.com/-TuTXphQ1_Fc/TWUvzaq8R_I/AAAAAAAAASM/0jlZxmnDYnw/s200/ico-351.jpeg" width="200" /&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;span class="Apple-style-span" style="color: #999999;"&gt;"Explaining why he opted not to include subtitles for Yorda's dialogue, he said that it was critical to the physical contact and "holding hands" concept that the two not be able to communicate and talk to each other all the time during gameplay&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;."&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Outros exemplos da multidisciplinaridade inerente ao papel do designer, podem ser lidos &lt;a href="http://jeremyawon.info/sotcss/making_of_sotc/making_of_sotc.html"&gt;aqui&lt;/a&gt;, onde Ueda comenta tencicamente os efeitos de iluminação aplicados sobre as partículas implementadas para o jogo Shadow of  the Colossus (como a poeira que levanta quando os colossos andam por exemplo).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-C7vxj7a4Rnc/TWUvzCkXFiI/AAAAAAAAASI/qfsoXF8dZv8/s1600/3dwa102_thumb.jpeg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-C7vxj7a4Rnc/TWUvzCkXFiI/AAAAAAAAASI/qfsoXF8dZv8/s1600/3dwa102_thumb.jpeg" /&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="color: #999999;"&gt;"This is a method which performs lighting calculations using the relationship between the viewing direction and the lights affecting the particle, which creates an effect where the particle textures appear properly highlighted. The particles lighting calculation itself becomes expensive for the vector unit, but "the particle effect becomes 3D, because it is real-time and interactive, which is a big effect in itself."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Como eu disse no início do post, cabe ao designer conhcer tecnicamente os aspectos que envolvem a construção da sua visão. E pudemos ver pelas entrevistas que nos 2 grandes títulos concebidos por Fumito Ueda, ele esteve envolvido desde os aspectos mais técnicos do hardware até as facetas mais sutís da narrativa.&lt;br /&gt;&lt;br /&gt;Obviamente o processo de desenvolvimento de um jogo como ICO ou Shadow of the colossus não pode ser comparado a nenhum título produzido atualmente no Brasil, mas a essência do papel do designer, é a mesma desde o mais simples PONG até a sala mais escura do castelo de ICO.&lt;br /&gt;&lt;br /&gt;Quando eu crescer, quero ser que nem ele. Ha ha!&lt;br /&gt;&lt;br /&gt;Alguns links interessantes:&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=Jq9oCaYlBlE"&gt;ICO na fase de desenvolvimento para o PSOne&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.google.com.br/url?q=http://www.youtube.com/watch%3Fv%3DeSrMKC-3MX4&amp;amp;sa=X&amp;amp;ei=ASVlTZeHIszngQezv5zcBw&amp;amp;ved=0CDcQ8AEoADAB&amp;amp;usg=AFQjCNGvsZLcvnKfTF_a1dHITIWLP8WODA"&gt;Making of Shadow of the Colossus&lt;/a&gt;&lt;br /&gt;&lt;a href="http://sombradocolosso.blogspot.com/"&gt;Site brasileiro sobre Fumito Ueda e seus Games&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6657623884375354590-9018563522716682578?l=blog.octopusteam.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.octopusteam.com.br/feeds/9018563522716682578/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.octopusteam.com.br/2011/02/game-design-por-quem-entende-do-assunto.html#comment-form' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6657623884375354590/posts/default/9018563522716682578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6657623884375354590/posts/default/9018563522716682578'/><link rel='alternate' type='text/html' href='http://blog.octopusteam.com.br/2011/02/game-design-por-quem-entende-do-assunto.html' title='Game Design por quem entende do assunto'/><author><name>Márcio Freitas</name><uri>http://www.blogger.com/profile/18409452405638213331</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-lYNXEaUPxxM/TWUw9RCyWqI/AAAAAAAAASU/AkpZ6ViXS8s/s72-c/making-colossal-games-with-the-creators-of-iicoi-and-ishadow-of-the-colossusi--20060213043019866.jpeg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6657623884375354590.post-4565654688928156694</id><published>2010-10-21T16:34:00.000-07:00</published><updated>2010-10-21T17:07:25.567-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Demo'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><title type='text'>Terminal de comandos embutido no jogo</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;div&gt;No jogo que estamos fazendo, precisei continuamente reinicar o jogo para forçar o reload do cenário, ou inserir DrawString()’s no método Draw() para acompanhar o estado de algmas variáveis. Percebi que já havia tido necessidades semelhantes neste e em outros projetos. Decidi então que era hora de incluir um terminal que me permitisse automatizar ações comuns durante o desenvolvimento.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Muitos jogos utilizam um terminal para permitir que os jogadores ativem cheats ou façam configurações rápidas no contexto do jogo. Não sei dizer qual foi o primeiro game a incorporar um terminal de comandos mas acredito que apareceram na época dos vovô Quake2(alguém sabe ?).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Seja para Forçar Spawn de um NPC, Mostrar/Ocultar geometria de colisão ,Carregar/Recarregar um level, Exibir estatísticas (como uso de memória e Frame Rate) ou qualquer coisa você precise, um terminal é uma maneira confortável de interagir com seu jogo com o máximo de controle.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/SRlk23PaRkY?hl=pt&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/SRlk23PaRkY?hl=pt&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Utilizando o TerminalComponent&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;O terminal foi implementado segundo o padrão de projeto Singleton,&lt;br /&gt;A primeira coisa a fazer é inicializar o componente:&lt;/div&gt;&lt;table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="background: #D9D9D9; border-collapse: collapse; border: none; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;"&gt;&lt;tbody&gt;&lt;tr style="mso-yfti-firstrow: yes; mso-yfti-irow: 0; mso-yfti-lastrow: yes;"&gt;   &lt;td style="border: solid black 1.0pt; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-themecolor: text1; padding: 0cm 5.4pt 0cm 5.4pt; width: 422.0pt;" valign="top" width="563"&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US" style="color: blue; font-family: 'Courier New'; font-size: 10pt;"&gt;protected&lt;/span&gt;&lt;span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Initialize()&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="mso-layout-grid-align: none; mso-pagination: none; text-autospace: none; text-indent: 36.0pt;"&gt;&lt;span lang="EN-US" style="color: #2b91af; font-family: 'Courier New'; font-size: 10pt;"&gt;ConsoleComponent&lt;/span&gt;&lt;span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"&gt;.InitializeConsole(&lt;span style="color: blue;"&gt;this&lt;/span&gt;, 25);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="mso-layout-grid-align: none; mso-pagination: none; text-autospace: none; text-indent: 36.0pt;"&gt;&lt;span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"&gt;…&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;Agora basta, obter uma instância e adicionar a lista de componentes :&lt;/div&gt;&lt;table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="background: #D9D9D9; border-collapse: collapse; border: none; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;"&gt;&lt;tbody&gt;&lt;tr style="mso-yfti-firstrow: yes; mso-yfti-irow: 0; mso-yfti-lastrow: yes;"&gt;   &lt;td style="border: solid black 1.0pt; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-themecolor: text1; padding: 0cm 5.4pt 0cm 5.4pt; width: 422.0pt;" valign="top" width="563"&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US" style="color: #2b91af; font-family: 'Courier New'; font-size: 10pt;"&gt;ConsoleComponent &lt;/span&gt;&lt;span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"&gt;_terminal;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"&gt;…&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US" style="color: blue; font-family: 'Courier New'; font-size: 10pt;"&gt;protected&lt;/span&gt;&lt;span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Initialize()&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="mso-layout-grid-align: none; mso-pagination: none; text-autospace: none; text-indent: 36.0pt;"&gt;&lt;span lang="EN-US" style="color: #2b91af; font-family: 'Courier New'; font-size: 10pt;"&gt;ConsoleComponent&lt;/span&gt;&lt;span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"&gt;.InitializeConsole(&lt;span style="color: blue;"&gt;this&lt;/span&gt;, 25);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="mso-layout-grid-align: none; mso-pagination: none; text-autospace: none; text-indent: 36.0pt;"&gt;&lt;span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"&gt;_terminal = &lt;span style="color: #2b91af;"&gt;ConsoleComponent&lt;/span&gt;.GetConsole()&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="mso-layout-grid-align: none; mso-pagination: none; text-autospace: none; text-indent: 36.0pt;"&gt;&lt;span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"&gt;Components.Add(_terminal);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="mso-layout-grid-align: none; mso-pagination: none; text-autospace: none; text-indent: 36.0pt;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="mso-layout-grid-align: none; mso-pagination: none; text-autospace: none; text-indent: 36.0pt;"&gt;&lt;span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"&gt;…&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;Por padrão a tecla F2 é utilizada para exibir/ocultar o terminal. Caso seu jogo já utilize esta tecla (pouco provável :D), você pode redefini-la através da propriedade ShowHideKey. Por exemplo, se quisermos utilizar a letra “T” bastaria o seguinte:&lt;/div&gt;&lt;table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="background: #D9D9D9; border-collapse: collapse; border: none; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;"&gt;&lt;tbody&gt;&lt;tr style="mso-yfti-firstrow: yes; mso-yfti-irow: 0; mso-yfti-lastrow: yes;"&gt;   &lt;td style="border: solid black 1.0pt; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-themecolor: text1; padding: 0cm 5.4pt 0cm 5.4pt; width: 422.0pt;" valign="top" width="563"&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US" style="color: blue; font-family: 'Courier New'; font-size: 10pt;"&gt;protected&lt;/span&gt;&lt;span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Initialize()&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="mso-layout-grid-align: none; mso-pagination: none; text-autospace: none; text-indent: 36.0pt;"&gt;&lt;span lang="EN-US" style="color: #2b91af; font-family: 'Courier New'; font-size: 10pt;"&gt;ConsoleComponent&lt;/span&gt;&lt;span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"&gt;.InitializeConsole(&lt;span style="color: blue;"&gt;this&lt;/span&gt;, 25);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="mso-layout-grid-align: none; mso-pagination: none; text-autospace: none; text-indent: 36.0pt;"&gt;&lt;span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"&gt;_terminal = &lt;span style="color: #2b91af;"&gt;ConsoleComponent&lt;/span&gt;.GetConsole()&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="mso-layout-grid-align: none; mso-pagination: none; text-autospace: none; text-indent: 36.0pt;"&gt;&lt;span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"&gt;Components.Add(_terminal);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-indent: 36.0pt;"&gt;&lt;span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"&gt;_terminal.ShowHideKey = &lt;span style="color: #2b91af;"&gt;Keys&lt;/span&gt;.T;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="mso-layout-grid-align: none; mso-pagination: none; text-autospace: none; text-indent: 36.0pt;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="mso-layout-grid-align: none; mso-pagination: none; text-autospace: none; text-indent: 36.0pt;"&gt;&lt;span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"&gt;…&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;br /&gt;Pronto! Nosso game já tem um terminal! Mas pra que seja realmente útil, devemos definir alguns comandos, pois são eles – os comandos – a razão de ser do terminal.&lt;br /&gt;&lt;br /&gt;Adicionando comandos personalizados&lt;br /&gt;&lt;br /&gt;Vamos definir um comando chamado exit cuja função é finalizar o programa.&lt;br /&gt;A primeira coisa a fazer é criar um método que será executado quando o comando for chamado. Este método deve obedecer a assinatura do TerminalCommandDelegate, ou seja, retornar void e receber um string[] como parâmetro.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="background: #D9D9D9; border-collapse: collapse; border: none; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;"&gt;&lt;tbody&gt;&lt;tr style="mso-yfti-firstrow: yes; mso-yfti-irow: 0; mso-yfti-lastrow: yes;"&gt;   &lt;td style="border: solid black 1.0pt; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-themecolor: text1; padding: 0cm 5.4pt 0cm 5.4pt; width: 422.0pt;" valign="top" width="563"&gt;&lt;div class="MsoNormal" style="mso-layout-grid-align: none; mso-pagination: none; text-autospace: none;"&gt;&lt;span lang="EN-US" style="color: blue; font-family: 'Courier New'; font-size: 10pt;"&gt;private&lt;/span&gt;&lt;span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; ExitCommand(&lt;span style="color: blue;"&gt;string&lt;/span&gt;[] args)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="mso-layout-grid-align: none; mso-pagination: none; text-autospace: none;"&gt;&lt;span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="mso-layout-grid-align: none; mso-pagination: none; text-autospace: none;"&gt;&lt;span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp; Exit();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;Simples assim. Falta agora definir um comando no terminal que execute este método. Definir um comando é simplesmente passar para o método AddCommand o nome, uma descrição e um &lt;i style="mso-bidi-font-style: normal;"&gt;TerminalCommandDelegate&lt;/i&gt; (&lt;i style="mso-bidi-font-style: normal;"&gt;Delegate&lt;/i&gt; responsável pela execução do comando).&lt;/div&gt;&lt;div class="MsoNormal"&gt;Para o nosso comando &lt;i style="mso-bidi-font-style: normal;"&gt;exit&lt;/i&gt;, ficaria assim:&lt;/div&gt;&lt;table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="background: #D9D9D9; border-collapse: collapse; border: none; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;"&gt;&lt;tbody&gt;&lt;tr style="mso-yfti-firstrow: yes; mso-yfti-irow: 0; mso-yfti-lastrow: yes;"&gt;   &lt;td style="border: solid black 1.0pt; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-themecolor: text1; padding: 0cm 5.4pt 0cm 5.4pt; width: 422.0pt;" valign="top" width="563"&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US" style="color: blue; font-family: 'Courier New'; font-size: 10pt;"&gt;protected&lt;/span&gt;&lt;span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Initialize()&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="mso-layout-grid-align: none; mso-pagination: none; text-autospace: none; text-indent: 36.0pt;"&gt;&lt;span lang="EN-US" style="color: #2b91af; font-family: 'Courier New'; font-size: 10pt;"&gt;ConsoleComponent&lt;/span&gt;&lt;span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"&gt;.InitializeConsole(&lt;span style="color: blue;"&gt;this&lt;/span&gt;, 25);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="mso-layout-grid-align: none; mso-pagination: none; text-autospace: none; text-indent: 36.0pt;"&gt;&lt;span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"&gt;_terminal = &lt;span style="color: #2b91af;"&gt;ConsoleComponent&lt;/span&gt;.GetConsole()&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="mso-layout-grid-align: none; mso-pagination: none; text-autospace: none; text-indent: 36.0pt;"&gt;&lt;span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"&gt;Components.Add(_terminal);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-indent: 36.0pt;"&gt;&lt;span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"&gt;_terminal.ShowHideKey = &lt;span style="color: #2b91af;"&gt;Keys&lt;/span&gt;.T;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-indent: 36.0pt;"&gt;&lt;span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"&gt;_terminal.AddCommand(&lt;span style="color: #a31515;"&gt;"exit"&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"Terminates   the program"&lt;/span&gt;, ExitCommand);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="mso-layout-grid-align: none; mso-pagination: none; text-autospace: none; text-indent: 36.0pt;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="mso-layout-grid-align: none; mso-pagination: none; text-autospace: none; text-indent: 36.0pt;"&gt;&lt;span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"&gt;…&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"&gt;}&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;Podemos definir também comandos mais complexos que recebam parâmetros, simplesmente verificando o &lt;i style="mso-bidi-font-style: normal;"&gt;array&lt;/i&gt; de &lt;i style="mso-bidi-font-style: normal;"&gt;strings&lt;/i&gt; passado para o método do comando.&lt;/div&gt;&lt;div class="MsoNormal"&gt;Neste array, o primeiro elemento – índice zero – é sempre o nome do comando e os demais elementos, são os parâmetros passados para o comando.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;b style="mso-bidi-font-weight: normal;"&gt;Comandos pré-definidos&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;Além dos comandos que você definir para o terminal, existe sempre 2 comandos pré-definidos:&lt;/div&gt;&lt;table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="background: #D9D9D9; border-collapse: collapse; border: none; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;"&gt;&lt;tbody&gt;&lt;tr style="mso-yfti-firstrow: yes; mso-yfti-irow: 0; mso-yfti-lastrow: yes;"&gt;   &lt;td style="border: solid black 1.0pt; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-themecolor: text1; padding: 0cm 5.4pt 0cm 5.4pt; width: 422.0pt;" valign="top" width="563"&gt;&lt;div class="MsoNormal"&gt;&lt;i style="mso-bidi-font-style: normal;"&gt;Comando help   [comando]:&lt;o:p&gt;&lt;/o:p&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&amp;nbsp;Exibe a descrição   de um comando, ou&amp;nbsp; se invocado sem   parâmetros, exibe uma lista com todos os comandos definidos. &lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;i style="mso-bidi-font-style: normal;"&gt;Comando clear:&lt;o:p&gt;&lt;/o:p&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&amp;nbsp;Limpa o terminal   removendo todas as linhas de texto.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;Chamar o comando help passando o nosso comando exit como parâmetro, receberíamos como resposta, a descrição que criamos para o comando.&lt;/div&gt;&lt;table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="background: #D9D9D9; border-collapse: collapse; border: none; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;"&gt;&lt;tbody&gt;&lt;tr style="mso-yfti-firstrow: yes; mso-yfti-irow: 0; mso-yfti-lastrow: yes;"&gt;   &lt;td style="border: solid black 1.0pt; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-themecolor: text1; padding: 0cm 5.4pt 0cm 5.4pt; width: 422.0pt;" valign="top" width="563"&gt;&lt;div class="MsoNormal"&gt;help exit&lt;/div&gt;&lt;div class="MsoNormal"&gt;Command Description: Terminates the program&lt;/div&gt;&lt;div class="MsoNormal"&gt;&amp;gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;b style="mso-bidi-font-weight: normal;"&gt;Considerações Finais&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;Cabem aqui algumas considerações:&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;1 - É conveniente impedir que o game processe input do teclado enquanto o terminal estiver ativo.&amp;nbsp; Fazemos isso simplesmente impedindo que&amp;nbsp; qualquer outro processamento aconteça enquanto o terminal estiver ativo&lt;/div&gt;&lt;table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="background: #D9D9D9; border-collapse: collapse; border: none; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;"&gt;&lt;tbody&gt;&lt;tr style="mso-yfti-firstrow: yes; mso-yfti-irow: 0; mso-yfti-lastrow: yes;"&gt;   &lt;td style="border: solid black 1.0pt; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-themecolor: text1; padding: 0cm 5.4pt 0cm 5.4pt; width: 422.0pt;" valign="top" width="563"&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US" style="color: blue; font-family: 'Courier New'; font-size: 10pt;"&gt;protected&lt;/span&gt;&lt;span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Update(&lt;span style="color: #2b91af;"&gt;GameTime&lt;/span&gt;   gameTime)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&amp;nbsp;&amp;nbsp; &lt;span lang="EN-US" style="color: green; font-family: 'Courier New'; font-size: 10pt;"&gt;// Não processa input   se o terminal estiver ativo&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="mso-layout-grid-align: none; mso-pagination: none; text-autospace: none;"&gt;&lt;span lang="EN-US" style="color: blue; font-family: 'Courier New'; font-size: 10pt;"&gt;&amp;nbsp; if&lt;/span&gt;&lt;span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"&gt; (_terminal.State   == &lt;span style="color: #2b91af;"&gt;TerminalState&lt;/span&gt;.Active)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt;;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US" style="color: green; font-family: 'Courier New'; font-size: 10pt;"&gt;// processa input&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"&gt;HandleInput(gameTime);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"&gt;…&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;2 – O console deve sempre ser o último componente a ser desenhado , por isso, se durante a execução do jogo precisar adicionar um componente, adicione o componete com Insert() em alguma posição que não seja a última ou&lt;/div&gt;&lt;div class="MsoNormal"&gt;remova o terminal, adicione o componente e adicione o terminal novamente. &lt;/div&gt;&lt;table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="background: #D9D9D9; border-collapse: collapse; border: none; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;"&gt;&lt;tbody&gt;&lt;tr style="mso-yfti-firstrow: yes; mso-yfti-irow: 0; mso-yfti-lastrow: yes;"&gt;   &lt;td style="border: solid black 1.0pt; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-themecolor: text1; padding: 0cm 5.4pt 0cm 5.4pt; width: 422.0pt;" valign="top" width="563"&gt;&lt;div class="MsoNormal" style="mso-layout-grid-align: none; mso-pagination: none; text-autospace: none;"&gt;&lt;span lang="EN-US" style="color: green; font-family: 'Courier New'; font-size: 10pt;"&gt;//Remove o terminal&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"&gt;Components.Remove(&lt;span style="color: #2b91af;"&gt;ConsoleComponent&lt;/span&gt;.GetConsole());&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="mso-layout-grid-align: none; mso-pagination: none; text-autospace: none;"&gt;&lt;span lang="EN-US" style="color: green; font-family: 'Courier New'; font-size: 10pt;"&gt;//Adiciona o novo componente&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"&gt;Components.Add(outroComponente);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="mso-layout-grid-align: none; mso-pagination: none; text-autospace: none;"&gt;&lt;span lang="EN-US" style="color: green; font-family: 'Courier New'; font-size: 10pt;"&gt;//Adiciona novamente o terminal&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"&gt;Components.Add(&lt;span style="color: #2b91af;"&gt;ConsoleComponent&lt;/span&gt;.GetConsole());&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;3 - Como o terminal é um &lt;i style="mso-bidi-font-style: normal;"&gt;Singleton&lt;/i&gt; podemos obter uma referencia em qualquer parte do programa e utilizá-lo como saída padrão de erros, mensagens e exceções.&lt;/div&gt;&lt;table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="background: #D9D9D9; border-collapse: collapse; border: none; mso-background-themecolor: background1; mso-background-themeshade: 217; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;"&gt;&lt;tbody&gt;&lt;tr style="mso-yfti-firstrow: yes; mso-yfti-irow: 0; mso-yfti-lastrow: yes;"&gt;   &lt;td style="border: solid black 1.0pt; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-themecolor: text1; padding: 0cm 5.4pt 0cm 5.4pt; width: 422.0pt;" valign="top" width="563"&gt;&lt;div class="MsoNormal"&gt;#if DEBUG&lt;/div&gt;&lt;div class="MsoNormal"&gt;&amp;nbsp;&lt;span lang="EN-US" style="color: #2b91af; font-family: 'Courier New'; font-size: 10pt;"&gt;ConsoleComponent&lt;/span&gt;&lt;span lang="EN-US" style="font-family: 'Courier New'; font-size: 10pt;"&gt;.GetConsole().WriteLine(“Recarregando   cenário”, Color.White);&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;#endif&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;b style="mso-bidi-font-weight: normal;"&gt;Conclusão&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;É isso! O terminal será tão útil quanto os comandos que você definir para ele.. &lt;/div&gt;&lt;div class="MsoNormal"&gt;Deixe um comentário aqui ou mande um e-mail se este componente foi útil ao seu projeto ok ?&lt;br /&gt;&lt;br /&gt;Baixe &lt;a href="http://www.octopusteam.com.br/blog/TerminalDemo.zip"&gt;aqui&lt;/a&gt; o demo.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6657623884375354590-4565654688928156694?l=blog.octopusteam.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.octopusteam.com.br/feeds/4565654688928156694/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.octopusteam.com.br/2010/10/terminal-de-comandos-embutido-no-jogo.html#comment-form' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6657623884375354590/posts/default/4565654688928156694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6657623884375354590/posts/default/4565654688928156694'/><link rel='alternate' type='text/html' href='http://blog.octopusteam.com.br/2010/10/terminal-de-comandos-embutido-no-jogo.html' title='Terminal de comandos embutido no jogo'/><author><name>Márcio Freitas</name><uri>http://www.blogger.com/profile/18409452405638213331</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6657623884375354590.post-7647050332900184232</id><published>2010-10-18T13:00:00.000-07:00</published><updated>2010-10-21T16:34:01.826-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Demo'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='GameDev'/><title type='text'>Componente XNA de Lockpick</title><content type='html'>Depois de MUITO tempo sem postar, retomo a vida e as atividades anunciando a conclusão de um componente de lockpicking...&lt;br /&gt;&lt;br /&gt;Lockpicking já é um recurso batante conhecido e amplamente utilizado em diversos jogos. Quem já jogou Splinter Cell, Oblivion ,Fallout (sim, usamos os gráficos de fallout neste demo)  e etc. , já se deparou com essa forma de ganhar acesso a uma área, ou item protegido por uma tranca.&lt;br /&gt;&lt;br /&gt;&lt;object height="295" style="background-image: url(http://i1.ytimg.com/vi/tQ1ssRA3D8w/hqdefault.jpg);" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/tQ1ssRA3D8w?fs=1&amp;amp;hl=pt_BR"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/tQ1ssRA3D8w?fs=1&amp;amp;hl=pt_BR" width="480" height="295" allowScriptAccess="never" allowFullScreen="true" wmode="transparent" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;LockpickComponent é um componente XNA (Duh!) e pode ser integrado em qualquer jogo facilmente.&lt;br /&gt;A mecânica é bem conhecida. Deve-se encontrar um ponto na circunferência que permita  girar a tranca até o fim (45graus) para destrancá-la.&lt;br /&gt;Ao forçar a tranca entretanto, dependendo de quão longe da posição de abrir estiver o pino, mais ou menos dano é aplicado sobre este. O pino pode quebrar se receber muito dano. Caso hajam mais pinos disponíveis, o componente automaticamente posiciona um pino novo para que o jogador possa tentar novamente.&lt;br /&gt;&lt;br /&gt;Baseado na dificuldade escolhida, o componente gera um intervalo aleatório onde o pino deve ser posicionado que a tranca possa ser aberta.  Quanto mais próximo o pino estiver deste intervalo, mais a chave de fenda conseguirá girar a tranca. Assim, é possível girar a tranca até bem próximo do fim e perceber que o pino apesar de próximo, ainda não está na posição ideal.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;O construtor recebe além da referência ao game, a dificuldade e o total de pinos disponíveis para abrir a tranca.&lt;br /&gt;A assinatura do construtor é a seguinte:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;div&gt;&lt;code&gt;&lt;br /&gt;public LockpickComponent(Game pGame, Difficulty pDificulty, int pPinCount)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Logo, uma tranca com dificuldade normal, tendo 3 pinos disponíveis ficaria assim:&lt;br /&gt;&lt;code&gt;  &lt;br /&gt;LockpickComponent _lpc;&lt;br /&gt;…&lt;br /&gt;// Uma tranca de dificuldade Normal. O jogador terá 3 pinos para tentar abri-la&lt;br /&gt;_lpc = new LockpickComponent(this, _Difficulty.NORMAL, 3);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Ao criar uma instância do componente, pode-se configurar alguns handlers para os 3 eventos gerados pelo componente:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;// Evento ao abrir a tranca&lt;br /&gt;_lpc.OnUnlock += onLockEvent;&lt;br /&gt;// Evento ao desistir de abrir a tranca&lt;br /&gt;_lpc.OnCancelPickinLock += onLockEvent;&lt;br /&gt;// Evento ao quebrar todos os pinos disponíveis&lt;br /&gt;_lpc.onBreakAllPins += onLockEvent;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Ao iniciar, o componente faz uma pequena animação, aproximando a “câmera”.  O zoom máximo pode ser customizado através da propriedade Scale, sendo 1.0 o tamanho original. No demo o valor padrão (1.5) foi utilizado.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;this.Components.Remove(_lpc);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;No demo,  associei todos os eventos ao mesmo método, que simplesmente habilita o menu e remove o componente deixando a tela principal visível novamente. Em um jogo real, provavelmente você queira associar o eventos a rotinas que atualizem o inventário do personagem para debitar o numero de pinos usados, , abra uma porta em caso de sucesso e obviamente, remova o componente no final.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;O demo pode ser baixado &lt;a href="http://www.octopusteam.com.br/blog/LockPickDemo.zip"&gt;aqui&lt;/a&gt;&amp;nbsp;Lembrando que é preciso o &lt;a href="http://download.microsoft.com/download/5/9/1/5912526C-B950-4662-99B6-119A83E60E5C/xnafx31_redist.msi"&gt;xna runtime&lt;/a&gt; 3.1 para que o demo execute corretamente.&lt;br /&gt;&lt;br /&gt;:)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6657623884375354590-7647050332900184232?l=blog.octopusteam.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.octopusteam.com.br/feeds/7647050332900184232/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.octopusteam.com.br/2010/10/componente-xna-de-lockpick.html#comment-form' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6657623884375354590/posts/default/7647050332900184232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6657623884375354590/posts/default/7647050332900184232'/><link rel='alternate' type='text/html' href='http://blog.octopusteam.com.br/2010/10/componente-xna-de-lockpick.html' title='Componente XNA de Lockpick'/><author><name>Márcio Freitas</name><uri>http://www.blogger.com/profile/18409452405638213331</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6657623884375354590.post-207603663003838378</id><published>2009-10-05T17:03:00.000-07:00</published><updated>2009-10-05T18:11:39.429-07:00</updated><title type='text'>Videogames Live 2009</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_q-bdxyNqYPg/SsqYstNQAJI/AAAAAAAAAIg/aNhjvlOsHak/s1600-h/orquestra.jpg"&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_q-bdxyNqYPg/SsqTEnrU_pI/AAAAAAAAAHI/76-WIQ5MVnA/s1600-h/video-games-live5.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 248px; height: 166px;" src="http://3.bp.blogspot.com/_q-bdxyNqYPg/SsqTEnrU_pI/AAAAAAAAAHI/76-WIQ5MVnA/s320/video-games-live5.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5389281611681693330" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;Um evento incrível, emocionante e imperdível para qualquer nerd/gamer que se preze!&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;Aconteceu ontem no Canecão aqui no Rio de Janeiro o Videogames Live 2009, o show teve de tudo pra agradar desde a geração 8bit até a geração PS3.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Logo de início houve um concurso de cosplay e dentre as  figurinhas de sempre como Mário&lt;/div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;img src="http://4.bp.blogspot.com/_q-bdxyNqYPg/SsqYMFlj2YI/AAAAAAAAAIY/H7LOIr3Svsk/s320/cosplay.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5389287237527787906" style="float: right; margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 10px; cursor: pointer; width: 320px; height: 211px; " /&gt;&lt;/span&gt;&lt;div&gt; (Super Mario Bross) e Link (Zelda) destacaram-se um Cyrax (Mortal Kombat 3) e um Naked Snake (Metal Gear 3)  que chegou ao palco em uma caixa nas proporções exatas da que se vê no game! Sabe aquilo de ver uma caixa movendo-se com um par de perninhas debaixo ? Eu não imaginava que dava pra fazer aquilo tão perfeitamente.&lt;/div&gt;&lt;div&gt;Me impressionou como o cidadão saía e logo depois se escondia na caixa... Haja flexibilidade!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;img src="http://2.bp.blogspot.com/_q-bdxyNqYPg/SsqXva6MSwI/AAAAAAAAAIQ/7M4t3-9gyUk/s320/metal_slug.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5389286745035262722" style="float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; width: 150px; height: 103px; " /&gt;&lt;/span&gt;&lt;div&gt;O quesito humor entretanto foi decisivo para que um sujeito descalço trajando uma bermuda, uma peruca de cabelos compridos e bigode vencesse a competição, denominando-se o “Prisioneiro de Metal Slug”. Obviamente depois de realizar os movimentos bruscos do personagem e arrancar risadas da plateia... não dava pra não dar a vitória pro cara! Realmente foi algo muito divertido.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;Quanto ao show, muita coisa boa preparada especialmente para a apresentação no Brasil. O apresentador e co-criador do evento, mencionou que muitas músicas haviam sido retiradas do repertório, mas retornaram pois eram pedidos constantemente pelo público brasileiro.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;O ponto alto da noite, foi o momento em que o compositor de Snake Eater -  &lt;a href="http://pt.wikipedia.org/wiki/Norihiko_Hibino"&gt;Norihiko Hibino&lt;/a&gt;  - foi anunciado e subiu ao palco para tocar sua obra - Tema de abertura de Metal Gear 3 - junto a orquestra. Norihiko, deixou o palco visivelmente emocionado com o público aplaudindo-o de pé. &lt;/div&gt;&lt;div&gt;A presença de Norihiko realmente foi um presente para os Brasileiros. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_q-bdxyNqYPg/SsqYstNQAJI/AAAAAAAAAIg/aNhjvlOsHak/s1600-h/orquestra.jpg"&gt;&lt;img src="http://3.bp.blogspot.com/_q-bdxyNqYPg/SsqYstNQAJI/AAAAAAAAAIg/aNhjvlOsHak/s320/orquestra.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5389287797919056018" style="float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; width: 320px; height: 240px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Das músicas que não se podem deixar de mencionar, tema de Mario Bross onde a plateia acompanhava a orquestra com onomatopéias estilo “tananãn”, tema de Shadow of the colossus que misturava a música de abertura com uma das batalhas de colossus, tema de Halo, Warcraft e finalmente os temas de Chrono Trigger e Crhono Cross. Um show que vale cada centavo pelo seu conteúdo. Infelizmente, alguns pecados na organização e infra-estrutura deixaram a desejar. A iluminação foi terrível, as luzes não deixavam enxergar o telão central, e aleatóriamente eram apontadas para o público cegando-nos completamente. Em outros casos, deveria haver iluminação mais fraca para que se pudesse ver detalhes como luzes nos trajes de cosplays que subiam ao palco em determinados momentos, entretanto vergonhosamente só haviam spots com iluminação intensa a todo tempo. A qualidade do som também não foi das melhores, apesar da apresentação impecável da Sinfônica Vila Lobos, o som da orquestra estava baixo ao ponto da platéia em coro pedir “Aumentem a orquestra!”.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;Mesmo com as falhas de infra-estrutura ou organização, não sei bem, o show foi, como já havia dito, sensacional, e vale cada centavo dos 140 reais que custou o ingresso. Saímos do show  com gostinho de quero mais, e já ansiosos pelo que virá no ano que vem.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6657623884375354590-207603663003838378?l=blog.octopusteam.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.octopusteam.com.br/feeds/207603663003838378/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.octopusteam.com.br/2009/10/vvideogames-live-2009.html#comment-form' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6657623884375354590/posts/default/207603663003838378'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6657623884375354590/posts/default/207603663003838378'/><link rel='alternate' type='text/html' href='http://blog.octopusteam.com.br/2009/10/vvideogames-live-2009.html' title='Videogames Live 2009'/><author><name>Márcio Freitas</name><uri>http://www.blogger.com/profile/18409452405638213331</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_q-bdxyNqYPg/SsqTEnrU_pI/AAAAAAAAAHI/76-WIQ5MVnA/s72-c/video-games-live5.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6657623884375354590.post-2839200728240900678</id><published>2009-07-14T17:15:00.000-07:00</published><updated>2009-07-14T18:10:31.124-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GameDev'/><title type='text'>Simplesmente divertido</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_q-bdxyNqYPg/Sl0g0uLAH3I/AAAAAAAAAGA/J_8F80rPa90/s1600-h/1.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 180px; height: 400px;" src="http://2.bp.blogspot.com/_q-bdxyNqYPg/Sl0g0uLAH3I/AAAAAAAAAGA/J_8F80rPa90/s400/1.png" alt="" id="BLOGGER_PHOTO_ID_5358475221760221042" border="0" /&gt;&lt;/a&gt;Hoje encontrei perdido no meu HD de backup, o primeiro game 3D que fiz, há un 1 ano quando comecei a estudar GameDev.  Este jogo é para celulares feito em JAVA e simula a velha brincadeira de fincar uma faca entre os dedos com a mão apoiada sobre a mesa.&lt;br /&gt;O jogo move a faca em arco variando o raio, ora mais perto das extremidades dos dedos, ora mais perto do centro da mão. O jogador tem então 30 segundos para fincar a faca na mesa o maior numero de vezes possível.  A cada acerto, soma-se 1 segundo ao tempo de jogo, a cada erro, subtraem-se 2 segundos do tempo de jogo. Obviamente o jogo emite gritos de dor quando um dedo é atingido e o vibrador do celular é ativado por uma fração de segundo.&lt;br /&gt;&lt;br /&gt;Eu pensava ter perdido este game durante um particionamento mal sucedido no meu notebook.&lt;br /&gt;Depois de enxugar as lágrimas dos olhos (eu me emocionei ao reencontrar meu primeiro game!).&lt;br /&gt;Perdi uns minutos jogando no emulador e pesando na simplicidade desta idéia. Quase me surpreendendo de quão divertido este game é. Uma brincadeira tremendamente simples tornou-se um game divertido de jogar. E isso é basicamente o que importa para o jogador. Diversão!&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_q-bdxyNqYPg/Sl0hCvjnWpI/AAAAAAAAAGI/xeH22eGK6xw/s1600-h/2.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 176px; height: 400px;" src="http://1.bp.blogspot.com/_q-bdxyNqYPg/Sl0hCvjnWpI/AAAAAAAAAGI/xeH22eGK6xw/s400/2.png" alt="" id="BLOGGER_PHOTO_ID_5358475462650059410" border="0" /&gt;&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;Não adianta um game com gráficos arrasadores se não tiver um gameplay divertido! Em muitos casos menos é mais. Antigamente, não era possível ter os gráficos que temos hoje e não haviam recursos computacionais para simulações físicas complexas tais como vemos nos jogos atuais.&lt;br /&gt;Nessa época, os jogos valiam a diversão que ofereciam. Vai dizer q nunca passou uma tarde inteira jogando Enduro, pitfall ou Pac-man ? Lembre-se como eram toscos (visualmente) mas como eram divertidos estes games!&lt;br /&gt;&lt;br /&gt;Vamos fazer uma comparação tosca, &lt;span style="font-style: italic;"&gt;Assassins Creed&lt;/span&gt; Versus &lt;span style="font-style: italic;"&gt;Tetris&lt;/span&gt;. Claro que se compararmos gráficos tetris nem entra na disputa, mas e quanto ao desafio ? E diversão ? &lt;span style="font-style: italic;"&gt;Assassins Creed&lt;/span&gt; é um jogaço, mas depois da segunda ou terceira "missão" você começa a ver que todas vão ser iguais...&lt;br /&gt;O jogo não te desafia (apesar de ainda ser um bom jogo! Não me crucifique!), enquanto cada partida de &lt;span style="font-style: italic;"&gt;tetris &lt;/span&gt;é nova e imprevisível!&lt;br /&gt;&lt;br /&gt;No game que estou desenvolvendo atualmente, me deparo em momentos onde ainda não decidí como certas ações serão feitas pelo jogador. Com certeza, o ponto de partida para decidir será  respondendo a pergunta: "&lt;span style="font-weight: bold; font-style: italic;"&gt;Como fica mais divertido ?&lt;/span&gt;"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6657623884375354590-2839200728240900678?l=blog.octopusteam.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.octopusteam.com.br/feeds/2839200728240900678/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.octopusteam.com.br/2009/07/simplesmente-divertido.html#comment-form' title='7 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6657623884375354590/posts/default/2839200728240900678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6657623884375354590/posts/default/2839200728240900678'/><link rel='alternate' type='text/html' href='http://blog.octopusteam.com.br/2009/07/simplesmente-divertido.html' title='Simplesmente divertido'/><author><name>Márcio Freitas</name><uri>http://www.blogger.com/profile/18409452405638213331</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_q-bdxyNqYPg/Sl0g0uLAH3I/AAAAAAAAAGA/J_8F80rPa90/s72-c/1.png' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6657623884375354590.post-2666598780783577113</id><published>2009-07-09T14:50:00.000-07:00</published><updated>2009-07-09T10:50:28.808-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GameDev'/><title type='text'>O primeiro game – 5 dicas para começar</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_q-bdxyNqYPg/SlYmxpjkItI/AAAAAAAAAF4/6Hd86PKaQEI/s1600-h/tic+tac+toe.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 181px; height: 200px;" src="http://3.bp.blogspot.com/_q-bdxyNqYPg/SlYmxpjkItI/AAAAAAAAAF4/6Hd86PKaQEI/s200/tic+tac+toe.gif" alt="" id="BLOGGER_PHOTO_ID_5356511441214251730" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Todo geek ama video-games! Como todo bom geek, eu sempre quis criar meus próprios games. A estrada para a criar games é árdua, longa e a curva de aprendizado é grande. Por isso, para aqueles que querem começar , aqui vão dicas para evitar que seu primeiro game vire um vaporware:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1 – Não morda mais do que consegue mastigar&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Não comece tentando fazer um clone do seu jogo preferido! Ele certamente foi feito por uma equipe enorme de profissionais experientes trabalhando full time e com recursos adequados. Seja realista, se você não tem experiência com 3D, comece com 2D ou modo texto. Saiba até onde você pode chegar com o conhecimento que tem. Obviamente todo projeto tem um desafio e algo que precisamos aprender durante o percurso. Questione-se se o volume de conhecimento que você precisa obter para concluir seu projeto, é razoável. Não adianta planejar algo que você precise estudar 1 ano para conseguir começar. Uma boa idéia é começar com jogos clássicos como pedra-papel-tesoura , jogo da velha ou tetris.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2 – Comece com Demos&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Um game é composto de muitos elementos. Quando possível , faça pequenos projetos para aprender cada elemento separadamente. Por exemplo, lembra de Resident Evil 1 ? Esse game não permitia que o jogador movesse a câmera, ao invés disso, mudava o ângulo da câmera automaticamente de acordo com a posição do personagem no mapa. Se seu game utilizará esse recurso, faça um demo antes para entender melhor como funciona esse mecanismo. Isso evita que você polua o código do projeto completo com código de algo que você ainda está estudando.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3 – Planeje!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Por mais simples que seja o game, faça um documento de como ele deve funcionar. Descreva o gameplay, sistema de contagem de pontos, teclas utilizadas para controlar o jogador, condições de vitória, derrota e etc. Quando você documenta o seu game, vai perceber que ao contrário do que imagina, você não sabe exatamente como vai funcionar cada parte.Durante o projeto este documento servirá de guia, e você saberá exatamente em que parte do game estará trabalhando, quais estão prontas quais ainda serão feitas. Além disso, documentar o game permite que outras pessoas possam te ajudar no projeto, já que o conceito não está só na sua cabeça.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4 – Participe da comunidade&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ao contrário de Chuck Norris, nós meros mortais, não sabemos tudo e sempre precisaremos de ajuda em algum momento. Participe de forums sobre GameDev, Um bom começo é o &lt;a href="http://www.gamedev.com.br/"&gt;www.gamedev.com.br&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;5 – Não parta do Zero&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Não gaste tempo fazendo o que você pode obter pronto com a comunidade ou com o oráculo (leia-se Google). Se seu game precisa de um emissor de partículas e você não sabe como fazer um, consiga um pronto na internet e utilize! Não estou dizendo que você não deve aprender como funciona um emissor de partículas, mas para que seu primeiro game saia do papel, você precisará manter o foco no que interessa: o game. Isso se aplica a tudo, física, networking, AI, GUI e etc. Para seus primeiros games, faça o mínimo de código que não se aplique diretamente ao gameplay. Assim seu projeto ganha vida com menos esforço e você não desanima!&lt;br /&gt;&lt;br /&gt;Como dizia o tio &lt;a href="http://pt.wikipedia.org/wiki/Ben_Parker"&gt;Ben&lt;/a&gt;: “&lt;span style="font-style: italic;"&gt;Grandes poderes trazem grandes responsabilidades&lt;/span&gt;”. Tome cuidado para deixar nos fontes as referências do autor (nome, email, site onde conseguiu) do código que você está utilizando. Obviamente, não é por utilizar algo que já está pronto, que você deve se acomodar. Reserve um tempo para estudar o código que pegou e aprender a fazer um demo (dica 2) com sua própria implementação.&lt;br /&gt;&lt;br /&gt;Bom começo!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6657623884375354590-2666598780783577113?l=blog.octopusteam.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.octopusteam.com.br/feeds/2666598780783577113/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.octopusteam.com.br/2009/07/o-primeiro-game-5-dicas-para-comecar.html#comment-form' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6657623884375354590/posts/default/2666598780783577113'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6657623884375354590/posts/default/2666598780783577113'/><link rel='alternate' type='text/html' href='http://blog.octopusteam.com.br/2009/07/o-primeiro-game-5-dicas-para-comecar.html' title='O primeiro game – 5 dicas para começar'/><author><name>Márcio Freitas</name><uri>http://www.blogger.com/profile/18409452405638213331</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_q-bdxyNqYPg/SlYmxpjkItI/AAAAAAAAAF4/6Hd86PKaQEI/s72-c/tic+tac+toe.gif' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6657623884375354590.post-6420975927970323620</id><published>2009-07-08T18:14:00.001-07:00</published><updated>2009-07-08T19:28:42.169-07:00</updated><title type='text'>Post que pariu!</title><content type='html'>Primeiro post é sempre o mais difícil. Mas tem que começar em algum lugar!&lt;br /&gt;O mínimo aceitável é que descreva aqui os assuntos que pretendo abordar no blog. Então vamos lá:&lt;br /&gt;Tecnologia, gadgets, desenvolvimento e mercado de games no Brasil, algum humor (nunca é d+) e sei lá mais o que der na telha, afinal o blog é meu :D&lt;br /&gt;&lt;br /&gt;Como eu disse, primeiro post é complicado, por isso fico por aqui e preparo um segundo post decente :)&lt;br /&gt;&lt;br /&gt;Carpe Diem!&lt;a href="http://gesmarjunior.blogspot.com/" class="l" onmousedown="return clk(this.href,'','','res','2','')"&gt;&lt;br /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6657623884375354590-6420975927970323620?l=blog.octopusteam.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.octopusteam.com.br/feeds/6420975927970323620/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.octopusteam.com.br/2009/07/post-que-pariu.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6657623884375354590/posts/default/6420975927970323620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6657623884375354590/posts/default/6420975927970323620'/><link rel='alternate' type='text/html' href='http://blog.octopusteam.com.br/2009/07/post-que-pariu.html' title='Post que pariu!'/><author><name>Márcio Freitas</name><uri>http://www.blogger.com/profile/18409452405638213331</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
