{"id":114,"date":"2015-12-22T11:06:15","date_gmt":"2015-12-22T11:06:15","guid":{"rendered":"http:\/\/demensdeum.com\/blog\/?p=114"},"modified":"2024-12-16T22:32:55","modified_gmt":"2024-12-16T19:32:55","slug":"%d0%ba%d0%b0%d0%ba-%d0%bc%d1%8b-%d0%b4%d0%b5%d0%bb%d0%b0%d0%bb%d0%b8-mad-racer","status":"publish","type":"post","link":"https:\/\/demensdeum.com\/blog\/pt\/2015\/12\/22\/%d0%ba%d0%b0%d0%ba-%d0%bc%d1%8b-%d0%b4%d0%b5%d0%bb%d0%b0%d0%bb%d0%b8-mad-racer\/","title":{"rendered":"Como fizemos Mad Racer"},"content":{"rendered":"<p><em>Ol\u00e1 caro leitor. Nesta nota descreverei <a href=\"https:\/\/play.google.com\/store\/apps\/details?id=mad.racer.free\" target=\"_blank\">minha experi\u00eancia de cria\u00e7\u00e3o do primeiro jogo para Android telefones celulares<\/a>. Muita gente gosta dessa hist\u00f3ria, acho que precisa ser publicada. Esta n\u00e3o \u00e9 uma hist\u00f3ria de sucesso, mas acho que dar\u00e1 a muitos desenvolvedores iniciantes uma compreens\u00e3o de por onde come\u00e7ar e o que precisa ser feito para criar um jogo simples. Com certeza descreverei meus erros e o que poderia ter sido feito melhor.<br \/><\/em><\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/en.wikipedia.org\/wiki\/Tank_Girl\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-116\" src=\"https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2015\/12\/Hewl-Tanky-294x300.jpg\" alt=\"Hewl-Tanky\" width=\"294\" height=\"300\" srcset=\"https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2015\/12\/Hewl-Tanky-294x300.jpg 294w, https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2015\/12\/Hewl-Tanky-147x150.jpg 147w, https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2015\/12\/Hewl-Tanky.jpg 300w\" sizes=\"auto, (max-width: 294px) 100vw, 294px\" \/><\/a><\/p>\n<p style=\"text-align: center;\">Perdoe-me <span class=\"st\"><em>Jamie Hewlett<\/em> e Alan Martin<\/span>, estou postando \u00f3timas artes <a href= \"https:\/\/en.wikipedia.org\/wiki\/Tank_Girl\" target=\"_blank\">Tank Girl<\/a>sem a permiss\u00e3o deles<\/p>\n<p>\u00c0s vezes voc\u00ea cai em um estado em que deseja criar algo para que todos fiquem boquiabertos, abram a boca e digam &#8220;<strong>Bem, voc\u00ea \u00e9 legal<\/strong>&#8220;. Essa hist\u00f3ria aconteceu comigo em 2011, quando assisti um trecho do filme &#8220;Tank Girl&#8221; tive a ideia de criar um jogo arcade em estilo c\u00f4mico.<br \/>Por que para Android e n\u00e3o para iOS? A raz\u00e3o \u00e9 simples &#8211; Eu n\u00e3o tinha Macintosh nem iPhone, mas tinha um grande desejo de oferecer suporte ao Linux em telefones celulares. Naquela \u00e9poca eu gostava da ideologia da FSF, e Richard Matthew Stallman era meu deus.<\/p>\n<p style=\"text-align: center;\"><iframe loading=\"lazy\" src=\"https:\/\/www.youtube.com\/embed\/9sJUDx7iEJw\" width=\"420\" height=\"315\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe><br \/>\nCan\u00e7\u00e3o dos hackers do Linux. Antes de cantar &#8211; acredite na paz mundial<\/p>\n<p style=\"text-align: left;\">Na \u00e9poca do desenvolvimento, a vers\u00e3o mais recente do Android era a 2.0, tamb\u00e9m foi necess\u00e1rio deixar o suporte para vers\u00f5es mais antigas, j\u00e1 que havia muitos usu\u00e1rios 1.6. Muitos fabricantes de telefones nem mesmo lan\u00e7aram atualiza\u00e7\u00f5es para a vers\u00e3o 2.0.<\/p>\n<p style=\"text-align: left;\">Defini imediatamente um prazo para a implementa\u00e7\u00e3o deste projeto &#8211; um m\u00eas. Nesse per\u00edodo, tive que aprimorar meus conhecimentos em Java, estudar o Android SDK, Eclipse, conhecer o monstro diante do OpenGL ES e coloc\u00e1-lo \u00e0 prova. Do lado gr\u00e1fico, tivemos que criar cerca de seis modelos 3D otimizados para celulares. Tamb\u00e9m foi necess\u00e1rio liberar o projeto para ouro no Android Market, que era como se chamava o Google Play na \u00e9poca)<\/p>\n<p style=\"text-align: center;\"><a href=\"http:\/\/www.jpct.net\/jpct-ae\/\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-120 aligncenter\" src=\"https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2015\/12\/jpct_logo.png\" alt=\"jpct_logo\" width=\"200\" height=\"109\" \/><\/a><br \/>\n<a href=\"http:\/\/www.jpct.net\/jpct-ae\/\" target=\"_blank\">jPCT-AE<\/a> \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0439 3\u0434 \u0434\u0432\u0438\u0436\u043e\u043a \u0434\u043b\u044f \u0410\u043d\u0434\u0440\u043e\u0438\u0434\u0430<\/p>\n<p style=\"text-align: left;\">Como havia pouco tempo, foi necess\u00e1rio escolher um motor 3D pronto. \u00c9 poss\u00edvel criar seu pr\u00f3prio motor do zero, mas n\u00e3o \u00e9 muito produtivo, pois o teste e a compatibilidade com todos os dispositivos levar\u00e3o a maior parte do tempo. Antes da chegada do Unreal Engine, Unity, ThreeJS (HTML5), o motor l\u00edder era o JPCT-AE. O mecanismo foi fornecido como uma biblioteca Java pronta e suportava vers\u00f5es mais antigas do Android. Al\u00e9m disso, seu criador, EgonOlsen, fornece prontamente suporte e corre\u00e7\u00f5es de bugs a pedido dos desenvolvedores.<\/p>\n<p style=\"text-align: center;\"><a href=\"http:\/\/demensdeum.com\/blog\/2015\/12\/19\/anthony\/\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-122\" src=\"https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2015\/12\/antonHooligan-252x300.jpg\" alt=\"antonHooligan\" width=\"252\" height=\"300\" srcset=\"https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2015\/12\/antonHooligan-252x300.jpg 252w, https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2015\/12\/antonHooligan-126x150.jpg 126w, https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2015\/12\/antonHooligan.jpg 300w\" sizes=\"auto, (max-width: 252px) 100vw, 252px\" \/><\/a><\/p>\n<p style=\"text-align: left;\">O pessoal decide tudo &#8211; hooligan <a href=\"http:\/\/demensdeum.com\/blog\/2015\/12\/19\/anthony\/\" target=\"_blank\">Anton<\/a> concordou em escrever a m\u00fasica para o jogo. Sempre admirei sua criatividade, seu trabalho serviu como a locomotiva que conduzia todo o gameplay, obrigando o usu\u00e1rio a jogar at\u00e9 o \u00faltimo helic\u00f3ptero abatido.<\/p>\n<p style=\"text-align: left;\">Tantas coisas, por onde come\u00e7ar? Voc\u00ea precisa come\u00e7ar instalando o Android SDK. Agora ele vem com um IDE integrado \u2013 Est\u00fadio Android. Mas naquela \u00e9poca, o IDE e o SDK eram fornecidos separadamente. De acordo com a documenta\u00e7\u00e3o do site do Google, instalei o Android SDK e o Eclipse. Os pacotes necess\u00e1rios ao Eclipse tamb\u00e9m foram instalados para garantir a montagem e lan\u00e7amento do emulador Android. Uma hora depois montei um projeto de teste jpct-AE:<\/p>\n<p style=\"text-align: center;\"><iframe loading=\"lazy\" src=\"https:\/\/www.youtube.com\/embed\/WKOelV5EFOs\" width=\"420\" height=\"315\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n<p style=\"text-align: left;\">Uau! Mas no emulador de telefone tudo era muito lento. Portanto, foi tomada a decis\u00e3o de comprar um telefone na plataforma Android. Para o efeito, foi adquirido um LG Optimus One P500. Desde ent\u00e3o, n\u00e3o usei excelentes telefones Nokia com bot\u00e3o de press\u00e3o na plataforma Symbian. Ocorreram problemas ao conectar o telefone ao Linux, se algu\u00e9m ainda os encontrar, verifique as configura\u00e7\u00f5es do udev.<\/p>\n<p style=\"text-align: center;\"><iframe loading=\"lazy\" src=\"https:\/\/www.youtube.com\/embed\/CW0DUg63lqU\" width=\"420\" height=\"315\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe><br \/>\nJobs cita Pablo Picasso<\/p>\n<p style=\"text-align: left;\">Olhando para Alien Runner, percebi que o alien\u00edgena pode ser substitu\u00eddo por uma motocicleta e dois punks por uma bazuca, a clareira ao redor pode ser transformada em uma metr\u00f3pole e a neblina pode ser\u00e1 substitu\u00eddo por uma noite de baladas do Iron Maiden.<\/ p><\/p>\n<p style=\"text-align: left;\">Como fazer modelos 3D? Sim, \u00e9 muito simples, voc\u00ea abre uma aula sobre cria\u00e7\u00e3o de modelos low-poly no Youtube e faz. Todo o processo consistiu em delinear proje\u00e7\u00f5es em um editor 3D. Encontrei desenhos de um helic\u00f3ptero Apache e fiz um modelo do helic\u00f3ptero. As texturas foram retiradas de fontes abertas do Ex\u00e9rcito dos EUA.<\/p>\n<p style=\"text-align: left;\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-126 aligncenter\" src=\"https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2015\/12\/McDONNELL_DOUGLAS_AH-64_APACHE-300x201.png\" alt=\"McDONNELL_DOUGLAS_AH-64_APACHE\" width=\"300\" height=\"201\" srcset=\"https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2015\/12\/McDONNELL_DOUGLAS_AH-64_APACHE-300x201.png 300w, https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2015\/12\/McDONNELL_DOUGLAS_AH-64_APACHE-224x150.png 224w, https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2015\/12\/McDONNELL_DOUGLAS_AH-64_APACHE.png 574w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p style=\"text-align: left;\">Por que voc\u00ea precisa de um helic\u00f3ptero em um jogo com dois punks e uma bazuca? Quando joguei o prot\u00f3tipo, percebi que o jogador poderia simplesmente ficar parado e marcar pontos. A solu\u00e7\u00e3o ideal era um helic\u00f3ptero que chegasse voando e atirasse torpedos submarinos no jogador, n\u00e3o permitindo que ele parasse.<\/p>\n<p style=\"text-align: left;\">Nos aplicativos m\u00f3veis e jogos da \u00e9poca, o problema de falta de mem\u00f3ria era agudo, tanto no pr\u00f3prio telefone quanto na RAM. O desempenho tamb\u00e9m foi excelente. Um processador ARM com frequ\u00eancia de 300-500 MHz. Como resultado de testes em telefones de amigos, descobriu-se que o HTC tinha metade da mem\u00f3ria de v\u00eddeo do LG, 8 MB e 4 MB, raz\u00e3o pela qual o jogo ultrapassou os limites de mem\u00f3ria e n\u00e3o iniciou. Todos os recursos foram compactados a ponto de obter uma taxa de quadros de 30 quadros por segundo e a capacidade de rodar em quase tudo.<\/p>\n<p style=\"text-align: center;\"><iframe loading=\"lazy\" src=\"https:\/\/www.youtube.com\/embed\/B4KqJYDwxsk\" width=\"560\" height=\"315\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe><br \/>\n<em>N\u00e3o repita!<\/em><\/p>\n<p style=\"text-align: left;\">Alien Runner era controlado tocando na tela. Esse tipo de controle me pareceu inconveniente, ent\u00e3o implementei o controle por meio de um aceler\u00f4metro. Ou seja, voc\u00ea liga o telefone &#8211; a motocicleta gira. Gostei tanto que at\u00e9 adicionei uma vis\u00e3o em primeira pessoa, para os mais corajosos.<\/p>\n<p style=\"text-align: left;\">Precisei do apoio do desenvolvedor do motor jpct-AE quando vi que o apag\u00e3o na frente estava desaparecendo no jogo. Isso aconteceu ap\u00f3s minimizar e maximizar o aplicativo. Criei um t\u00f3pico no f\u00f3rum jpct-AE e em dois dias o problema foi resolvido. Integrei a vers\u00e3o corrigida do motor ao jogo.<\/p>\n<p style=\"text-align: left;\">Havia tamb\u00e9m a quest\u00e3o de como implementar um suprimento infinito de m\u00e1quinas. Para um jogo para celular, era necess\u00e1rio encontrar uma maneira de adicionar carros ao cen\u00e1rio do jogo RAPIDAMENTE. A op\u00e7\u00e3o de carregar de mem\u00f3ria lenta ou cart\u00e3o SD foi imediatamente rejeitada. Um padr\u00e3o de design chamado pool de objetos veio em socorro. Quando um carro sa\u00eda de vista ou era destru\u00eddo, ele era desligado e no momento em que era necess\u00e1rio trazer um carro novo para o in\u00edcio da cena &#8211; ele era desligado. ent\u00e3o ele foi ligado e colocado l\u00e1.<\/p>\n<p style=\"text-align: left;\"><a href=\"https:\/\/play.google.com\/store\/apps\/details?id=mad.racer.free\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-131 aligncenter\" src=\"https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2015\/12\/android-market-300x190.jpg\" alt=\"android-market\" width=\"300\" height=\"190\" srcset=\"https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2015\/12\/android-market.jpg 300w, https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2015\/12\/android-market-237x150.jpg 237w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p style=\"text-align: left;\">Bem, o dia do lan\u00e7amento chegou. O jogo foi testado, apresentado aos amigos e agora estava prestes a ganhar ouro no Android Market. O registro no Android Market custa US$ 20, pago. Adicionadas descri\u00e7\u00e3o e capturas de tela. E naquele momento percebi que precisava gravar um v\u00eddeo.<\/p>\n<p style=\"text-align: left;\">Como gravar um v\u00eddeo para um projeto m\u00f3vel? \u00c9 realmente poss\u00edvel filmar um celular e depois public\u00e1-lo? A solu\u00e7\u00e3o foi interessante, usei um emulador de Android, joguei o jogo com uma taxa de quadros de dois quadros por segundo, gravando tudo o que acontecia na tela usando um programa chamado algo como gtkDesktopRecorder. Usando o VirtualDub, a velocidade do v\u00eddeo foi aumentada para 30 quadros por segundo. Ent\u00e3o, no melhor programa de edi\u00e7\u00e3o de v\u00eddeo &#8211; Windows Movie Maker adicionei todos os sons e m\u00fasicas do jogo.<\/p>\n<p style=\"text-align: left;\">Agora chega o momento dos erros. Nada foi investido na promo\u00e7\u00e3o do projeto, nem esfor\u00e7o nem dinheiro. <strong>Acreditei ent\u00e3o que o projeto iria se recuperar<\/strong>. O jogo ganhou ouro, criei um t\u00f3pico no f\u00f3rum jpct-AE sobre Mad Racer. Consegui 12 instala\u00e7\u00f5es por um d\u00f3lar em duas semanas. <em>E encontrei o jogo dispon\u00edvel gratuitamente em v\u00e1rios sites warez no dia seguinte<\/em>.<\/p>\n<p style=\"text-align: left;\">Cantando a m\u00fasica da FSF &#8220;Compartilhe o software&#8221; Resolvi fazer uma vers\u00e3o gratuita com publicidade. O jogo foi transferido para a categoria AdWare, e abaixo apareceu um banner publicit\u00e1rio da rede AdMob. A integra\u00e7\u00e3o com o sistema de publicidade ocorreu sem problemas. Em um m\u00eas, o jogo foi instalado em dez mil dispositivos. Recebi US$ 50 da rede de publicidade.<\/p>\n<p style=\"text-align: left;\">Em geral n\u00e3o se esque\u00e7a da publicidade, acredito que esta deve ser uma das principais despesas do seu projeto.<\/p>\n<p style=\"text-align: left;\">Pelo lado positivo, gostaria de destacar que consegui um cargo como desenvolvedor iOS em uma das melhores empresas de nossa cidade. E, claro, uma experi\u00eancia inestim\u00e1vel.<\/p>\n<p style=\"text-align: left;\"><a href=\"https:\/\/play.google.com\/store\/apps\/details?id=mad.racer.free\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-21 aligncenter\" src=\"https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2015\/12\/madracerLogo.png\" alt=\"madracerLogo\" width=\"300\" height=\"300\" srcset=\"https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2015\/12\/madracerLogo.png 300w, https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2015\/12\/madracerLogo-150x150.png 150w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a>\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 <a href=\"https:\/\/play.google.com\/store\/apps\/details?id=mad.racer.free\" target=\"_blank\">Google Play<\/a><\/p>\n<p style=\"text-align: left;\">Se voc\u00ea gostou do artigo, repasse-o no VKontakte, Facebook)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ol\u00e1 caro leitor. Nesta nota descreverei minha experi\u00eancia de cria\u00e7\u00e3o do primeiro jogo para Android telefones celulares. Muita gente gosta dessa hist\u00f3ria, acho que precisa ser publicada. Esta n\u00e3o \u00e9 uma hist\u00f3ria de sucesso, mas acho que dar\u00e1 a muitos desenvolvedores iniciantes uma compreens\u00e3o de por onde come\u00e7ar e o que precisa ser feito para<a class=\"more-link\" href=\"https:\/\/demensdeum.com\/blog\/pt\/2015\/12\/22\/%d0%ba%d0%b0%d0%ba-%d0%bc%d1%8b-%d0%b4%d0%b5%d0%bb%d0%b0%d0%bb%d0%b8-mad-racer\/\">Continue reading <span class=\"screen-reader-text\">&#8220;Como fizemos Mad Racer&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[49,63],"tags":[17,14,15,13],"class_list":["post-114","post","type-post","status-publish","format-standard","hentry","category-blog","category-hottest","tag-company","tag-demensdeum","tag-development","tag-madracer","entry"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"pt","enabled_languages":["en","ru","zh","de","fr","ja","pt"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"ru":{"title":true,"content":true,"excerpt":false},"zh":{"title":true,"content":true,"excerpt":false},"de":{"title":true,"content":true,"excerpt":false},"fr":{"title":true,"content":true,"excerpt":false},"ja":{"title":true,"content":true,"excerpt":false},"pt":{"title":true,"content":true,"excerpt":false}}},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/114","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=114"}],"version-history":[{"count":92,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/114\/revisions"}],"predecessor-version":[{"id":4035,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/114\/revisions\/4035"}],"wp:attachment":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=114"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=114"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=114"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}