{"id":429,"date":"2009-07-12T14:58:06","date_gmt":"2009-07-12T17:58:06","guid":{"rendered":"https:\/\/devkico.itexto.com.br\/?p=429"},"modified":"2009-07-12T14:58:06","modified_gmt":"2009-07-12T17:58:06","slug":"metal-gear-nanna-criando-jogos-usando-c-e-opengl-o-modelo-parte-ii","status":"publish","type":"post","link":"https:\/\/devkico.itexto.com.br\/?p=429","title":{"rendered":"Metal Gear Nanna &#8211; Criando jogos usando C++ e OpenGL: o modelo &#8211; Parte II"},"content":{"rendered":"<figure id=\"attachment_430\" aria-describedby=\"caption-attachment-430\" style=\"width: 300px\" class=\"wp-caption alignleft\"><a href=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/07\/diagramadeclassesmgnanna.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-430 \" title=\"diagramadeclassesmgnanna\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/07\/diagramadeclassesmgnanna-300x226.png\" alt=\"Diagrama de classes inicial\" width=\"300\" height=\"226\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/07\/diagramadeclassesmgnanna-300x226.png 300w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/07\/diagramadeclassesmgnanna.png 762w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><figcaption id=\"caption-attachment-430\" class=\"wp-caption-text\">Diagrama de classes inicial<\/figcaption><\/figure>\n<p>O mais importante no projeto deste jogo, sem sombra de d\u00favidas \u00e9 o modelo, pois os gr\u00e1ficos, assim como toda a intera\u00e7\u00e3o do usu\u00e1rio com o jogo \u00e9 resultado do estado definido neste.<\/p>\n<p>Vamos come\u00e7ar pela classe <em>Elemento<\/em>. Esta representa, como o pr\u00f3prio nome j\u00e1 diz, um objeto que ser\u00e1 representado na janela principal do nosso jogo. Trata-se de uma classe abstrata, que ir\u00e1 prover os atributos e m\u00e9todos b\u00e1sicos que ser\u00e3o utilizados pelos elementos concretos do nosso jogo: Nanna, Inimigo, Parede e Destino (os explicarei novamente a seguir).<\/p>\n<p>Na classe <em>Elemento <\/em>os seguintes atributos encontram-se definidos:<\/p>\n<p><strong>x<em> <\/em><\/strong>e <strong>y:<\/strong> a posi\u00e7\u00e3o do elemento na tela. No caso, por padr\u00e3o estes elementos ir\u00e3o corresponder ao canto superior esquerdo de cada elemento de tela.<\/p>\n<p><strong>altura<\/strong> e <strong>largura<\/strong>: adivinha! :)<\/p>\n<p><strong>visivel<\/strong>: indica se o elemento em quest\u00e3o ser\u00e1 renderizado ou n\u00e3o pela aplica\u00e7\u00e3o. Este atributo s\u00f3 ser\u00e1 de fato \u00fatil quando formos trabalhar com a intelig\u00eancia do jogo.<\/p>\n<figure id=\"attachment_432\" aria-describedby=\"caption-attachment-432\" style=\"width: 67px\" class=\"wp-caption alignleft\"><a href=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/07\/nanna_frente.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-432\" title=\"nanna_frente\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/07\/nanna_frente.jpg\" alt=\"\" width=\"67\" height=\"71\" \/><\/a><figcaption id=\"caption-attachment-432\" class=\"wp-caption-text\">Esbo\u00e7o de Nanna vista de frente<\/figcaption><\/figure>\n<p><strong>direcao<\/strong>: a dire\u00e7\u00e3o do elemento naquele momento. \u00c9 importante para que saibamos qual imagem renderizar. Por exemplo: se Nanna estiver na dire\u00e7\u00e3o NORTE, iremos renderiz\u00e1-la de costas, se for SUL, de frente<\/p>\n<p>A classe abstrata <em>Elemento <\/em>possui dois m\u00e9todos abstratos que s\u00e3o fundamentais para nosso jogo:<\/p>\n<p><strong>Elemento::draw(): <\/strong>Desenha o elemento na tela. Cada elemento ir\u00e1 se desenhar de maneira distinta. Por esta raz\u00e3o, este m\u00e9todo foi definido como abstrato nesta classe, obrigando as demais a implement\u00e1-los.<\/p>\n<p><strong>Elemento::mover(direcao: tipoDirecao, incremento: float):<\/strong> Este m\u00e9todo recebe dois par\u00e2metros: direcao e incremento. O par\u00e2metro direcao indica para onde estou movendo o elemento (veja o enum tipoDirecao no diagrama de classes para ver seus valores \u00f3bvios), e incremento a dist\u00e2ncia percorrida pelo elemento a cada chamada deste m\u00e9todo. No caso, ser\u00e3o alterados os atributos <em>x<\/em> e <em>y<\/em> da classe, que correspondem \u00e0 sua posi\u00e7\u00e3o na tela.<\/p>\n<p>Descrita a classe Elemento, vamos passar agora para a descri\u00e7\u00e3o das suas classes derivadas:<\/p>\n<figure id=\"attachment_420\" aria-describedby=\"caption-attachment-420\" style=\"width: 157px\" class=\"wp-caption alignright\"><a href=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/07\/metal_gear_nanna.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-420\" title=\"metal_gear_nanna\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/07\/metal_gear_nanna-300x286.png\" alt=\"Metal Gear Nanna\" width=\"157\" height=\"151\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/07\/metal_gear_nanna-300x286.png 300w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/07\/metal_gear_nanna.png 416w\" sizes=\"(max-width: 157px) 100vw, 157px\" \/><\/a><\/dt>\n<\/dl>\n<\/div>\n<p><strong>Nanna:<\/strong> Trata-se de nossa heroina. No est\u00e1gio inicial do c\u00f3digo fonte, trata-se do \u00fanico elemento que podemos movimentar (e que possui qualquer tipo de movimento, diga-se de passagem). S\u00f3 para lembrar, o objetivo de Nanna consiste em evitar ao m\u00e1ximo os &#8220;Traficantes de Del\u00edcias&#8221; (classe Inimigo), que uma vez a avistando, ir\u00e3o obrig\u00e1-la a comer alguma coisa, reduzindo assim o n\u00famero de pontos que obteve nos vigilantes do peso.<\/p>\n<p>Estou prevendo para Nanna duas capacidades: a de se movimentar e tamb\u00e9m a de distrair os seus inimigos. Para tal, Nanna ir\u00e1 gritar, fazendo com que os mesmos mudem de dire\u00e7\u00e3o, possibilitando assim que ela os despiste.<\/p>\n<div class=\"mceTemp\">\n<dl id=\"attachment_433\" class=\"wp-caption alignleft\" style=\"width: 77px;\">\n<dt class=\"wp-caption-dt\"><a href=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/07\/inimigo_frente.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-433\" title=\"inimigo_frente\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/07\/inimigo_frente.png\" alt=\"Esbo\u00e7o dos Inimigos de Frente\" width=\"67\" height=\"71\" \/><\/a><figcaption id=\"caption-attachment-420\" class=\"wp-caption-text\">Esbo\u00e7o dos Inimigos de Frente<\/figcaption><\/figure>\n<p><strong>Inimigo:<\/strong> Ah, estas cozinheiras da Bahia&#8230; Vivem nos engordando!\u00a0 Seu comportamento ser\u00e1 definido pelo pr\u00f3prio mecanismo do jogo ao inv\u00e9s de Nanna, que ser\u00e1 comandada pelo jogador.<\/p>\n<p>No caso do Inimigo, h\u00e1 alguns atributos a mais: ele possui um raio de vis\u00e3o (definido pelo atributo direcao) e tamb\u00e9m se movimentar\u00e1 sozinho pelas 4 dire\u00e7\u00f5es em busca de Nanna. Uma vez que esta esteja no seu campo de vis\u00e3o (que tamb\u00e9m ser\u00e1 rendericado), autom\u00e1ticamente Nanna perder\u00e1 pontos.<\/p>\n<figure id=\"attachment_434\" aria-describedby=\"caption-attachment-434\" style=\"width: 64px\" class=\"wp-caption alignright\"><a href=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/07\/parede.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-434\" title=\"parede\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/07\/parede.png\" alt=\"Esbo\u00e7o de uma parede\" width=\"64\" height=\"64\" \/><\/a><figcaption id=\"caption-attachment-434\" class=\"wp-caption-text\">Esbo\u00e7o de uma parede<\/figcaption><\/figure>\n<p><strong>Parede:<\/strong> Uma paredde \u00e9 uma parede, que \u00e9 uma parede e, bem: uma parede. A \u00fanica fun\u00e7\u00e3o de uma parede consiste em limitar os movimentos de Nanna. Uma parede n\u00e3o se move (ao menos n\u00e3o inicialmente), sendo assim, o m\u00e9todo mover em nada modificar\u00e1 os atributos de uma parede neste momento.<\/p>\n<p>O \u00fanico m\u00e9todo sobrescrito no caso ser\u00e1 draw, que dever\u00e1 expor o esbo\u00e7o exposto ao lado.<\/p>\n<p><strong>Destino: <\/strong>Para chegar ao final de uma fase, Nanna precisa saber aonde chegar. Por esta raz\u00e3o, existe a classe destino. No momento em que Nanna interceptar o destino, o mapa atual ser\u00e1 descarregado da mem\u00f3ria e o seguinte carregado, at\u00e9 que todos os mapas sejam finalizados e o usu\u00e1rio chegue ao final do jogo.<\/p>\n<h2>O Mapa!<\/h2>\n<p>O mapa pode ser visto como o container de todos os elementos do nosso jogo. Nele estar\u00e3o armazenados os apontadores para cada classe derivada de <em>Elemento<\/em> de nossa aplica\u00e7\u00e3o.<\/p>\n<p>Neste est\u00e1gio atual do jogo, o c\u00f3digo mais interessante sem sombra de d\u00favidas \u00e9 o mapa, que inclusive j\u00e1 \u00e9 renderizado (toscamente, \u00e9 verdade, mas renderizado!), como pode ser visto na imagem abaixo:<\/p>\n<figure id=\"attachment_436\" aria-describedby=\"caption-attachment-436\" style=\"width: 259px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/07\/mgnanna_0_0_0.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-436\" title=\"mgnanna_0_0_0\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/07\/mgnanna_0_0_0.png\" alt=\"Mapa atual de Metal Gear Nanna\" width=\"259\" height=\"270\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/07\/mgnanna_0_0_0.png 516w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/07\/mgnanna_0_0_0-288x300.png 288w\" sizes=\"(max-width: 259px) 100vw, 259px\" \/><\/a><figcaption id=\"caption-attachment-436\" class=\"wp-caption-text\">Mapa atual de Metal Gear Nanna<\/figcaption><\/figure>\n<p>Todos os elementos s\u00e3o inicialmente renderizados como quadrados, variando apenas suas cores: Nanna \u00e9 vermelha, o Inimigo laranja, as paredes azuis e o destino verde (soa quase como um poema, n\u00e3o \u00e9 mesmo?).<\/p>\n<p>No caso, as posi\u00e7\u00f5es dos elementos s\u00e3o definidas em arquivos externos, carregados pelo programa quando o mesmo \u00e9 iniciado. Estes arquivos externos encontram-se no formato texto para que sejam de f\u00e1cil edi\u00e7\u00e3o, e s\u00e3o similares ao exposto na imagem abaixo:<\/p>\n<p><a href=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/07\/mapa.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-437 alignright\" title=\"mapa\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/07\/mapa.png\" alt=\"\" width=\"160\" height=\"228\" \/><\/a> Cada linha do arquivo possui um significado:<\/p>\n<p><strong>Primeira linha:<\/strong> nome do mapa<\/p>\n<p><strong>Segunda linha:<\/strong> c\u00f3digo interno do mapa (ser\u00e1 muito \u00fatil em um futuro pr\u00f3ximo)<\/p>\n<p><strong>Terceira e quarta linnhas:<\/strong> n\u00famero de linhas e colunas do mapa (mais sobre isto abaixo)<\/p>\n<p><strong>Linhas subsequentes:<\/strong><\/p>\n<p>As linhas subsequentes dizem respeito ao posicionamento dos elementos na tela. No caso, es trata de uma matriz de n linhas por m colunas, tal como definido nas linhas de n\u00famero 3 e 4 do arquivo de configura\u00e7\u00e3o do mapa.<\/p>\n<p>Cada caractere dentro desta matriz representa um dos elementos descritos acima: <strong>V<\/strong> = vazio, <strong>N<\/strong> = Nanna, <strong>I<\/strong> = Inimigo e <strong>E<\/strong> = Sa\u00edda. Na realidade, para elementos vazios poderia ser definido qualquer caractere diferente de N, I ou E. No entanto, para que a visualiza\u00e7\u00e3o fique mais f\u00e1cil, optei pelo caractere V mesmo (se quiser, modifique o arquivo de mapa trocando os caracteres V por qualquer coisa. Voc\u00ea ver\u00e1 que o programa funciona da mesma forma).<\/p>\n<p>Conforme este arquivo \u00e9 carregado, novas inst\u00e2ncias da classe Elemento v\u00e3o sendo criadas e seu posicionamento configurado de acordo com a linha e coluna na qual se encontram (fica n\u00edtido no c\u00f3digo fonte como isto \u00e9 feito).<\/p>\n<p><strong>Renderiza\u00e7\u00e3o do mapa<\/strong><\/p>\n<p>A renderiza\u00e7\u00e3o do mapa \u00e9 simples: neste h\u00e1 um atributo chamado <em>conteudo<\/em>, do tipo <em>ItemLista<\/em>. Este na realidade \u00e9 o elemento inicial de uma linha encadeada. Sendo assim, o que o software realmente faz consiste em interar em cima destes elementos executando o m\u00e9todo <em>draw<\/em> de cada inst\u00e2ncia. Em seguida, \u00e9 chamado o m\u00e9todo <em>draw<\/em> do atributo Nanna, que n\u00e3o se encontra dentro desta listagem.<\/p>\n<p>Nanna n\u00e3o se encontra dentro desta listagem por duas raz\u00f5es:<\/p>\n<p>1) \u00c9 um elemento que \u00e9 acessado constantemente<\/p>\n<p>2) \u00c9 um elemento \u00fanico. Em um mapa, ao menos por enquanto, s\u00f3 pode haver uma Nanna.<\/p>\n<h2>O c\u00f3digo fonte<\/h2>\n<p>Ei! Ap\u00f3s ter falado tanto do programa, com certeza voc\u00eas devem estar querendo dar uma olhada no mesmo, certo? O disponibilizei para download neste <a href=\"http:\/\/www.itexto.net\/mgnanna\/MGNanna0_0_0.zip\" target=\"_blank\">link<\/a>. Eu sei que \u00e9 uma maneira bem tosca de disponibilizar c\u00f3digo fonte, mas \u00e9 que ainda estou procurando algum lugar para hospedar o meu reposit\u00f3rio Mercurial. Assim que o encontrar liberarei para voc\u00eas maiores detalhes sobre como obter vers\u00f5es atualizadas deste bichinho.<\/p>\n<p>(eu pensei no github, mas o estado do git para Windows (sim, estou usando Windows ao inv\u00e9s de Mac OS no desenvolvimento deste projetinho&#8230;) atualmente ainda \u00e9 muito prec\u00e1rio, al\u00e9m disto, devo confessar que tenho uma certa prefer\u00eancia pelo Mercurial)<\/p>\n<h2>Fontes adicionais de informa\u00e7\u00e3o<\/h2>\n<p>Neste estudo, alguns livros est\u00e3o sendo de EXTREMA valia para mim:<\/p>\n<p><a href=\"http:\/\/www.submarino.com.br\/produto\/1\/1508723\/c++:+como+programar&amp;franq=103929\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-438\" title=\"cpp_como_programar\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/07\/cpp_como_programar.jpg\" alt=\"\" width=\"180\" height=\"180\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/07\/cpp_como_programar.jpg 180w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/07\/cpp_como_programar-150x150.jpg 150w\" sizes=\"(max-width: 180px) 100vw, 180px\" \/><\/a><\/p>\n<p><strong>C++ Como Programar<\/strong><\/p>\n<p>O melhor livro de C++ que conhe\u00e7o, \u00e9 o dos Deitel (assim como o livro de Java, Perl e C# tamb\u00e9m s\u00e3o os melhores).<\/p>\n<p>Se voc\u00ea quer saber o b\u00e1sico de programa\u00e7\u00e3o em C++, o livro \u00e9 este.<\/p>\n<p><a href=\"http:\/\/www.submarino.com.br\/produto\/1\/1346753\/opengl:+uma+abordagem+pratica+e+objetiva&amp;franq=103929\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-439\" title=\"opengl_abordagem_pratica\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/07\/opengl_abordagem_pratica.jpg\" alt=\"\" width=\"180\" height=\"180\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/07\/opengl_abordagem_pratica.jpg 180w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/07\/opengl_abordagem_pratica-150x150.jpg 150w\" sizes=\"(max-width: 180px) 100vw, 180px\" \/><\/a><\/p>\n<p><strong>OpenGL: Uma Abordagem Pr\u00e1tica e Objetiva<\/strong><br \/>\nDe Marcelo Cohen<\/p>\n<p>Um excelente texto introdut\u00f3rio ao OpenGL. Basicamente, do pouco que sei de OpenGL at\u00e9 agora, 90% v\u00eam desta fonte.<\/p>\n<p>A abordagem \u00e9 muito simples, tornando o contato inicial com OpenGL pouqu\u00edssimo traum\u00e1tico. Na realidade, \u00e9 at\u00e9 surpreendente: eu realmente achava que OpenGL fosse algo que s\u00f3 engenheiros da NASA pudessem dominar. Com este livro, vi que a hist\u00f3ria n\u00e3o \u00e9 bem assim.<\/p>\n<p><a href=\"http:\/\/www.amazon.com\/Computer-Graphics-Theory-Into-Practice\/dp\/0763722502\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-440\" title=\"computer_graphics_theory_into_practice\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/07\/computer_graphics_theory_into_practice.jpg\" alt=\"\" width=\"184\" height=\"184\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/07\/computer_graphics_theory_into_practice.jpg 240w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/07\/computer_graphics_theory_into_practice-150x150.jpg 150w\" sizes=\"(max-width: 184px) 100vw, 184px\" \/><\/a><\/p>\n<p><strong>Computer Graphics: Theory Into Practice<\/strong><br \/>\nDe Jeffrey J. McConnell<\/p>\n<p>Enquanto o OpenGL: Uma Abordagem Pr\u00e1tica e Objetiva \u00e9 mais m\u00e3o na massa, o foco deste livro \u00e9 mais a teoria por tr\u00e1s da computa\u00e7\u00e3o gr\u00e1fica. Ali\u00e1s, primeiro tomei contato com este livro, e s\u00f3 depois com o primeiro.<\/p>\n<p>Os exemplos do livro s\u00e3o todos em OpenGL, sendo assim, o que o primeiro n\u00e3o tratar, com certeza voc\u00ea encontrar\u00e1 com maiores detalhes neste.<\/p>\n<h2>Daqui para frente&#8230;<\/h2>\n<p>Se voc\u00ea executar o c\u00f3digo fonte atual, ir\u00e1 perceber que Nanna pode fazer algo incr\u00edvel: ela passa pelas paredes. Sendo assim, antes de renderizar Nanna com gr\u00e1ficos melhores, a primeira coisa a ser feita consiste em implementar os algoritmos de detec\u00e7\u00e3o de colis\u00e3o.<\/p>\n<p>Sendo assim, nos pr\u00f3ximos posts come\u00e7arei a trabalhar com maiores detalhes quest\u00f5es referentes \u00e0 implementa\u00e7\u00e3o de Metal Gear Nanna. Neste processo, iremos ver como funciona o OpenGL e tamb\u00e9m quais os erros que venho cometendo neste desenvolvimento (o que normalmente \u00e9 o mais interessante em todo aprendizado).<\/p>\n<p>Logo&#8230; at\u00e9 o final de semana que v\u00eam (ou antes)!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>O mais importante no projeto deste jogo, sem sombra de d\u00favidas \u00e9 o modelo, pois os gr\u00e1ficos, assim como toda a intera\u00e7\u00e3o do usu\u00e1rio com o jogo \u00e9 resultado do estado definido neste. Vamos come\u00e7ar pela classe Elemento. Esta representa, como o pr\u00f3prio nome j\u00e1 diz, um objeto que ser\u00e1 representado na janela principal do [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[41,17,1],"tags":[],"class_list":["post-429","post","type-post","status-publish","format-standard","hentry","category-metal-gear-nanna","category-opengl","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Metal Gear Nanna - Criando jogos usando C++ e OpenGL: o modelo - Parte II - \/dev\/Kico<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/devkico.itexto.com.br\/?p=429\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Metal Gear Nanna - Criando jogos usando C++ e OpenGL: o modelo - Parte II - \/dev\/Kico\" \/>\n<meta property=\"og:description\" content=\"O mais importante no projeto deste jogo, sem sombra de d\u00favidas \u00e9 o modelo, pois os gr\u00e1ficos, assim como toda a intera\u00e7\u00e3o do usu\u00e1rio com o jogo \u00e9 resultado do estado definido neste. Vamos come\u00e7ar pela classe Elemento. Esta representa, como o pr\u00f3prio nome j\u00e1 diz, um objeto que ser\u00e1 representado na janela principal do [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/devkico.itexto.com.br\/?p=429\" \/>\n<meta property=\"og:site_name\" content=\"\/dev\/Kico\" \/>\n<meta property=\"article:published_time\" content=\"2009-07-12T17:58:06+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.itexto.net\/devkico\/wp-content\/uploads\/2009\/07\/diagramadeclassesmgnanna-300x226.png\" \/>\n<meta name=\"author\" content=\"Kico (Henrique Lobo Weissmann)\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@loboweissmann\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Kico (Henrique Lobo Weissmann)\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=429\",\"url\":\"https:\/\/devkico.itexto.com.br\/?p=429\",\"name\":\"Metal Gear Nanna - Criando jogos usando C++ e OpenGL: o modelo - Parte II - \/dev\/Kico\",\"isPartOf\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=429#primaryimage\"},\"image\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=429#primaryimage\"},\"thumbnailUrl\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/07\/diagramadeclassesmgnanna-300x226.png\",\"datePublished\":\"2009-07-12T17:58:06+00:00\",\"dateModified\":\"2009-07-12T17:58:06+00:00\",\"author\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7\"},\"breadcrumb\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=429#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/devkico.itexto.com.br\/?p=429\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=429#primaryimage\",\"url\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/07\/diagramadeclassesmgnanna-300x226.png\",\"contentUrl\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/07\/diagramadeclassesmgnanna-300x226.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=429#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/devkico.itexto.com.br\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Metal Gear Nanna &#8211; Criando jogos usando C++ e OpenGL: o modelo &#8211; Parte II\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#website\",\"url\":\"https:\/\/devkico.itexto.com.br\/\",\"name\":\"\/dev\/Kico\",\"description\":\"Desenvolvendo software\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/devkico.itexto.com.br\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7\",\"name\":\"Kico (Henrique Lobo Weissmann)\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g\",\"caption\":\"Kico (Henrique Lobo Weissmann)\"},\"sameAs\":[\"https:\/\/x.com\/loboweissmann\"],\"url\":\"https:\/\/devkico.itexto.com.br\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Metal Gear Nanna - Criando jogos usando C++ e OpenGL: o modelo - Parte II - \/dev\/Kico","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/devkico.itexto.com.br\/?p=429","og_locale":"pt_BR","og_type":"article","og_title":"Metal Gear Nanna - Criando jogos usando C++ e OpenGL: o modelo - Parte II - \/dev\/Kico","og_description":"O mais importante no projeto deste jogo, sem sombra de d\u00favidas \u00e9 o modelo, pois os gr\u00e1ficos, assim como toda a intera\u00e7\u00e3o do usu\u00e1rio com o jogo \u00e9 resultado do estado definido neste. Vamos come\u00e7ar pela classe Elemento. Esta representa, como o pr\u00f3prio nome j\u00e1 diz, um objeto que ser\u00e1 representado na janela principal do [&hellip;]","og_url":"https:\/\/devkico.itexto.com.br\/?p=429","og_site_name":"\/dev\/Kico","article_published_time":"2009-07-12T17:58:06+00:00","og_image":[{"url":"http:\/\/www.itexto.net\/devkico\/wp-content\/uploads\/2009\/07\/diagramadeclassesmgnanna-300x226.png"}],"author":"Kico (Henrique Lobo Weissmann)","twitter_card":"summary_large_image","twitter_creator":"@loboweissmann","twitter_misc":{"Escrito por":"Kico (Henrique Lobo Weissmann)","Est. tempo de leitura":"8 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/devkico.itexto.com.br\/?p=429","url":"https:\/\/devkico.itexto.com.br\/?p=429","name":"Metal Gear Nanna - Criando jogos usando C++ e OpenGL: o modelo - Parte II - \/dev\/Kico","isPartOf":{"@id":"https:\/\/devkico.itexto.com.br\/#website"},"primaryImageOfPage":{"@id":"https:\/\/devkico.itexto.com.br\/?p=429#primaryimage"},"image":{"@id":"https:\/\/devkico.itexto.com.br\/?p=429#primaryimage"},"thumbnailUrl":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/07\/diagramadeclassesmgnanna-300x226.png","datePublished":"2009-07-12T17:58:06+00:00","dateModified":"2009-07-12T17:58:06+00:00","author":{"@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7"},"breadcrumb":{"@id":"https:\/\/devkico.itexto.com.br\/?p=429#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/devkico.itexto.com.br\/?p=429"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/devkico.itexto.com.br\/?p=429#primaryimage","url":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/07\/diagramadeclassesmgnanna-300x226.png","contentUrl":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/07\/diagramadeclassesmgnanna-300x226.png"},{"@type":"BreadcrumbList","@id":"https:\/\/devkico.itexto.com.br\/?p=429#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/devkico.itexto.com.br\/"},{"@type":"ListItem","position":2,"name":"Metal Gear Nanna &#8211; Criando jogos usando C++ e OpenGL: o modelo &#8211; Parte II"}]},{"@type":"WebSite","@id":"https:\/\/devkico.itexto.com.br\/#website","url":"https:\/\/devkico.itexto.com.br\/","name":"\/dev\/Kico","description":"Desenvolvendo software","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/devkico.itexto.com.br\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"pt-BR"},{"@type":"Person","@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7","name":"Kico (Henrique Lobo Weissmann)","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g","caption":"Kico (Henrique Lobo Weissmann)"},"sameAs":["https:\/\/x.com\/loboweissmann"],"url":"https:\/\/devkico.itexto.com.br\/?author=1"}]}},"jetpack_featured_media_url":"","jetpack-related-posts":[],"jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/429"}],"collection":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=429"}],"version-history":[{"count":3,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/429\/revisions"}],"predecessor-version":[{"id":441,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/429\/revisions\/441"}],"wp:attachment":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=429"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=429"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=429"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}