<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Enoá Mourão - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Aprenda a codificar - de graça. Tutoriais de programação em Python, JavaScript, Linux e muito mais. ]]>
        </description>
        <link>https://www.freecodecamp.org/portuguese/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Enoá Mourão - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/portuguese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Mon, 25 May 2026 10:43:26 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/portuguese/news/author/enoa/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Escrevi uma linguagem de programação. E você também pode! ]]>
                </title>
                <description>
                    <![CDATA[ Escrito por: William W. Wold Nos últimos 6 meses, eu venho trabalhando em uma linguagem de programação chamada Pinecone. Não chamaria de madura ainda, mas já possui recursos suficientes para ser utilizável, tais como:  * variáveis  * funções  * estruturas definidas pelo usuário Se tiver interesse na ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/escrevi-uma-linguagem-de-programacao-e-voce-tambem-pode/</link>
                <guid isPermaLink="false">627ae3d7357c22053df622d8</guid>
                
                    <category>
                        <![CDATA[ Programação ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Enoá Mourão ]]>
                </dc:creator>
                <pubDate>Wed, 07 Sep 2022 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2022/08/1_vzwAxAI6RB89kPZZJIGkOA.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/the-programming-language-pipeline-91d3f449c919/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">I wrote a programming language. Here’s how you can, too.</a>
      </p><p>Escrito por: William W. Wold</p><p>Nos últimos 6 meses, eu venho trabalhando em uma linguagem de programação chamada Pinecone. Não chamaria de madura ainda, mas já possui recursos suficientes para ser utilizável, tais como:</p><ul><li>variáveis</li><li>funções</li><li>estruturas definidas pelo usuário</li></ul><p>Se tiver interesse na linguagem Pinecone, dê uma olhada na <a href="https://pinecone-lang.herokuapp.com/index.html">página inicial</a> ou no <a href="https://github.com/william01110111/Pinecone">repositório do GitHub</a>. </p><p>Não sou um especialista. Quando comecei com esse projeto, não tinha ideia do que estava fazendo – e continuo sem ter. Nunca tive aulas sobre como criar uma linguagem, apenas li um pouco sobre isso on-line. Também não segui muitos dos conselhos que recebi. </p><p>Ainda assim, eu criei uma linguagem nova e ela funcionou. É sinal de que estive fazendo alguma coisa certa. </p><p>Neste artigo, vou me aprofundar sobre o assunto e mostrar o pipeline que a Pinecone (e outras linguagens de programação) usam para transformar o código-fonte em magia. &nbsp;</p><p>Também falarei sobre algumas das concessões que fiz e no motivo de haver tomado as decisões que tomei.</p><p>Este não é, de modo algum, um tutorial completo sobre como escrever um linguagem de programação, mas é um bom ponto de partida se você tem curiosidade sobre como desenvolver uma linguagem. </p><h3 id="come-ando"><strong>Começando</strong></h3><p>"Não tenho a menor ideia sobre onde devo começar" é algo que escuto muito quando digo que estou escrevendo uma linguagem de programação. No caso de essa ser a sua reação, eu vou passar por algumas decisões iniciais que são tomadas e passos que são dados quando começamos a escrever qualquer linguagem nova. </p><h4 id="compilada-x-interpretada"><strong>Compilada x Interpretada</strong></h4><p>Aqui temos os dois tipos principais de linguagens: compiladas e interpretadas</p><ul><li>Um compilador calcula tudo o que um programa fará, transforma-o em "código de máquina" (um formato que o computador pode executar muito rápido) e depois salva esse código para ser executado mais tarde.</li><li>Um interpretador passa pelo código-fonte linha por linha, descobrindo o que está fazendo no seu caminho.</li></ul><p>Tecnicamente, qualquer linguagem pode ser compilada ou interpretada, mas a escolha por um tipo ou outro depende do que geralmente faz mais sentido para aquela linguagem específica. Geralmente, as interpretadas tendem a ser mais flexíveis, enquanto as compiladas tendem a ter alto desempenho. Isso, porém, é apenas o início de um tópico muito complexo.</p><p>Dou muito valor ao desempenho. Já percebi a falta de linguagens de programação de alta desempenho que sejam simples. Então, escolhi que a Pinecone seria compilada.</p><p>Isso foi muito importante para tomar uma decisão logo de inicio, porque vários designs de linguagem são afetados por isso (por exemplo, tipagem estática é um grande benefício das linguagens compiladas, mas não tanto quanto para linguagens interpretadas).</p><p>Apesar da Pinecone ter sido projetada com a compilação em mente, ela tem um interpretador totalmente funcional que, durante um tempo, foi a única forma de executá-la. Lá, veremos diversos motivos para isso, que eu vou explicar mais adiante.</p><h4 id="escolhendo-uma-linguagem"><strong>Escolhendo uma linguagem</strong></h4><p>Eu sei que é um pouco fora do escopo, mas uma linguagem de programação é, em si, um programa. Por isso, você precisa escrevê-la em uma outra linguagem de programação. Escolhi o C++ por causa de seu desempenho e conjunto de funcionalidades. Além disso, eu realmente gosto de programar em C++. </p><p>Se você estiver escrevendo uma língua interpretada, faz muito sentido escrever em uma linguagem compilada (como C, C++ ou Swift) porque o desempenho perdido na linguagem interpretada e no interpretador que estará interpretando sua linguagem acabarão se acumulando.</p><p>Se está planejando uma linguagem compilada, uma linguagem mais lenta (como o Python ou o JavaScript) podem ser mais aceitáveis. O tempo de compilação pode ser ruim, mas, na minha opinião, isso não é tão importante quanto um tempo de execução longo.</p><h4 id="design-de-alto-n-vel"><strong>Design de alto nível</strong></h4><p>Uma linguagem de programação geralmente é estruturada como um pipeline, ou seja, tem vários estágios. Cada estágio tem dados formatados de um modo específico e bem definido, além de ter funções para transformar dados de cada estágio para outros níveis. </p><p>A primeira etapa é uma cadeia contendo todo o arquivo de fonte de entrada. A etapa final é algo que pode ser executado. Tudo isso se tornará claro à medida que passarmos passo a passo pelo pipeline da Pinecone.</p><h3 id="lexing"><strong>Lexing</strong></h3><p>O primeiro passo na maioria de linguagem de programação é o lexing, ou tokenização. "Lex" é a abreviação para <em>lexical analysis</em> (análise lexical, em português), uma palavra muito elegante para <em>divisão de um texto em tokens</em>. A palavra "tokenização" faz muito mais sentido, mas <em>lexer</em> é tão divertido de dizer que uso essa palavra de qualquer maneira.</p><h4 id="tokens"><strong>Tokens</strong></h4><p>Um token é uma unidade pequena da linguagem. Um token (também conhecido como identificador) pode ser o nome de uma variável ou função, um operador ou um número.</p><h4 id="para-que-serve-o-lexer"><strong>Para que serve o <em>lexer</em></strong></h4><p>O <em>lexer </em>deve pegar uma string contendo o código-fonte inteiro e devolver uma lista contendo cada token.</p><p>Os estágios futuros do pipeline não farão referência ao código-fonte original, portanto o <em>lexer</em> deve produzir para eles todas as informações necessárias. A razão para este formato relativamente rígido do pipeline é que o <em>lexer</em> pode fazer tarefas como remover comentários ou detectar se algo é um número ou identificador. Você &nbsp;vai querer manter essa lógica fechada dentro do <em>lexer</em>, tanto para não ter que pensar nessas regras ao escrever o resto da linguagem, quanto para poder mudar esse tipo de sintaxe em um único lugar.</p><h3 id="flex">Flex</h3><p>No dia em que comecei a escrever a linguagem, a primeira coisa que fiz foi um <em>lexer </em>simples. Pouco depois, comecei a aprender sobre ferramentas que supostamente deixariam o <em>lexer </em>mais simples e com menos erros.</p><p>A ferramenta que mais ajuda com isso é o Flex, um programa gerador de <em>lexers</em>. Você dá a ele um arquivo que tem uma sintaxe especial para que ele descreva a sintaxe da linguagem. A partir disso, ele gera um programa em C, que cria uma string com o léxico e produz o resultado desejado.</p><h4 id="minha-decis-o"><strong>Minha decisão</strong></h4><p>Optei por manter o <em>lexer</em> que escrevi por enquanto. No fim, eu não vi benefícios significativos em usar o Flex, ao menos não o suficiente para justificar a adição de uma dependência e para complicar ainda mais o processo de <em>build</em>.</p><p>Meu <em>lexer </em>tem somente uma centena de linhas de código e me causa muito poucos problemas. Produzir meu próprio <em>lexer </em>também me traz mais flexibilidade, como a capacidade de adicionar um operador à linguagem sem precisar editar diversos arquivos.</p><h3 id="fazendo-o-parsing"><strong>Fazendo o parsing</strong></h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/08/NpNL7zAZTaWvCFEx9iVecnx0wyalOFW5TTkO.png" class="kg-image" alt="NpNL7zAZTaWvCFEx9iVecnx0wyalOFW5TTkO" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/08/NpNL7zAZTaWvCFEx9iVecnx0wyalOFW5TTkO.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/08/NpNL7zAZTaWvCFEx9iVecnx0wyalOFW5TTkO.png 800w" sizes="(min-width: 720px) 720px" width="800" height="334" loading="lazy"></figure><p>O segundo estágio do pipeline é o <em>parser</em>. Ele transforma uma lista de tokens em uma árvore de nós. Uma árvore usada para o armazenamento desse tipo de dados é conhecida como uma Árvore de Sintaxe Abstrata (em inglês, <em>Abstract Syntax Tree</em>, ou AST). Ao menos na Pinecone, a AST não tem informações sobre tipos ou qual identificador é qual. Ela é simplesmente os tokens estruturados.</p><h4 id="tarefas-do-parser"><strong>Tarefas do parser</strong></h4><p>O parser adiciona estrutura à lista ordenada de tokens que o <em>lexer </em>produz. Para acabar com as ambiguidades, o parser deve levar em conta os parênteses e a ordem das operações. Fazer o <em>parsing </em>dos operadores, simplesmente, não é algo incrivelmente difícil, mas quanto mais construtos da linguagem são adicionados, mais o <em>parsing </em>pode se tornar extremamente complexo.</p><h4 id="bison"><strong>Bison</strong></h4><p>Novamente, precisei tomar uma decisão que envolvia uma biblioteca de terceiros. A biblioteca mais conhecida de <em>parsing</em> é a Bison. A Bison funciona de modo muito parecido com a Flex. Você escreve um arquivo no formato personalizado, que armazena as informações de gramática, e a Bison usa esse arquivo para gerar um programa em C que fará seu <em>parsing</em>. Optei por não usar a Bison, tampouco.</p><h4 id="por-que-o-personalizado-melhor"><strong>Por que o personalizado é melhor?</strong></h4><p>Com o <em>lexer</em>, a decisão de usar meu próprio código ficou bastante óbvia. Um <em>lexer</em> assim é um programa simples. Não escrever meu próprio <em>lexer </em>pareceu tão bobo quanto não escrever... bem... meu próprio programa simples.</p><p>Com o <em>parser</em>, seria algo bem diferente. O <em>parser </em>da Pinecone neste momento já está em 750 linhas. Eu escrevi três versões de parser diferentes até o momento, pois as duas primeiras eram um lixo.</p><p>Eu tomei essa decisão inicialmente por várias razões. Apesar de não ter sido exatamente algo muito fácil de fazer, a maioria dessas razões permanece valendo. As mais importantes são:</p><ul><li>Minimizar a troca de contexto no fluxo de trabalho: a troca de contexto entre o C++ e a Pinecone já é ruim o suficiente sem adicionar a gramática da Bison</li><li>Manter simples o <em>build</em>: sempre que a gramática for mudada, a Bison precisa ser executada antes da <em>build</em>. Isso pode ser automatizado, mas fica chato ao trocar entre sistemas de <em>build</em>.</li><li>Eu gosto de criar coisas legais: eu não fiz a Pinecone porque eu pensei que seria fácil, então para que delegar uma função central quando eu a poderia fazer por minha conta? Um <em>parser</em> personalizado pode não ser trivial, mas é completamente factível.</li></ul><p>No começo, eu não tinha muita certeza se eu estava indo por um caminho viável, mas eu ganhei um pouco mais de confiança com o que Walter Bright (o desenvolvedor de uma versão anterior do C++ e criador da linguagem D) <a href="http://www.drdobbs.com/architecture-and-design/so-you-want-to-write-your-own-language/240165488" rel="noopener">disse uma vez sobre o assunto</a> (referência de texto em inglês):</p><blockquote>"Um pouco mais controverso era o fato de que eu não deveria me importar com geradores de lexer ou de parser e com outros assim chamados 'compiladores de compilador'. Eles são uma perda de tempo. Escrever um lexer e um parser é uma porcentagem mínima do trabalho de escrever um compilador. Usar um gerador levaria tanto tempo quanto escrever um por conta própria, e associará você ao gerador (o que é importante ao transpor o compilador para uma nova plataforma). Além disso, os geradores têm a reputação infeliz de lançar mensagens de erro péssimas."</blockquote><h3 id="-rvore-de-a-es"><strong>Árvore de ações</strong></h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/08/oEWwpUKAUetQYx8BsfDSkMjCVQ9-khJFZ9s4-1.png" class="kg-image" alt="oEWwpUKAUetQYx8BsfDSkMjCVQ9-khJFZ9s4-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/08/oEWwpUKAUetQYx8BsfDSkMjCVQ9-khJFZ9s4-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/08/oEWwpUKAUetQYx8BsfDSkMjCVQ9-khJFZ9s4-1.png 800w" sizes="(min-width: 720px) 720px" width="800" height="202" loading="lazy"></figure><p>Agora saímos da área dos termos universais e comuns para entrarmos nos termos que eu já não tenho tanto entendimento. Do meu ponto de vista, o que eu chamo de "árvore de ações" é muito parecido com a IR (<em>intermediate representation</em>, ou representação intermediária, em português) das LLVMs.</p><p>Há uma diferença sutil, mas significativa entre a árvore de ações e a árvore de sintaxe abstrata. Levou um tempo até que eu entendesse que poderia até mesmo haver essa diferença entre elas (o que contribuiu com a necessidade de reescrever o <em>parser</em> algumas vezes).</p><h4 id="-rvore-de-a-es-x-ast"><strong>Árvore de ações x AST</strong></h4><p>De modo simplificado, a árvore de ações é a AST mais o contexto. O contexto são as informações como o tipo que a função retorna ou aqueles dois locais onde uma variável é usada estão usando, de fato, a mesma variável. Como ela precisa descobrir e memorizar todo esse contexto, o código que gera a árvore de ação precisa de muitas buscas nas tabelas de <em>namespace </em>além de outros detalhes.</p><h4 id="executando-a-rvore-de-a-es"><strong>Executando a árvore de ações</strong></h4><p>Ao termos uma árvore de ações, executar o código é fácil. Cada nó de ação tem uma função "executar", que recebe uma entrada, faz o que a ação deve fazer (incluindo a possível chamada a uma subação) e retorna o resultado da ação. Esse é o interpretador trabalhando.</p><h3 id="op-es-de-compila-o"><strong>Opções de compilação</strong></h3><p>"Espere aí", você pode dizer, "você não disse que a Pinecone era pra ser compilada?" Sim, é. A compilação, no entanto, é mais difícil que a interpretação. Existem algumas abordagens possíveis.</p><h4 id="criar-meu-pr-prio-compilador"><strong>Criar meu próprio compilador</strong></h4><p>Essa opção me pareceu boa de início. Eu gosto muito de fazer tudo por minha conta. Fiquei me coçando por uma desculpa para melhorar meu <em>assembly</em>.</p><p>Infelizmente, escrever um compilador portátil não é tão fácil como escrever código de máquina para cada elemento da linguagem. Em função do número enorme de arquiteturas e sistemas operacionais, é quase impossível para um único indivíduo escrever o back-end de um compilador multiplataforma.</p><p>Até mesmo as equipes por trás do Swift, do Rust e do Clang não se deram ao trabalho de fazer isso por conta própria. Em vez disso, elas usaram a…</p><h4 id="llvm"><strong>LLVM</strong></h4><p>A LLVM é uma coleção de ferramentas de compilação. Basicamente, é uma biblioteca que transformará sua linguagem em um arquivo binário executável e compilado. Parecia a opção perfeita. Por isso, mergulhei nessa ideia diretamente. Infelizmente, eu não vi a profundidade do lago em que eu estava mergulhando e acabei me afogando.</p><p>A LLVM, embora não seja difícil como a linguagem <em>assembly</em>, é uma biblioteca enorme complexa. Ela não é impossível de usar, tem bons tutoriais, mas eu percebi que precisaria de alguma prática antes de conseguir implementar plenamente um compilador para a Pinecone com ela.</p><h4 id="transpila-o"><strong>Transpilação</strong></h4><p>Eu queria algum tipo de Pinecone compilada e queria isso rapidamente. Parti, então, para um método que eu sabia que poderia fazer com que isso desse certo: a transpilação.</p><p>Eu escrevi um transpilador de Pinecone em C++, adicionando a ele a capacidade de compilar automaticamente a origem do resultado com o GCC. Isso funciona, de fato, para quase todos os programas em Pinecone (embora existam alguns casos de exceção que causam erros no transpilador). Não é uma solução particularmente portável ou escalável, mas funciona por enquanto.</p><h4 id="futuro"><strong>Futuro</strong></h4><p>Se assumirmos que eu continuarei a desenvolver a Pinecone, ela receberá suporte de compilação da LLVM mais cedo ou mais tarde. Suspeito que, não importando o quanto de trabalho eu dedique a ele, o transpilador nunca será inteiramente estável – além disso, os benefícios da LLVM são diversos. É apenas uma questão de quando eu terei tempo de fazer alguns projetos iniciais na LLVM até dominá-la bem.</p><p>Enquanto esse tempo não chega, o interpretador é ótimo para os programas simples e a transpilação em C++ funciona para a maioria dos casos que necessitam de mais desempenho.</p><h3 id="conclus-o"><strong>Conclusão</strong></h3><p>Espero ter tornado linguagens de programação um pouco menos misteriosas para você. Se você quiser criar uma por conta própria, é algo que eu recomendo imensamente. Existem milhares de detalhes de implementação a serem descobertos, mas a descrição aqui deve ser suficiente para dar seu primeiro impulso.</p><p>Aqui vai meu conselho para quem está começando (mas lembre-se: eu não sei muito bem o que estou fazendo ainda, então aceite o conselho com toda a precaução possível):</p><ul><li>Se estiver em dúvida, escolha a linguagem interpretada. Linguagens interpretadas são geralmente mais fáceis de projetar, criar e aprender. Não é tentar impedir você de escrever uma linguagem compilada se você sabe bem o que quer fazer. Porém, se estiver em dúvida, escolha a interpretada.</li><li>Quando o assunto for <em>lexers</em> e <em>parsers</em>, faça o que quiser. Existem argumentos válidos a favor e contra escrever seus próprios programas. No fim, se perceber que seu design e implementação fazem tudo de modo racional, não importa a escolha.</li><li>Aprenda com o pipeline que eu acabo de descrever. Houve muita tentativa e erro na criação do pipeline que eu tenho nesse momento. Tentei eliminar ASTs, ASTs que viram árvores de ações, bem como outras ideias horríveis. Esse pipeline funciona. Então, não o altere, a menos que tenha uma ideia muito boa.</li><li>Se não tiver tempo nem motivação para implementar uma linguagem de propósito geral e complexa, experimente implementar uma linguagem esotérica, como a <a href="https://esolangs.org/wiki/Brainfuck" rel="noopener">Brainfuck</a> (texto em inglês). Esses interpretadores podem ter apenas umas cem ou duzentas linhas.</li></ul><p>Eu tenho muito pouco do que me arrepender em termos do desenvolvimento da Pinecone. Fiz algumas escolhas ruins no caminho, mas reescrevi a maior parte do código afetada por esses erros.</p><p>Agora, a Pinecone está em um estado bom o suficiente para funcionar bem e pode ser facilmente melhorada. Escrever a Pinecone foi um aprendizado e tanto para mim, além de uma experiência bastante agradável, e eu estou apenas começando.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Ciência da Computação x Engenharia de Software - Qual curso é o melhor para você? ]]>
                </title>
                <description>
                    <![CDATA[ Escrito por: YK Sugi Olá a todos! Meu nome é YK e, atualmente, sou o responsável pelo CS Dojo [https://www.youtube.com/csdojo], um canal de educação em programação no YouTube com mais de 200 mil inscritos. Também já fui desenvolvedor de software na Google [https://www.freecodecamp.org/news/why-i-left-my-100-000-job-at-google-60b5cf4ebefe]  (texto em inglês). Duas das perguntas ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/ciencia-da-computacao-x-engenharia-de-software-qual-curso-e-o-melhor-para-voce/</link>
                <guid isPermaLink="false">62797848357c22053df61538</guid>
                
                    <category>
                        <![CDATA[ Programação ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Enoá Mourão ]]>
                </dc:creator>
                <pubDate>Tue, 10 May 2022 22:29:43 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2022/05/1_Amg2pTBZ3nAfS5-K9IvyGQ.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/computer-science-vs-software-engineering-which-one-is-a-better-major-88482c38446b/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Computer Science VS Software Engineering - Which Major Is Best For You?</a>
      </p><p>Escrito por: YK Sugi</p><p>Olá a todos! Meu nome é YK e, atualmente, sou o responsável pelo <a href="https://www.youtube.com/csdojo" rel="noopener">CS Dojo</a>, um canal de educação em programação no YouTube com mais de 200 mil inscritos. Também <a href="https://www.freecodecamp.org/news/why-i-left-my-100-000-job-at-google-60b5cf4ebefe">já fui desenvolvedor de software na Google</a> (texto em inglês).</p><p>Duas das perguntas mais comuns que meu público me faz são:</p><blockquote><strong>"Qual a diferença entre os cursos de Ciência da Computação e Engenharia de <strong>Software?</strong>"</strong></blockquote><p>E…</p><blockquote><strong>"Devo escolher Ciência da Computação ou Engenharia de Software se eu quiser ser um engenheiro de software"</strong></blockquote><p>Nesse artigo, eu vou responder a isto e dar minha própria análise rápida sobre esses cursos. </p><h3 id="uma-r-pida-vis-o-geral-dos-dois-cursos"><strong>Uma rápida visão geral dos dois cursos</strong></h3><ul><li>Ciência da Computação é o estudo de como os computadores funcionam, a maioria sob a perspectiva teórica e da matemática.</li><li>Você deveria escolher Ciência da Computação se você gosta de matemática, lógica, ou se quiser entrar em um campo especializado da Ciência da Computação, como inteligência artificial, aprendizagem de máquina, segurança ou na área gráfica.</li><li>Engenharia é o estudo de como os sistemas de software são construídos, incluindo tópicos como gestão de projetos, garantia de qualidade e testes de software. </li><li>Você deve escolher a Engenharia de Software se estiver mais interessado na abordagem prática e se quiser aprender sobre o ciclo de vida em geral, sobre como o software é construído e mantido. </li><li>Tanto a Ciência da Computação como a Engenharia de Software ensinam fundamentos de programação e ciência da computação. Então, você pode escolher qualquer dessas opções para se tornar um desenvolvedor de software.</li></ul><p>Para entender a diferença entre as áreas da Ciência da Computação e da Engenharia de Software, vamos dar uma olhada nos respectivos currículos na Universidade de Waterloo, no Canadá. </p><p>Escolhi a Universidade de Waterloo para isso porque é um dos melhores programas de Ciência da Computação da América do Norte.</p><h3 id="perspectivas-de-trabalho"><strong><strong>Perspectivas de trabalho</strong></strong></h3><p>Vamos primeiro comparar os tipos de trabalhos e estágios que você pode ter através cada programa. </p><p>Felizmente, o site da Universidade de Waterloo dispõe de vários exemplos. </p><p>Para cada área, aqui estão alguns dos títulos que os ex-alunos detêm, e onde eles trabalham:</p><h4 id="ci-ncia-da-computa-o"><strong>Ciência da Computação</strong></h4><ul><li>Desenvolvedor para a web/arquiteto, The Steele Group</li><li>Programador, Harry Rosen Inc.</li><li>Computação em nuvem/dispositivos móveis, Clearbridge Associates Limited</li><li>Engenheiro de software, General Dynamics Canada</li><li>Engenheiro desenvolvedor de software, Microsoft</li><li>Engenheiro agile, Pivotal Labs</li><li>Analista de négocios, Canadian Tire Corporation</li><li>Consultor de desenvolvimento, Google</li><li>Gerente de produtos, Dropbox</li></ul><h4 id="engenheiro-de-software"><strong>Engenheiro de <strong>Software</strong></strong></h4><ul><li>Desenvolvedor de software, Tagged Inc</li><li>Desenvolvedor de software, IBM Canada</li><li>Gerenciador de software, Arius Software Corporation</li><li>Engenheiro de software, VistaPrint USA</li><li>Engenheiro de software, Harris Corporation</li><li>Desenvolvedor de software, Accenture Inc.</li><li>Gerente técnico de produtos — Designer de software e desenvolvimento , NexJ Systems Inc</li><li>Consultor, PureFacts Financial Solutions</li><li>Consultor de implementação, Desire2Learn</li></ul><p>Como pode perceber, não há uma grande diferença entre os tipos de trabalhos que você pode ter.</p><p>O emprego mais comum que os graduados obtêm após receberem seu diploma de Ciência da Computação ou de Engenharia de Software é o de desenvolvedor ou engenheiro de software.</p><p>Existem também outras opções relacionadas, tais como gerente de produtos, analista de garantia de qualidade e consultor em tecnologia. Suas opções dependerão de seu conjunto de habilidades específicas.</p><h3 id="primeiro-ano-"><strong><strong>Primeiro ano:</strong></strong></h3><p>Agora, vamos dar uma olhada nos cursos obrigatórios de cada programa. Vamos primeiro comparar alguns dos cursos que você precisaria fazer em seu primeiro ano.</p><h4 id="ci-ncia-da-computa-o-1"><strong><strong>Ciência da Computação</strong></strong></h4><ul><li>CC 135 — Projeto de programas funcionais</li><li>CC 136 — &nbsp;Projeto de algoritmos e abstração de dados</li><li>Matemática 135 — Álgebra</li><li>Matemática 136 — Álgebra linear 1</li><li>Matemática 137 — Cálculo 1</li><li>Matemática 138 — Cálculo 2</li><li>Além de algumas eletivas</li></ul><h4 id="engenharia-de-software"><strong><strong>Engenharia de Software</strong></strong></h4><ul><li>CC 137 — Princípios de programação</li><li>CC 138 — Abstração e implementação de dados</li><li>MATH 115 — Álgebra linear para engenheiros</li><li>MATH 117 — Cálculo 1 para engenheiros</li><li>MATH 119 — Cálculo 2 para engenheiros</li><li>MATH 135 — Álgebra para o bacharelado em matemática</li><li>ECE 105 — Física da engenharia elétrica 1</li><li>ECE 106 — Eletricidade e magnetismo</li><li>ECE 124 — Circuitos e sistemas digitais</li><li>ECE 140 — Circuitos lineares</li><li>SE 101 — Métodos de engenharia de software</li></ul><p>Como você pode ver, os cursos do primeiro ano também são bastante semelhantes. Ambos cobrem alguns assuntos fundamentais de ciência da informação, e alguns assuntos da matemática em álgebra linear e cálculo.</p><p>A única grande diferença é que a Engenharia de Software tem componentes adicionais de física e engenharia elétrica, enquanto a Ciência da Computação tem mais algumas eletivas.</p><h3 id="curso-ap-s-o-primeiro-ano-"><strong><strong>Curso </strong>apó<strong>s o primeiro ano<strong><strong>:</strong></strong></strong></strong></h3><p>E quanto aos cursos obrigatórios e opcionais após o primeiro ano? Vamos dar uma olhada em diversos exemplos aqui:</p><h4 id="ci-ncia-da-computa-o-2"><strong><strong>Ciência da Computação</strong></strong></h4><ul><li>MATH 239 Introdução à combinatória</li><li>Estatística 230 Probabilidade</li><li>Estatística 231 Estatística</li><li>CC 240 Estruturas de dados e gerenciamento de dados</li><li>CC 241 Fundamentos de programas sequenciais</li><li>CC 245 Logica e computação</li><li><strong><strong>C</strong>C<strong> 246 </strong>Desenvolvimento de software orientado a objetos<strong> </strong></strong>&lt;- não exigido para a área de Engenharia de Software</li><li>CC 251 Designer e organização de computadores</li><li>CC 341 Algoritmos</li><li>CC 350 Sistemas operacionais</li><li>Além disso, várias eletivas de Ciência da Computação</li></ul><h4 id="engenharia-de-software-"><strong><strong>Engenharia de <strong><strong>Software:</strong></strong></strong></strong></h4><ul><li>CHE 102 Química para engenheiros</li><li>ECE 222 Computadores digitais (inclui linguagem Assembly)</li><li>ECE 358 Redes de computadores</li><li>MATH 213 Matemática avançada para Engenheiros de Software</li><li>MATH 239 Introdução à combinatória</li><li>STAT 206 Estatísticas para engenheiros de software</li><li>MSCI 261 Economia da engenharia: gestão financeira para engenheiros</li><li>CC 241 Fundamentos de programas sequenciais</li><li>CC 240 Estruturas de dados e gerenciamento de dados</li><li><strong><strong>C</strong>C<strong> 247 </strong>Princípios de engenharia de software</strong> &lt;- não é necessário para a área de Ciência da Computação</li><li>CC 341 Algoritmos</li><li><strong><strong>C</strong>C<strong> 349 </strong>Interface de usuário </strong>&lt;- não é necessário para a área de Ciência da Computação</li><li><strong><strong>C</strong>C<strong> 343 </strong>Programação concorrente e paralela </strong>&lt;- não necessário para a área de Ciência da Computação</li><li>CC 348 Introdução a gestão de bancos de dados</li><li>ES 212 Logica e computação</li><li>ES 350 Sistemas operacionais </li><li>ES 465 Testes de software e garantia de qualidade</li><li>ES 464 Design de software e arquitetura</li><li>ES 463 Especificação e análise de requisitos de software</li><li>ES 490 Design de projetos</li><li>Além disso, algumas eletivas de Ciência da Computação e da Engenharia Elétrica</li></ul><h4 id="s-o-muitas-informa-es-para-assimilar-mas-aqui-est-o-resumo"><strong>São MUITAS informações para assimilar, mas aqui está o resumo</strong></h4><p>Quando se trata dos requisitos em matemática e estatística, a Ciência da Computação e a Engenharia de Software são quase idênticas. Ambas abrangem combinatória, probabilidade e estatística.</p><p>Os principais requisitos da ciência da computação também são similares, abrangendo algoritmos, estruturas de dados e sistemas operacionais.</p><p>As diferenças principais são:</p><ul><li>A <strong>Engenharia de Softwar</strong>e tem mais requisitos em engenharia elétrica e fundamentos de engenharia de software, tais como testes de software, projetos e especificação de requisitos de software.</li><li>A <strong>Ciência da Computação</strong> permite mais eletivas em disciplinas de Ciência da Computação de nível superior. Você pode escolher entre uma ampla variedade de tópicos como segurança, fundamentos de engenharia de software, visão computacional, aprendizado de máquina e gerenciamento de banco de dados.</li></ul><h3 id="ent-o-qual-voc-deveria-escolher"><strong><strong>Então, qual você deveria escolher?</strong></strong></h3><p>Acho que isso depende principalmente da suas preferências. Em resumo:</p><ul><li>Você deveria escolher Ciência da Computação se você gosta de matemática, lógica, ou se quiser entrar em um campo especializado da Ciência da Computação, como inteligência artificial, aprendizagem de máquina, segurança ou na área gráfica.</li><li>Você deve escolher a Engenharia de Software se estiver mais interessado na abordagem prática e se quiser aprender sobre o ciclo de vida em geral, sobre como o software é construído e mantido. </li></ul><p><strong>Mas espere <strong><strong>—</strong></strong> qual dos cursos, então? Qual é melhor se você quer ser um engenheiro de software?</strong></p><p>Bem, aqui vai minha opinião. Nessa universidade específica (Universidade de Waterloo), com esse conjunto específico de requisitos do programa, a Ciência da Computação é um curso melhor se você deseja ser um engenheiro de software.</p><p>Apenas por simplicidade, vamos supor que você esteja esperando conseguir um dos empregos mais bem-pagos (cerca de U$ 100.000/ano) como engenheiro de software na América do Norte. Estes empregos são normalmente em grandes empresas de software (pense na Microsoft, Google, Amazon etc.) ou em empresas de médio porte, de alto crescimento (pense na Dropbox, Lyft, Snapchat, Pinterest etc.).</p><p>Tipicamente, o que eles procuram em candidatos a engenheiro de software é a habilidade de escrever códigos sólido e de construir projetos interessantes, bem como os fundamentos da Ciência da Computação, incluindo estruturas de dados e algoritmos. </p><p>Acho que a melhor maneira de ter este conjunto de habilidades é aprender rapidamente os fundamentos da ciência da computação e passar seu próprio tempo praticando a resolução de problemas e a escrita de códigos.</p><p>Com base no currículo de Engenharia de Software e no quanto os estudantes de engenharia tendem a estar ocupados em geral, acho que seria mais difícil fazer isso com Engenharia de Software do que com Ciência da Computação.</p><p>Outro benefício deste programa particular de Ciência da Computação é que ele permite mais eletivas em Ciência da Computação. Isto também é ótimo porque, dependendo do que estiver em demanda no mercado de trabalho, você será capaz de ajustar seus cursos. Por exemplo, se o desenvolvimento de aplicativos para dispositivos móveis estiver em demanda, você poderá aprender a fazer isso. E se a computação paralela estiver em demanda, você pode se concentrar nisso no lugar dos aplicativos móveis.</p><p>Tenho certeza de que há alguns benefícios na aprendizagem de fundamentos de engenharia de software (gerenciamento de projetos, design, testes etc.). Mas eu, pessoalmente, preferiria ter flexibilidade com relação a um conjunto pré-definido de habilidades. É por isso que eu acho que a Ciência da Computação é uma área melhor para se tornar um engenheiro de software com este currículo em específico.</p><p>Claro, esta é apenas minha opinião, e essa é apenas uma universidade em particular. Eu adoraria saber a sua opinião e como foi sua experiência se você se formou em Ciência da Computação ou em Engenharia de Software.</p><h4 id="algumas-observa-es"><strong>Algumas observações</strong></h4><p><strong>Observação 1:</strong> Universidades diferentes têm exigências diferentes para estas duas áreas de habilitação principal. Este artigo deve ser um bom ponto de partida, mas você ainda deve dar uma olhada nos requisitos do programa na universidade que você está interessado em frequentar.</p><p><strong>Observação 2: </strong>Algumas universidades não possuem sequer uma especialização em Engenharia de Software. Por exemplo, a Universidade de British Columbia, em Vancouver, tem graduação em Ciência da Computação e Engenharia de Computação, mas não em Engenharia de Software. No entanto, os dois cursos têm uma área focal em engenharia de software dentro de seu programa de Ciência da Computação, bem como no de Engenharia da Computação.</p><p>Se a universidade na qual você está interessado não tiver uma especialização em Engenharia de Software, eu escolheria a Ciência da Computação, se você quiser se tornar um desenvolvedor de software. A Engenharia da Computação é mais focada em hardware do que em Ciência da Computação ou em Engenharia de Software, portanto está menos diretamente relacionada com o trabalho típico de um desenvolvedor de software.</p><h4 id="essas-s-o-as-principais-fontes-que-usei-"><strong>Essas são as principais fontes que usei:</strong></h4><ul><li><a href="https://uwaterloo.ca/future-students/programs/computer-science" rel="noopener">Ciência da Computação na Waterloo</a></li><li><a href="https://uwaterloo.ca/future-students/programs/software-engineering" rel="noopener">Engenharia de Software na Waterloo</a></li></ul><p>Obrigado pela leitura e boa sorte escolhendo sua universidade e sua especialização!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Do zero a designer de jogos: como começar a criar videogames mesmo sem experiência alguma ]]>
                </title>
                <description>
                    <![CDATA[ Escrito por: Angela He Há dois anos, eu era uma estudante do ensino médio de apenas 17 anos que não sabia nada sobre programação. De qualquer forma, eu segui em frente e, alguns meses depois, publiquei meu primeiro jogo na Steam. Neste momento, já tenho criados mais de 10 jogos ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/do-zero-a-designer-de-jogos-como-comecar-a-criar-videogames-mesmo-sem-experiencia-alguma/</link>
                <guid isPermaLink="false">62713e1fe15e0b050ea337cd</guid>
                
                    <category>
                        <![CDATA[ Jogos ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Enoá Mourão ]]>
                </dc:creator>
                <pubDate>Tue, 10 May 2022 22:28:31 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2022/05/1_ceUs59K42Htx2517TdSvQg.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/from-zero-to-game-designer-how-to-start-building-video-games-even-if-you-dont-have-any-experience-5e2f9f45f4bb/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">From Zero to Game Designer: how to start building video games even if you don’t have any experience</a>
      </p><p>Escrito por: Angela He</p><p>Há dois anos, eu era uma estudante do ensino médio de apenas 17 anos que não sabia nada sobre programação. De qualquer forma, eu segui em frente e, alguns meses depois, publiquei meu primeiro jogo na Steam.</p><p>Neste momento, já tenho criados mais de <a href="https://zephyo.itch.io/" rel="noopener">10 jogos para desktop, web e dispositivos móveis</a>, que já foram jogados, combinados, mais de 1,9 milhão de vezes.</p><p>Não importa seu nível de habilidade, você também pode fazer um jogo. Há dois anos, pensei ser impossível, mas tentei mesmo assim. Foi a coisa mais difícil que eu já tinha feito. Mas deu certo. Agora, percebo que o desenvolvimento de jogos é como qualquer outra habilidade - somente se progride fazendo, errando e melhorando.</p><p>Ensinei a mim mesma tudo o que sei. Agora, é o momento em que eu vou ensinar você.</p><h3 id="para-fazer-um-jogo-voc-deve-passar-pelo-os-seis-est-gios-do-desenvolvimento-de-jogos-design-arte-programa-o-udio-polimento-marketing-"><strong>Para fazer um jogo, você deve passar pelo os seis estágios do desenvolvimento de jogos: Design. Arte. Programação. Áudio. Polimento. Marketing.</strong></h3><p>O resto da minha publicação será estruturado de acordo com os tópicos abaixo:</p><ul><li><strong>Conselhos<strong> </strong></strong>que juntei aqui sobre minha experiência e a de outros desenvolvedores.</li><li><strong>Recurso<strong>s </strong></strong>que descobri que podem ser bastante úteis.</li></ul><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/05/1_VZbUqT8oEH34kK0XXBcwzg.png" class="kg-image" alt="1_VZbUqT8oEH34kK0XXBcwzg" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/05/1_VZbUqT8oEH34kK0XXBcwzg.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/05/1_VZbUqT8oEH34kK0XXBcwzg.png 800w" sizes="(min-width: 720px) 720px" width="800" height="472" loading="lazy"></figure><h3 id="1-design"><strong><strong>1. </strong>Design</strong></h3><h4 id="conselho"><strong>Conselho</strong></h4><p>Você teve uma grande ideia.</p><p>Agora, como pode registrá-la por escrito?</p><p>Todos terão sua própria maneira de fazer isso da melhor maneira possível. Alguns redigem documentos de design de 60 páginas. Outros, como eu, escrevem uma página de notas de mal escritas, que outras pessoas terão dificuldade de entender. Não sei qual a melhor maneira para você, <strong>mas posso dar algumas sugestões <em>sobre o que escrever a respeito</em><strong>:</strong></strong></p><ul><li><strong>Gancho.</strong> <em>O que faz com que a ideia para um jogo seja ótima?</em> Para mim, essa é a coisa mais importante de se escrever. Uma vez captada, os próximos três pontos podem ser escritos facilmente. O seu jogo é estimulante? Escandaloso? É uma reviravolta para um clássico antigo? Ou é algo que nunca foi feito antes?</li><li><strong>Mecânica.</strong> <em>O que o jogador faz? E qual o propósito do que ele faz?</em> Esse é o seu jogo. Pode ser simples como apertar Q-W-O-P para se mover pelo jogo chamado QWOP ou tocar em botões para conversar em Mystic Messenger, ou podem ser combos de teclas em Dwarf Fortress.</li><li><strong>Estória</strong>. <em>Que estória deveria fazer com que os jogadores lembrassem do seu jogo? Que emoções eles deveriam sentir ao sair do jogo?</em> Todo jogo tem uma estória. Se ela não for uma estória óbvia, é criada pelo jogador. Uma estória pode ser criada a partir de números crescentes em 2048, o nascimento de um império em Civilization ou interações silenciosas em Monument Valley. Pense a estória que será encontrada em seu jogo.</li><li><strong>Clima.</strong> <em>Que impressão o seu jogo deixa no jogador? Como é o visual? Sons?</em> A primeira impressão é importante. A primeira impressão capta — e depois mantém — o jogador no jogo. &nbsp;Talvez, você dê ao seu jogo uma vibe retrô, <a href="https://www.youtube.com/watch?v=1Hojv0m3TqA" rel="noopener">com gráficos pixelados e músicas de chiptune</a> ou um visual moderno e limpo, <a href="https://www.youtube.com/watch?v=GatTHt8SUiA" rel="noopener">com geometria planas e música instrumental</a>.</li></ul><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/05/0_Zm7Qnuq-zJcdKP6d.gif" class="kg-image" alt="0_Zm7Qnuq-zJcdKP6d" width="58" height="20" loading="lazy"></figure><p><strong><strong>* </strong>Está com problemas de chegar em uma boa ideia? </strong>O bloqueio criativo é algo que atinge a todos.</p><ul><li><em>Participe de um hackathon/jam de jogos</em>. Você e outros participantes serão testados a fazer um jogo em um curto espaço de tempo. Durante, e depois, você terá o suporte de outros <em>jammers</em>. E a empolgação e a criatividade que se vê durante a jam são contagiantes. Não sabe por onde começar? <a href="https://ldjam.com/" rel="noopener">Experimente o Ludum Dare</a>, um dos maiores jams de jogos.</li><li><em>Mantenha uma lista de ideias</em>. Eu e outros desenvolvedores que eu conheço anotamos ideias. Dessa maneira, podemos voltar às nossas ideias antigas quando ficamos sem ideias novas.</li></ul><p>Quando a inspiração vier, pare tudo o que está fazendo. Anote a ideia. A próxima vez em que a criatividade desaparecer, você não estará perdido.</p><h4 id="recursos"><strong>Recursos</strong></h4><p>Todos os recursos abaixo foram provados e comprovados. (*) representa um recurso que eu uso atualmente.</p><p><strong>Para anotações:</strong></p><ul><li>Notes para o Mac (*)</li><li>Google Docs (*)</li><li>Trello</li></ul><p><strong>Para colaboração (em equipes):</strong></p><ul><li>Google Drive</li><li>GitHub (*). <em>Requer<em> </em>o <em>git </em>e o<em> .gitignore</em> do <em>Unity.</em></em></li><li>Unity Collab. <em>O mais fácil entre os três<em>. </em>A versão gratuita, porém, possui limitações<em>.</em></em></li></ul><p>Atenção - o Unity é o mecanismo de jogos que eu uso para fazer jogos, por isso vou mencioná-lo em todo o processo. Fique à vontade para experimentar um mecanismo diferente.</p><p><strong>Para design de jogos:</strong></p><ul><li><a href="https://www.google.com/search?q=jesse+schell+book+of+lenses&amp;oq=jesse+schell+book&amp;aqs=chrome.0.0j69i57j0l2.3902j0j1&amp;sourceid=chrome&amp;ie=UTF-8" rel="noopener">The Art of Game Design, de Jesse Schell</a></li><li><a href="https://www.gamedeveloper.com/">Game Developer.com</a></li></ul><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/05/1_gThJElasWJawt867DTcr2w.png" class="kg-image" alt="1_gThJElasWJawt867DTcr2w" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/05/1_gThJElasWJawt867DTcr2w.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/05/1_gThJElasWJawt867DTcr2w.png 800w" sizes="(min-width: 720px) 720px" width="800" height="450" loading="lazy"></figure><h3 id="2-arte"><strong><strong>2. </strong>Arte</strong></h3><h3 id="conselho-1">Conselho</h3><p>Você planejou sua ideia. Parabéns, isso é incrível. Agora você pode trabalhar no jogo de fato.</p><p><em>(<strong>Se você não sabe como programar</strong>, sugiro que faça a fase 3, Programação, antes da Arte. Você não quer criar um jogo que será descartado porque não consegue programar.)</em></p><blockquote><strong><em>Não sabe como desenhar?</em><strong><em><em> </em></em></strong></strong><em>Nã<em>o </em>se preocupe.</em> Qualquer um pode fazer algo bonito com os <a href="https://en.wikipedia.org/wiki/Visual_design_elements_and_principles">3 princípios visuais básicos</a>: cor, forma, espaço (texto em inglês). </blockquote><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/05/0_E0eirD4x5D_CejDi_.jpg" class="kg-image" alt="0_E0eirD4x5D_CejDi_" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/05/0_E0eirD4x5D_CejDi_.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/05/0_E0eirD4x5D_CejDi_.jpg 800w" sizes="(min-width: 720px) 720px" width="800" height="406" loading="lazy"><figcaption>Thomas Was Alone — um jogo simples e lindo</figcaption></figure><h4 id="ui"><strong><strong><strong><strong>UI</strong></strong></strong></strong></h4><p>Pense em como você pode tornar a UI <em><strong>única</strong></em> — ter uma color distinta, fonte(s), forma(s) e ícone(s) — desde que seja <strong><em>funcional</em></strong>. As informações importantes são legíveis e óbvias? As cores/fontes/ícones distraem da ideia principal? </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/05/1_7oMigOwvb5hZw8oNYc4yEA.png" class="kg-image" alt="1_7oMigOwvb5hZw8oNYc4yEA" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/05/1_7oMigOwvb5hZw8oNYc4yEA.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/05/1_7oMigOwvb5hZw8oNYc4yEA.png 800w" sizes="(min-width: 720px) 720px" width="800" height="869" loading="lazy"><figcaption>Quem, para você, é mais legível?</figcaption></figure><h4 id="anima-es-2d"><strong>Animações <strong><strong><strong>2D </strong></strong></strong></strong></h4><p>Voce têm duas opções:</p><ul><li><strong><em>Frame a frame</em>.</strong> Desenhe os frames da animação. Para isso, você deve usar sprite sheets com <a href="https://www.codeandweb.com/texturepacker">TexturePacker</a> (ou, se estiver usando Unity, o <a href="https://docs.unity3d.com/Manual/SpritePacker.html">Sprite Packer</a>)</li><li><em><strong>Baseada em esqueletos.</strong></em> Desenhe cada membro animado, depois anime a posição do membro, a rotação e tudo mais que estiver dentro do jogo. Pode ser mais rápido, mais fácil e economizar memória. Se estiver sendo feito em 2D e usando o Unity, tente editar os pivôs dos sprites ou usar o <a href="https://assetstore.unity.com/packages/2d/characters/anima2d-no-longer-supported-replaced-by-2d-animation-79840">Anima2D</a>.</li></ul><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/05/0_hIZxk2xfmyTYCL38_.gif" class="kg-image" alt="0_hIZxk2xfmyTYCL38_" width="1295" height="645" loading="lazy"></figure><h4 id="dicas-gerais">Dicas gerais</h4><p>Aqui estão algumas dicas gerais sobre arte diversa que se aplicam não apenas à arte em jogos, mas também a outros softwares.</p><ul><li><strong><em>Imagens com padrões em bloco </em></strong>(em inglês, tiles) criam imagens em mosaico e economizam a memória.</li></ul><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/05/0_kJidu4j0jdoKiSak.png" class="kg-image" alt="0_kJidu4j0jdoKiSak" width="487" height="237" loading="lazy"><figcaption>Fora do bloco e em bloco</figcaption></figure><ul><li>Imagens de 9 fatias ou trechos (<strong><em>9-patch/9-slice</em></strong>, em inglês) com bordas não dimensionáveis, mas com um centro dimensionável para criar imagens dimensionáveis e economizar memória.</li></ul><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/05/0_2JhJt6iStsR1P8hy.png" class="kg-image" alt="0_2JhJt6iStsR1P8hy" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/05/0_2JhJt6iStsR1P8hy.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/05/0_2JhJt6iStsR1P8hy.png 720w" sizes="(min-width: 720px) 720px" width="720" height="265" loading="lazy"><figcaption>A imagem azul cresce, mas seus cantos permanecem os mesmos!</figcaption></figure><ul><li>Faça das dimensões de cada imagem um <a href="https://www.gamasutra.com/blogs/RobertBasler/20180202/313739/DXT_Texture_Compression_in_2018.php">múltiplo de 4</a> ou <a href="https://docs.unity3d.com/Manual/ImportingAssets.html">uma potência de 2</a> para economizar memória. A escolha dependerá de como você está comprimindo os recursos.</li><li>Se estiver usando o Photoshop, use "Arquivo &gt; Exportar &gt; Camadas para Arquivos" para exportar rapidamente um arquivo (por exemplo, em PNG, ou JPEG).</li></ul><h4 id="recursos-1"><strong>Recursos</strong></h4><p><strong>Criação da UI:</strong></p><ul><li>Photoshop (*).</li><li>Sketch.</li></ul><p><strong>Princípios de UI:</strong></p><ul><li><a href="https://material.io/design/" rel="noopener">Google Material Design</a> (*) (em inglês).</li><li><a href="https://developer.apple.com/design/tips/" rel="noopener">Apple’s UI Do’s and Don’ts</a> &nbsp;(em inglês).<strong> </strong></li></ul><p><strong>Criação de imagens em 2D:</strong></p><ul><li>Photoshop (*).</li><li>Gimp.</li><li>Paint Tool SAI. Boa <em>para estilos suaves/de anime.</em></li></ul><p><strong>Criação de imagens em 3D:</strong></p><ul><li>Blender (*). <em>Muito bom, mas com uma curva de aprendizagem bem difícil.</em></li><li>Maya<em><em>.</em> Bom para animação.</em></li><li>Max. <em>Bom para renderização.</em></li></ul><p><strong>Recursos gratuitos:</strong></p><ul><li><a href="https://www.behance.net/" rel="noopener">Behance</a> (*). <em>Fonte<em>s + </em>í<em>con</em>e<em>s + </em>outros<em> designs.</em></em></li><li><a href="https://kenney.nl/" rel="noopener">KennyNL</a>. <em>Arte para <em>UI/2D/3D</em> prontas para jogos de alta qualidade<em>.</em></em></li><li><a href="https://opengameart.org/" rel="noopener">Open Game Dev Art</a>. <em>Grande biblioteca de arte gerada por usuários<em>.</em></em></li></ul><p><strong><strong>Inspir</strong>ação<strong>:</strong></strong></p><ul><li><a href="https://dribbble.com/" rel="noopener">Dribbble.</a><em> Designs apenas para designers convidados.</em></li><li><a href="https://www.behance.net/" rel="noopener">Behance</a> (*). <em>Designs para qualquer um que tiver uma conta.</em></li><li><a href="http://itch.io/" rel="noopener">itch.io</a> (*). <em>Lindos jogos indie.</em></li></ul><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/05/1_TMF40Hb52oFS-GlvLRs4Gg.gif" class="kg-image" alt="1_TMF40Hb52oFS-GlvLRs4Gg" width="800" height="450" loading="lazy"></figure><h3 id="3-programa-o"><strong><strong>3. </strong>Programação</strong></h3><h4 id="conselho-2"><strong>Conselho</strong></h4><pre><code>Debug.Log("Ai, não! Hora de programar!! ^_^");</code></pre><p><strong>Seu primeiro passo? </strong>Decidir o mecanismo de jogo e uma <strong><strong>IDE</strong></strong> (Integrated Development Environment — basicamente, um aplicativo que permite a você programar). Minha recomendação de mecanismo de jogo + IDEs está nas fontes abaixo.</p><p><strong>Seu segundo passo? </strong>Programar.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/05/0_PMyxT_fjoTaVsDcs.gif" class="kg-image" alt="0_PMyxT_fjoTaVsDcs" width="76" height="20" loading="lazy"></figure><p><strong>Não sabe como programar?</strong> Eu entendo. Mas saiba que você pode aprender.</p><p>Esses fundamentos de Ciência da Computação devem ser o suficiente para começar (todos os exemplos de códigos aqui são em C++, uma das principais linguagens que o framework de desenvolvimento de jogos 3D da Unity utiliza).</p><p><strong>1) Tipos de dados e variáveis</strong>. Na raiz de todo código estão os dados. Esses dados são armazenados em variáveis. Você pode declarar uma variável assim:</p><pre><code class="language-cpp">int i = 0;</code></pre><p>Vamos por partes:</p><p><code>int</code> é o tipo de dado. <code>i</code> é o nome da variável. E o <code>= 0</code> atribui um zero como o valor da variável.</p><p>E quanto a isso?</p><pre><code class="language-cpp">string s = "pusheen é o melhor gato do mundo";</code></pre><p><code>string</code> é o tipo de dado. <code>s</code> é o nome da variável. E, sim — você adivinhou — <code>"pusheen é o melhor gato do mundo"</code> é o valor da variável.</p><p>Alguns tipos comuns de dados: <code>int</code> e <code>long</code> são números inteiros. <code>float</code> e <code>double</code> são números decimais. E strings são frases (mesmo em uma string vazia — <code>""</code>).</p><p>Quer saber mais? Leia <a href="https://lifehacker.com/5736011/learn-how-to-code-part-i-variables-and-basic-data-types">isto</a> e <a href="https://lifehacker.com/5742493/learn-to-code-part-ii-working-with-variables">isto</a> (textos em inglês).</p><p><strong><strong>2) </strong>Instruções com <em>if</em><strong>.</strong></strong> Instruções com <em>if</em> avaliam se uma determinada condição é verdadeira. Se for, o código que está dentro da instrução <code>if</code> é executado:</p><pre><code>if (true){ //true é sempre avaliado como verdadeiro!

    fazerCoisas(); //Estou dentro das chaves da instrução if; serei executado!
}</code></pre><p>Se uma condição não for verdadeira, podemos validar outra condição com <code>else if</code>:</p><pre><code class="language-cpp">int i = 1;

if (i == 0){ 

   fazerCoisas(); 
}
else if (i == 1){

   fazerOutrasCoisas(); //eu serei executado porque i não é 0!
   
}</code></pre><p>Ou, simplesmente, executar um outro código com <code>else</code>:</p><pre><code class="language-cpp">int i = 60000;

if (i == 0){

  fazerCoisas(); 
  
} else {

  fazerOutrasCoisas(); //eu ainda serei o bloco executado.
  
}</code></pre><p><strong><strong>3</strong>) Laços for/while.</strong> Laços <em>while </em>continuam enquanto uma certa condição for verdadeira, executando o mesmo código repetidamente. Quando a condição não for verdadeira, o laço é interrompido.</p><pre><code class="language-cpp">while (someBool == true){ //condição

   fazerCoisas(); //seguirei fazendo coisas enquanto someBool não for false
   
}</code></pre><p>Pense: quanto tempo esse loop dura?</p><pre><code class="language-cpp">while (true){

  fazerCoisas();
  
}</code></pre><p>Laços <em>for</em> são basicamente laços <em>while</em> onde:</p><pre><code class="language-cpp">int i = 0;
while (i &lt; condicao){ 

    fazerCoisas();
    
    i++; //aumentar i após fazer coisas
}</code></pre><p>Equivale a:</p><pre><code class="language-cpp">for (int i = 0; i &lt; condicao; i++){

    fazerCoisas();
}</code></pre><p><strong><strong>4) </strong>Estruturas de dados básicas<strong>.</strong> </strong>Em seguida, temos os dados e formas de manipular esse dados. &nbsp;Podemos também armazenar esses dados em algumas estruturas - uma estrutura de dados. As estruturas de dados que você deveria conhecer são <a href="https://www.geeksforgeeks.org/introduction-to-arrays/" rel="noopener">arrays</a>, <a href="https://www.geeksforgeeks.org/linked-list-set-1-introduction/" rel="noopener">listas</a>, <a href="https://www.geeksforgeeks.org/queue-data-structure/" rel="noopener">filas</a>, <a href="https://www.geeksforgeeks.org/stack-data-structure/" rel="noopener">pilhas</a> e <a href="https://www.geeksforgeeks.org/hashing-set-1-introduction/" rel="noopener">sets</a> &nbsp;(textos em inglês).</p><p>Aqui temos um exemplo rápido de array:</p><pre><code class="language-cpp">/*
Suponha que você tenha os números de 0 a 9 e que deseja guardá-los em algum lugar. É possível armazená-los em um array!
*/
int[] arr = new int[10]; 
/*
Os colchetes [] declaram um array.Atribuímos um novo array a arr, de tamanho 10 - isso significa que ele pode receber 10 elementos. Arr agora tem essa aparência:

arr = [ 0 0 0 0 0 0 0 0 0 0 ]
*/
for (int i=0; i&lt;10; i++){

    arr[i]=i; //Atribuímos seja qual for o valor de i ao i-ésimo índice do arr.
    
//Você sabia que os índices das estruturas de dados começam em 0?
}

/*
Depois de executar o laço for, nossa estrutura de dados de array terá essa aparência!
arr = [ 0 1 2 3 4 5 6 7 8 9 ]
*/</code></pre><p>Para solidificar seus conhecimentos dos passos 2 ao 4, leia <a href="https://lifehacker.com/5742494/learn-to-code-part-iii-arrays-and-logic-statements">isto</a> (texto em inglês).</p><p><strong><strong>5) </strong>Funções e exceções. </strong>Funções são basicamente pequenas linhas de códigos que representam muito mais código. Por exemplo, se você chamar:</p><pre><code class="language-cpp">comerPao();</code></pre><p>E comerPao() tiver este conteúdo:</p><pre><code class="language-cpp">void comerPao(){ //&lt;---essa é uma função. 

   paoComido=true;
   
   printf("Já posso sentir os carboidratos aumentando");
   
}</code></pre><p>Ao chamar <code>comerPao()</code>, na verdade, estamos chamando as duas instruções dentro da função <code>comerPao()</code>.</p><p>Se você fizer algo de errado em seu código, uma exceção pode ser projetada. Eles são erros vermelhos e raivosos que estão lá para dizer: Ei, volte aqui! O que você fez ali em cima não funciona logicamente. Vá lá e revise.</p><p>Para aprender mais sobre funções, vá <a href="https://lifehacker.com/5742495/learn-to-code-part-iv-understanding-functions-and-making-a-guessing-game" rel="noopener">aqui</a>; para aprender sobre exceções, vá <a href="http://www.tutorialspoint.com/java/java_exceptions.htm" rel="noopener">aqui</a> (textos em inglês).</p><p>Há outras coisas que você precisa saber:</p><p><strong><strong>6)</strong> Linguagem<strong>.</strong></strong> Em qual linguagem você vai programar? C++? JavaScript? C#? Toda linguagem é escrita um pouco diferente e pode permitir que você faça coisas diferentes.</p><p><strong><strong>7) API (Application Programming Interface)</strong>. </strong>Depois de saber o básico, você terá que aprender sobre a API específica de seu mecanismo de jogos. As APIs são essencialmente uma coleção de objetos poderosos envolvidos em classes e funções &nbsp;simples que você pode chamar. As APIs tornam a vida mais fácil, muito mais fácil.</p><p>Por último:</p><p><strong>8) Veja um exemplo de projeto em seu mecanismo de jogo escolhido:</strong> <a href="https://docs.unrealengine.com/en-us/Resources">Unreal</a> e <a href="https://unity3d.com/learn/resources/downloads">Unity</a> têm milhares de exemplos de projetos gratuitos. Isso permite que você descubra como tudo é unificado. Além disso, você pode criar a ideia do seu jogo a partir do projeto (meu primeiro jogo foi criado a partir de <a href="http://corgi-engine.moremountains.com/">Corgi Engine</a>)</p><pre><code class="language-cpp">if (voce.chegouAteAqui()==true){
  muitoOrgulhosa=true;
  voce.conseguiu(); //HUMOR NO MOMENTO: MELHOR IMPOSSÍVEL⭐⭐
  
}</code></pre><p><strong>Para encorajar:</strong> Eu sei. Programar é assustador no início. Nada faz sentido, você está constantemente indo de encontro a obstáculos, e provavelmente quer desistir em função das falhas e exceções. Não significa que você é ruim em programação. Programação é um desafio. É compreensível se sentir incapaz no começo. </p><p>Isso, porém, leva tempo, como qualquer outra habilidade. Vai ficando fácil. Vai ficando divertido (ao menos, ficou para mim).</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/05/0_276fFujnYO2MY-5j.gif" class="kg-image" alt="0_276fFujnYO2MY-5j" width="79" height="20" loading="lazy"></figure><p><strong>Conceitos importantes sobre a programação de jogos (referências da seção em inglês):</strong></p><ul><li><em><a href="https://en.wikipedia.org/wiki/Object-oriented_programming">Orientação a objetos</a></em>. Faz a programação parecer mais natural.</li><li><a href="https://stackoverflow.com/questions/421965/anyone-else-find-naming-classes-and-methods-one-of-the-most-difficult-parts-in-p"><em>Convenções de nomeclatura</em></a>. Nomeie suas classes, métodos e variáveis como algo que obviamente transmite seu propósito. Por exemplo, uma função de ataque corpo a corpo (<em>melee</em>, em inglês) deve ser denominada meleeAttack(), não mA() ou protectbutalsoattack(). Você (e outros que lerem seu código) deverão saber o que está acontecendo.</li><li><a href="https://cs.stanford.edu/people/nick/compdocs/Decomposition_and_Style.pdf" rel="noopener"><em><em>Decomposi</em>çã<em>o</em></em></a><em>.</em> Coloque o código que se repete em uma função separada. Chame aquela função em vez de duplicar repetidamente aquele código.</li><li><em><a href="http://gameprogrammingpatterns.com/singleton.html">Padrão de projeto S<em>ingleton</em></a>.</em> Permite que dados de diversos sejam armazenados em um único lugar.</li><li><em>Prevenção de estática.</em> Além dos singletons, eu evitaria fazer variáveis estáticas - sua vida é a vida útil do jogo, <a href="https://jacksondunstan.com/articles/1713">elas são mais lentas</a> e podem ter comportamentos inesperados no editor.</li><li><em><a href="http://gameprogrammingpatterns.com/observer.html">Padrão de projeto Observer</a>. </em>Permite que os acontecimentos que dependem de outro não desperdicem o tempo do computador verificando esse último.</li></ul><p><strong>Questões importantes especificas do Unity (referências da seção em inglês):</strong></p><ul><li><em><a href="https://docs.unity3d.com/ScriptReference/MonoBehaviour.StartCoroutine.html">Co-rotinas</a>. </em>IEnumerators e Coroutines<em> </em>permitem que você comece a fazer coisas e continue fazendo-as por algum tempo e, então, pare. Eu os usava <em>o tempo todo:</em> para explosões de efeitos visuais; para o movimento de <em>interpolação linear</em>; para esperar que uma cena seja carregada antes de obter os objetos da cena, entre outros.</li><li><a href="https://unity3d.com/learn/tutorials/modules/beginner/live-training-archive/scriptable-objects" rel="noopener"><em><em>ScriptableObject.</em></em></a><em><em> </em></em>Contêm dados com menos sobrecarga do que os MonoBehaviors.</li></ul><h4 id="recursos-2"><strong>Recursos</strong></h4><p><strong>Mecanismos de jogos (referências da seção em inglês):</strong></p><ul><li>Faça seu próprio. <em>Requer <em>C/C++. </em>De baixo nível (realmente<em>, </em>baixo)<em>.</em></em></li><li><a href="https://t.umblr.com/redirect?z=http%3A%2F%2Funity.com&amp;t=YTA4MGJkNmI1N2Q5MTUxODI4ZWNkOGEwZGVhMjA3ZDNiZmQ1ODJlYyxxRDFMV0V3eA%3D%3D&amp;b=t%3AlfGQjHHkXZBrPEtOysXejA&amp;p=http%3A%2F%2Fzephyo.tumblr.com%2Fpost%2F166397059953%2Fhello-first-off-i-want-to-say-that-i-really-love&amp;m=1" rel="noopener">Unity</a> (*). 2<em><em>D/3D. Requ</em>e<em>r Javascript/C#. </em>Nível médio<em>. </em>Multiplataforma<em>.</em></em></li><li><a href="https://t.umblr.com/redirect?z=https%3A%2F%2Fwww.unrealengine.com&amp;t=NjMyOGZkMjcyNDA3ZmUwN2JhNGI4NzA1MTFlOTNkMWRiZWM4MTMxMSxxRDFMV0V3eA%3D%3D&amp;b=t%3AlfGQjHHkXZBrPEtOysXejA&amp;p=http%3A%2F%2Fzephyo.tumblr.com%2Fpost%2F166397059953%2Fhello-first-off-i-want-to-say-that-i-really-love&amp;m=1" rel="noopener">Unreal Engine</a>. <em><em>2D/3D. Requ</em>er<em> C++. </em>Nível médio.<em> </em>Multiplataforma.<em> </em>Observação<em>: </em></em>o suporte a 2D não é muito bom.</li><li><a href="http://www.pixijs.com/" rel="noopener">pixi.js</a> (*). <em><em>2D. Requ</em>er<em> Javascript. </em>Nível médio<em>. Web.</em></em></li><li><a href="https://t.umblr.com/redirect?z=https%3A%2F%2Fwww.yoyogames.com%2Fgamemaker&amp;t=ODE1NjZlZGViNGRlZjAyNjIwODhkNWNmYThmNmJhMDI2N2FlM2ZmYyxxRDFMV0V3eA%3D%3D&amp;b=t%3AlfGQjHHkXZBrPEtOysXejA&amp;p=http%3A%2F%2Fzephyo.tumblr.com%2Fpost%2F166397059953%2Fhello-first-off-i-want-to-say-that-i-really-love&amp;m=1" rel="noopener">GameMaker Studio</a>.<em><em> 2D/3D. Requ</em>er<em> </em>o <em>GML. </em>Nível iniciante<em>. </em>Multiplataforma<em>.</em></em></li><li><a href="https://coronalabs.com/" rel="noopener">Corona</a>.<em><em> 2D. Requ</em>er<em> Lua. </em>Nível iniciante<em>. </em>Multiplataforma<em>.</em></em></li></ul><p><strong><strong>IDEs:</strong></strong></p><ul><li>Visual Studio Code (*). <em>Para<em> </em>o <em>MacOS. </em>Não me dá nenhum atraso e tem características incríveis, exclusivas do VSCode (tais como informações de referências in-line e navegação rápida - com ⌘T).</em></li><li>Visual Studio (*). Para <em><em>Windows.</em></em></li><li>MonoDevelop. Vem com<em> <em>Unity. </em>Costuma ter lag<em>.</em></em></li></ul><p><strong>Recursos gratuitos do Unity (referências da seção em inglês):</strong></p><p>Para o Unity, existem muitos recursos livres na Unity Store, no GitHub, no Bitbucket e em outros sites. Eu costumo usar ao menos dois em cada projeto. Facilite sua vida com esses recursos, mas perceba que eles não são perfeitos. Se você detectar erros, não hesite em consertá-los e/ou sinalizar para os desenvolvedores.</p><ul><li><a href="https://www.assetstore.unity3d.com/en/?stay#!/content/84126" rel="noopener">TextMeshPro</a> (*).</li><li><a href="https://www.assetstore.unity3d.com/en/?stay#!/content/3595" rel="noopener">LeanTween</a> (*).</li><li><a href="https://assetstore.unity.com/packages/templates/systems/fungus-34184" rel="noopener">Fungus</a>.</li><li><a href="http://corgi-engine.moremountains.com/" rel="noopener">Corgi Engine.</a></li><li><a href="http://www.pixelcrushers.com/dialogue-system/" rel="noopener">Dialogue System</a>.</li><li><a href="https://assetstore.unity.com/packages/essentials/post-processing-stack-83912" rel="noopener">Post Processing Stack.</a></li><li><a href="https://github.com/keijiro" rel="noopener">Keijiro Takahashi.</a> <em>Funciona com o Unity<em>. </em></em>Tem projetos de efeitos visuais do Unity de código aberto incríveis!</li></ul><blockquote>Por último, mas não menos importante, minha solução nº 1 para problemas de programação: Google!</blockquote><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/05/0_NI1eGAQJ23f8EBOI.jpg" class="kg-image" alt="0_NI1eGAQJ23f8EBOI" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/05/0_NI1eGAQJ23f8EBOI.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/05/0_NI1eGAQJ23f8EBOI.jpg 800w" sizes="(min-width: 720px) 720px" width="800" height="450" loading="lazy"></figure><h3 id="4-udio"><strong><strong>4. </strong>Á<strong>u</strong>dio</strong></h3><h4 id="conselho-3"><strong>Conselho</strong></h4><p>Primeiro: <strong>Você quer áudio<strong>?</strong></strong></p><p>O áudio pode <a href="https://dl.acm.org/doi/10.5555/2146303.2146327">fazer milagres em termos de imersão e ambientação</a> (texto em inglês), mas o custo pode ser em termos da memória.</p><p>Se a resposta é sim, qual áudio?</p><p>Vai incluir <strong>música? Efeitos sonoros? &nbsp;Narração</strong> ou <strong>dubladores</strong>?</p><p>Para qualquer uma das alternativas acima, grave e faça a remixagem de modo que combine com a <strong>ambientação </strong>do seu jogo. Por exemplo, Bastion usa sons bucais orgânicos e instrumentais, combinando com o mundo do jogo. Crypt of the Necrodancer usa uma mistura de sons eletrônicos e chiptunes para combinar com o jogo colorido e rítmico.</p><blockquote>"A imersão é tudo!"<br><br><a href="http://twvideo01.ubm-us.net/o1/vault/gdc2012/slides/Audio%20Track/KORB_DARREN_BUILD%20THAT%20WALL.pdf" rel="noopener">-Darren Korb, Supergiant Games</a></blockquote><p>Se o seu áudio não combina com a <strong>ambientação </strong>do jogo, ele pode prejudicar a imersão. Como seu áudio vai combinar com o seu jogo?</p><h4 id="recursos-3"><strong>Recursos</strong></h4><p><strong>Ferramentas de á<strong>udio:</strong></strong></p><ul><li>Logic Pro. U<em><em>$</em> <em>200. </em>Somente para o <em>MacOS .</em></em></li><li>FL Studio (*). U$ <em><em>99</em> a <em>899. </em>Tem demonstração gratuita<em>.</em></em></li><li>Reaper. U<em><em>$60</em> a <em>225.</em></em></li><li>Audacity (*). Grátis <em><em>. </em>Capacidades limitadas. Útil para a limpeza de áudio.</em></li></ul><p><strong>Geradores de efeitos sonoros retrô (referências da seção em inglês):</strong></p><ul><li><a href="http://sfbgames.com/chiptone/" rel="noopener">Chiptone</a>.</li><li><a href="https://www.bfxr.net/" rel="noopener">Bfxr</a>.</li><li><a href="https://www.leshylabs.com/apps/sfMaker/" rel="noopener">Leshy SFMaker</a>.</li><li><a href="http://www.superflashbros.net/as3sfxr/" rel="noopener">as3sfxr</a>.</li></ul><p><strong>Sons gratuitos:</strong></p><ul><li><a href="http://soundcloud.com/" rel="noopener">Soundcloud</a> (*). A S<em><em>oundcloud </em>tem milhares</em> <em>de joias maravilhosas regidas pela<em> Creative Commons (CC). </em><a href="https://soundcloud.com/tilohensel/sets/creative-commons-music">Aqui você vê uma playlist para começar</a>. </em>Certifique-se de fornecer a atribuição se necessário.</li><li><a href="https://incompetech.com/music/" rel="noopener">Incompetech</a> (?). Música regida pela C<em><em>C. </em>É preciso atribuir<em>.</em></em></li><li><a href="https://www.bensound.com/royalty-free-music" rel="noopener">Bensound</a>. Música regida pela C<em><em>C. </em>É preciso atribuir<em>.</em></em></li></ul><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/05/1_JKnp8SVLbSaIyBtj8wyehw.gif" class="kg-image" alt="1_JKnp8SVLbSaIyBtj8wyehw" width="800" height="450" loading="lazy"></figure><h3 id="5-polimento"><strong><strong>5. </strong>Polimento</strong></h3><h4 id="conselho-4"><strong>Conselho</strong></h4><p>Nossa! Você chegou até aqui! <strong>Que incrível</strong> (é sério - se chegou tão longe, eu gostaria de saber sobre o seu game. Me mande mensagem, quando puder)!</p><p>Tudo concluído, certo?</p><p>Bem, tem uma probabilidade de 99,99999% de ter bugs.</p><p>Esse é momento para se fazer testes para ver se tem bugs.</p><h4 id="testando-para-ver-se-h-bugs-no-seu-jogo"><strong>Testando para ver se há bugs no seu jogo</strong></h4><ol><li><em>Consiga outras pessoas — você não vale — que joguem o seu jogo</em>. De preferência, na sua frente, porque se eles encontrarem algum bug, podem não perceber ou ter dificuldade de descrever.</li><li><em>Jogue-o em todas as plataformas de destino</em>. O jogo pode funcionar no editor, mas será que funciona onde é importante? Para o Linux e as diferentes versões do Android, especialmente, acho que as coisas ficam um pouco confusas.</li></ol><p>Certo. <strong>Você encontrou um bug. O que fazer agora?</strong></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/05/0_GFIXUr8X6BwoXdgb.jpg" class="kg-image" alt="0_GFIXUr8X6BwoXdgb" width="335" height="352" loading="lazy"></figure><ol><li><em>Verifique o console para ver se há exceções.</em> Encontrou alguma? Ótimo! Encontre o arquivo e o número da linha onde a exceção foi lançada. Se a exceção parecer algo muito maluco, procure-a no Google e aprenda sobre ela. Então, descubra por que esse número de linha está causando essa exceção.</li><li><em>Continua sem entender?</em> <em>Escreva para o console.</em> Comece a solicitar registros em log nos locais que você acha que podem estar causando o problema. Imprimir no console os valores de variáveis e veja se o que é impresso é o esperado. Caso contrário, conserte o problema.</li><li><em>Quando o pior acontece, verifique os logs</em>. Os logs do seu projeto vão dar mais informações do que o console. Leia as linhas finais onde a exceção ocorre. Pesquise tudo o que você não sabe no Google. Consegue resolver o problema agora?</li><li><em>Durma</em>. Isso vai ter se resolvido pela manhã. Afinal, é apenas um sonho ruim., certo?</li></ol><h4 id="erros-comuns-"><strong>Erros comuns:</strong></h4><ul><li><em><em>NullReferenceException.</em></em></li></ul><pre><code class="language-cpp">var.fazerCoisa(); //throws NullReferenceException: Object reference not set to an instance of an object</code></pre><p><em>Problema:</em> você esta fazendo algo com uma variável<strong> nula</strong> (inexistente). </p><p><em>Solução rápida</em>: verifique se a variável é nula antes de fazer isso.</p><pre><code class="language-cpp">if(var != null)
    {
        var.fazerCoisa(); // faça isso com segurança!
    }</code></pre><ul><li><em><em>SyntaxErrorException.</em></em></li></ul><p><em>Problema</em>: seu código tem uma sintaxe inválida.</p><p><em>Solução rápida:</em> Na mensagem de Exceção, deve estar o caractere que está causando o erro. Altere-o.</p><p><em>Observação: </em>se o caractere tem aspas duplas, certifique-se de usar as aspas retas no lugar das aspas curvas.</p><ul><li>Tela rosa ou preta.</li></ul><p><em>Problema possível:</em> Algum sombreamento não conseguiu renderizar.</p><p><em>Possíveis causas:</em> você está usando um shader 3D para um jogo 2D ou está usando algum recurso de shader sem suporte no sistema operacional de destino. Certifique-se de usar shaders de dispositivos móveis para jogos nesses dispositivos.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/05/0_YpNXKqqy_Nka3RYp.gif" class="kg-image" alt="0_YpNXKqqy_Nka3RYp" width="129" height="20" loading="lazy"></figure><p>Depois de terminar de eliminar os erros, <strong>faça os ajustes finais de seu jogo otimizando o uso de memória e o desempenho</strong>. Isto fará com que o download seja mais rápido e aquecerá menos os dispositivos de quem o jogar.</p><h4 id="dicas-gerais-de-otimiza-o-refer-ncias-da-se-o-em-ingl-s-">Dicas gerais de otimização<strong> (referências da seção em inglês)</strong></h4><ul><li><a href="http://resetoter.cn/UnityDoc/ScriptReference/Application-targetFrameRate.html"><em>Estabeleça a taxa de quadros de destino</em></a><em>.</em> A taxa de quadros pode ser de 20 para uma <em>visual novel</em> ou de 60 para um jogo de tiro em primeira pessoa. Uma taxa de quadros inferior ao padrão permite que o jogo gaste menos tempo renderizando quadros.</li><li>Animação /<a href="https://blogs.unity3d.com/2016/12/20/unitytips-particlesystem-performance-culling/"> partículas </a>/ <a href="https://docs.unity3d.com/Manual/OcclusionCulling.html">abate de oclusão</a>. O abate significa que as coisas que não estão visíveis na câmera não são renderizadas. Os personagens só serão animados, as partículas só serão atualizadas e os modelos 3D só serão renderizados quando estiverem à vista.</li></ul><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/05/0_--aqZp6ZFl7wMVWI.jpg" class="kg-image" alt="0_--aqZp6ZFl7wMVWI" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/05/0_--aqZp6ZFl7wMVWI.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/05/0_--aqZp6ZFl7wMVWI.jpg 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/05/0_sOU-nKokr1HlJP3a.jpg" class="kg-image" alt="0_sOU-nKokr1HlJP3a" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/05/0_sOU-nKokr1HlJP3a.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/05/0_sOU-nKokr1HlJP3a.jpg 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><ul><li><em>Comprimir texturas e áudio.</em> <a href="https://blogs.unity3d.com/2017/12/15/crunch-compression-of-etc-textures/">Comprima texturas irregulares</a>. <a href="https://medium.com/@hex3r_/making-your-unity-game-scream-and-shout-and-not-killing-it-in-the-process-673a7384693c">Faça o streaming da música e descomprima os efeitos sonoros ao carregar</a>. Diminuir a qualidade do áudio. Note que a compressão pode ou não diminuir a qualidade dos recursos de forma perceptível.</li><li><a href="https://unity3d.com/learn/tutorials/topics/scripting/object-pooling"><em>Pooling de objetos</em></a><em>.</em> Evite instanciar e destruir muitos objetos ao mesmo tempo para evitar enormes picos. Em vez disso, agrupe-os em uma lista, fila ou outra estrutura de dados. Coisas como balas devem ficar em grupos de objetos.</li><li><a href="https://create.unity3d.com/Unity-UI-optimization-tips"><em>Não deixe que os raycasts batam em coisas que não precisam de input</em></a>. Os raycasts são como pequenos raios que disparam de seus dedos ou do mouse toda vez que você toca a tela ou clica no mouse. Remova objetos que não reagem a essas entradas dos cálculos de raycast.</li></ul><h4 id="se-voc-quiser-um-desafio-refer-ncias-da-se-o-em-ingl-s-"><strong>Se você quiser um desafio (referências da seção em inglês):</strong></h4><ul><li><em>Otimização de shaders.</em> Dê a cada renderizador um material. Isto economizará recursos no início, já que o jogo não tem que criar novos materiais para tudo. O shader para o material inclui apenas o que é funcionalmente necessário (por exemplo, um botão que não precisa de mascaramento pode usar um shader de sprites em seu lugar).</li><li><em>No Unity,</em> <em><a href="https://blog.unity.com/technology/asset-bundles-vs-resources-a-memory-showdown">use AssetBundles em vez de Resources</a></em>. O AssetBundles economizará a memória buscando no armazenamento on-line (por exemplo, no DropBox) ou local (por exemplo, no disco rígido). No entanto, eu não tentei muito essas questões devido à documentação ruim.</li></ul><h4 id="recursos-refer-ncias-da-se-o-em-ingl-s-"><strong>Recursos (referências da seção em inglês)</strong></h4><p>Todos eles são do Unity, mas podem ser aplicáveis a outros mecanismos (todos em inglês).</p><p><strong><strong>Scripts:</strong></strong></p><ul><li><a href="https://unity3d.com/learn/tutorials/topics/performance-optimization/optimizing-scripts-unity-games" rel="noopener">Optimização de scripts em jogos do Unity</a> (*)</li></ul><p><strong><strong>Art</strong>e<strong>:</strong></strong></p><ul><li><a href="https://unity3d.com/learn/tutorials/topics/best-practices/guide-optimizing-unity-ui" rel="noopener">Um guia para otimizar a Unity UI</a> (*)</li><li><a href="https://docs.unity3d.com/Manual/HOWTO-ArtAssetBestPracticeGuide.html" rel="noopener">Guia prático de melhores Recursos de Arte</a> (*)</li></ul><p><strong><strong>Mem</strong>ó<strong>r</strong>ia<strong>:</strong></strong></p><ul><li><a href="https://docs.unity3d.com/Manual/ReducingFilesize.html" rel="noopener">Reduzir o tamanho de arquivo da sua build</a> (*)</li><li><a href="https://docs.unity3d.com/Manual/BestPracticeUnderstandingPerformanceInUnity2.html" rel="noopener">Memória</a></li></ul><p><strong>E<strong>spec</strong>íficos das plataformas<strong>:</strong></strong></p><ul><li><a href="https://docs.unity3d.com/Manual/MobileOptimizationPracticalGuide.html" rel="noopener">Guia prático de otimização para dispositivos móveis</a> (*)</li><li><a href="https://docs.unity3d.com/Manual/webgl-performance.html" rel="noopener">Considerações de desempenho do WebGL</a> (*)</li><li><a href="https://docs.unity3d.com/Manual/webgl-memory.html" rel="noopener">Considerações de memórias ao focar o WebGL</a> (*)</li><li><a href="https://unity3d.com/how-to/optimize-mobile-VR-games" rel="noopener">Os sete estágios de otimização da Olly's para VR de dispositivos móveis</a> </li></ul><h3 id="6-marketing"><strong><strong>6. Market</strong>ing</strong></h3><h4 id="conselho-5"><strong>Conselho</strong></h4><p><strong>Parabéns! </strong>Você fez um jogo. É o momento de mostrar para o mundo o que você fez.</p><p>Pessoalmente, o marketing é o meu maior indutor de ansiedade. Se você, também, tem muitas dúvidas, a <strong>comunidade de desenvolvedores de jogos</strong> é superútil. Você não está só nisso. E chegou tão longe - pode muito bem chegar até o fim, certo?</p><blockquote>Você nunca saberá se será um sucesso, a menos que tente.</blockquote><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/05/0_qFXvryTQVsP8UCcn.gif" class="kg-image" alt="0_qFXvryTQVsP8UCcn" width="600" height="400" loading="lazy"></figure><ol><li><strong>Esboço</strong>. Crie esboços da pagina do seu jogo em todas as suas plataformas de destino de distribuição do jogo. Encontre uma lista de plataformas na parte de <strong>Recursos</strong> abaixo. </li><li><strong>Faça o networking</strong>. Se você for até o fim no networking, vai querer enviar um e-mail para a<strong> imprensa especializada</strong>, <strong>exibir o jogo</strong> em <strong>festivais</strong> e participar de <strong>conferências</strong>.</li></ol><p><strong>Para a imprensa especializada</strong>, envie por e-mail a página não listada do seu jogo uma semana antes do lançamento. Dê às pessoas algum tempo para escrever sobre ele. É provável que elas não escrevam sobre ele de forma alguma. Descobri que a imprensa adora uma história atraente de desenvolvedores, um conceito único/controverso e, o mais importante, um <a href="http://dopresskit.com/">presskit</a>.</p><p><strong>Como você encontra os e-mails?</strong> Você pode...</p><ol><li>Encontrar escritores que você gosta e buscar pelo nome deles. O e-mail deles com certeza aparecerá em algum lugar: no Twitter, no LinkedIn etc. Ou...</li><li>Encontre o e-mail geral da revista/empresa de notícias na página <em>Sobre </em>do site deles. Normalmente, está no formato <strong>dicas@empresa.com.</strong> </li></ol><p><strong>Não envie</strong> um e-mail para a imprensa sobre seu jogo se eles não cobrirem explicitamente seu gênero/plataforma direcionada.</p><p><em>Festivais </em>podem dar prêmios/ou reconhecimento profissional por outros desenvolvedores e pela impressa especializada.</p><p>As <em>conferências </em>são o que você faz delas: elas podem ter a ver apenas com networking com outros desenvolvedores, empresas e imprensa (vá e ofereça seus cartões de visita); elas podem ser para atualizar seu conhecimento em desenvolvimento de jogos com o que há de mais recente; para jogar os jogos dos outros; ou para encontrar-se com os amigos da Internet.</p><p>Os ingressos para as conferências de jogos são <em>caros</em>. Se você é um estudante, pense em solicitar bolsas de estudo para eles. O <a href="http://scholars.igdafoundation.org/">programa IGDA Scholars</a> dá a você algumas oportunidades especialmente incríveis de networking e de presença em eventos.</p><p>3. <strong><strong>Youtubers/Streamers.</strong></strong> Você pode obter cobertura em vídeo de seu jogo por:</p><ol><li><em>Classificação alta</em> em plataformas de distribuição de jogos.</li><li><em>Envio de e-mails. </em>Se você enviar um e-mail, não fale de si mesmo; fale sobre o jogo. Mantenha a mensagem gentil, breve e convincente. Use fotos e gifs que chamem a atenção.</li></ol><p><strong>Como você encontra os e-mails?</strong> Veja a página <em>Sobre</em> dos sites das pessoas e empresas. Se você não conseguir encontrá-los por lá, procure-os no Google e veja se suas outras mídias sociais o têm.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/05/1_8Y35x-rZIuBapR5WFNpFqQ.png" class="kg-image" alt="1_8Y35x-rZIuBapR5WFNpFqQ" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/05/1_8Y35x-rZIuBapR5WFNpFqQ.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/05/1_8Y35x-rZIuBapR5WFNpFqQ.png 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"><figcaption>Aqui vemos um e-mail.</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/05/1_ISj787elwqyMUQOHo3o40g.png" class="kg-image" alt="1_ISj787elwqyMUQOHo3o40g" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/05/1_ISj787elwqyMUQOHo3o40g.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/05/1_ISj787elwqyMUQOHo3o40g.png 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"><figcaption><em>estão em todo lugar</em></figcaption></figure><p>4. <strong>Redes sociais.</strong></p><p>As redes sociais são uma ferramenta de marketing <em>incrível</em>. <a href="https://www.rockpapershotgun.com/2018/02/22/the-rise-and-rise-of-io-games/">Agar.io começou a sua ascensão no 4chan</a>, <a href="https://twitter.com/brii_u/status/909114732287627264?lang=en">Butterfly Soup recebeu um impulso fenomenal no Twitter</a> (textos em inglês) e algumas formas de redes sociais acabam sempre no meu top 4 de referências:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/05/1_9zJi8w4bKAqD4FlAmlc6DA.png" class="kg-image" alt="1_9zJi8w4bKAqD4FlAmlc6DA" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/05/1_9zJi8w4bKAqD4FlAmlc6DA.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/05/1_9zJi8w4bKAqD4FlAmlc6DA.png 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"><figcaption>Live Portrait Maker</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/05/1_XXB_AREPwK0K0ozaTaBKNg.png" class="kg-image" alt="1_XXB_AREPwK0K0ozaTaBKNg" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/05/1_XXB_AREPwK0K0ozaTaBKNg.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/05/1_XXB_AREPwK0K0ozaTaBKNg.png 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"><figcaption>YOU LEFT ME</figcaption></figure><p>Minhas redes sociais favoritas para marketing estão listadas abaixo, em <strong>Recursos</strong>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/05/0_Z0LdyJ-sK4zD3-iZ.gif" class="kg-image" alt="0_Z0LdyJ-sK4zD3-iZ" width="600" height="400" loading="lazy"></figure><p><strong>Uma última observação — editora ou publicação própria? </strong>Fazer marketing dos jogos é pesado demais. Você quer que uma editora se encarregue de tudo isso? Quer ir pela rota de Hotline Miami da Devolver Digital, ou contar com o boca a boca de Farmville e de Doki Doki Doki Literature Club?</p><p>Com uma editora, você terá que fazer sua pesquisa para encontrar uma boa. Em seguida, você assinará a papelada e passará por várias questões legais. Além disso, é um enorme investimento financeiro.</p><p>Sozinho, você terá que dedicar muito tempo e esforço para aprender marketing. Você pode adorar. Você pode odiar. E você também pode não fazer um bom trabalho. No entanto, é grátis e você aprende habilidades valiosas.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/05/1_abfGrvwSMrEaha8ViVHzww.png" class="kg-image" alt="1_abfGrvwSMrEaha8ViVHzww" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/05/1_abfGrvwSMrEaha8ViVHzww.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/05/1_abfGrvwSMrEaha8ViVHzww.png 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"><figcaption><em>Viva! Crescimento <em>org</em>ânico e de publicação própria<em> (</em>mas não é geneticamente modificado, é?<em>)</em></em></figcaption></figure><p>No meu caso, eu sempre publiquei por conta própria. <em>Eu adoro aprender coisas novas. Além disso, acredito firmemente que um jogo realmente grande será bem-sucedido, não importa o que aconteça, desde que algum esforço de marketing tenha sido feito.</em></p><p>6. Hora de apertar o botão de<strong> Publicar</strong>!</p><p>Quê? Você<strong> </strong>chegou ao final, mesmo? Viva! Agora, relaxe, sente-se, pegue uma bebida deliciosa e reserve um tempo para si mesmo! Você trabalhou muito e merece um descanso!</p><p>E lembre-se de que, mesmo que seu jogo não tenha a recepção que você esperava, tudo bem. Não vai ser perfeito na primeira vez. Meu primeiro jogo na Steam tem apenas 255 downloads.</p><p>O importante é que você fez um jogo. Você aprendeu muito e isso já é o suficiente.</p><p>E há sempre uma próxima vez!</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/05/0_oSrrX_kk-L4Lwion.gif" class="kg-image" alt="0_oSrrX_kk-L4Lwion" width="600" height="400" loading="lazy"></figure><h4 id="recursos-refer-ncias-da-se-o-em-ingl-s--1"><strong><strong>Re</strong>cursos (referências da seção em inglês)</strong></h4><p><strong>Plataformas de distribuição de jogos<strong>:</strong></strong></p><ul><li><a href="https://store.steampowered.com/" rel="noopener">Steam</a> (?). P<em><em>C. Req</em>uer<em> </em>U<em>$</em> <em>100 </em>de taxa por jogo<em>.</em></em></li><li><a href="https://www.origin.com/" rel="noopener">Origin</a>. <em><em>PC.</em></em></li><li><a href="https://www.gog.com/" rel="noopener">GOG</a>. <em><em>PC. </em>Publicação grátis<em>. </em>O jogo deve ser aceito<em>.</em></em></li><li><a href="https://developer.apple.com/macos/distribution/" rel="noopener">Mac App Store</a>. <em><em>MacOS. </em>Exige conta<em> Apple </em>Developer.</em></li><li><a href="http://itch.io/" rel="noopener">itch.io</a> (*). P<em><em>C/Web. </em>Publicação grátis<em>.</em></em></li><li><a href="http://gamejolt.com/" rel="noopener">Game Jolt</a> (*). P<em><em>C/Web. </em>Publicação grátis<em>.</em></em></li><li><a href="http://developers.armorgames.com/" rel="noopener">Armor Games</a> (*). <em>Publicação grátis<em>.</em> É preciso se candidatar como desenvolvedor.</em></li><li><a href="http://www.kongregate.com/" rel="noopener">Kongregate</a> (*). W<em><em>eb. </em>Publicação grátis<em>.</em></em></li><li><a href="http://www.newgrounds.com/" rel="noopener">Newgrounds</a> (*). W<em><em>eb. </em>Publicação grátis<em>.</em></em></li><li><a href="https://github.com/" rel="noopener">GitHub</a> (*). W<em><em>eb. </em>Publicação grátis em seu próprio site com nome de domínio formatado como<em> </em>"<em>_<strong><strong>__.github.io</strong></strong></em><strong>"</strong><em>.</em></em></li><li><a href="https://developer.amazon.com/app-submission" rel="noopener">Amazon.</a> <em><em>Web/Mobile. </em>Publicação grátis<em>.</em></em></li><li><a href="https://play.google.com/store" rel="noopener">Google Play</a> (*). <em>Dispositivos móveis<em>. </em>Exige uma taxa única de<em> </em>U<em>$</em> <em>25.</em></em></li><li><a href="https://itunes.apple.com/us/genre/ios" rel="noopener">iOS App Store</a> (*). <em>Dispositivos móveis<em>. </em>Exige uma conta de Apple Developer.</em></li></ul><p><strong>Imprensa de jogos<strong>:</strong></strong></p><ul><li><a href="http://indiegames.com/" rel="noopener">IndieGames.</a></li><li><a href="http://www.siliconera.com/" rel="noopener">Siliconera.</a></li><li><a href="https://www.freegameplanet.com/live-portrait-maker-browser-game/" rel="noopener">FreeGamesPlanet</a>. <em>Ótima administração<em>.</em></em></li><li><a href="https://www.pcgamer.com/" rel="noopener">PCGamer.</a></li><li><a href="https://kotaku.com/" rel="noopener">Kotaku.</a></li><li><a href="https://www.rockpapershotgun.com/" rel="noopener">Rock Paper Shotgun.</a></li><li><a href="https://www.polygon.com/gaming/2012/9/17/3348450/zynga-a-bit-lucky-acquisition-zynga-san-francisco-john-tobias" rel="noopener">Polygon.</a></li><li><a href="https://www.giantbomb.com/florence/3030-66441/similar-games/" rel="noopener">Giant Bomb.</a></li><li><a href="https://www.eurogamer.net/" rel="noopener">EuroGamer.</a></li></ul><p><strong>Festivais de jogos<strong>:</strong></strong></p><ul><li><a href="http://www.igf.com/" rel="noopener">Independent Games Festival (IGF)</a>. <em>Data limite por volta de outubro.</em></li><li><a href="https://www.indiecade.com/" rel="noopener">Indiecade.</a> <em>Data limite por volta de maio/junho.</em></li><li><a href="https://www.gameawards.se/" rel="noopener">Swedish Game Awards</a>. <em>Data limite por volta de julho.</em></li><li><a href="https://gaming.sxsw.com/awards/" rel="noopener">South by Southwest Festival (SXSW)</a>. <em>Data limite por volta de dezembro.</em></li><li><a href="http://thegameawards.com/" rel="noopener">The Game Awards</a>. <em>Data limite por volta de novembro.</em></li></ul><p><strong>Conferências de jogos<strong>:</strong></strong></p><ul><li>Game Developer’s Conference (GDC). <em><em>San Francisco.</em></em></li><li>Penny Arcade Expo (PAX). <em><em>Seattle/Boston/Philadelphia/Melbourne.</em></em></li><li>Electronic Entertainment Expo (E3). <em><em>Los Angeles.</em></em></li><li>Tokyo Game Show. <em><em>Jap</em>ão<em>.</em></em></li><li>Steam Dev Days. <em><em>Seattle. </em>Somente para desenvolvedores da <em>Steam.</em></em></li></ul><p><strong>Envio de e-mails<strong>:</strong></strong></p><ul><li><a href="http://dopresskit.com/" rel="noopener">presskit()</a></li></ul><p><strong>Redes sociais<strong>:</strong></strong></p><ul><li>Reddit (*)<em>. Escolha um subreddit apropriado. Alguns dos meus favoritos são <em> /r/WebGames,</em></em> <em><em>/r/IndieGaming/</em> e <em>/r/visualnovels.</em></em></li></ul><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/05/1_uXjTNgJQLRD6GxREPjLWZg.png" class="kg-image" alt="1_uXjTNgJQLRD6GxREPjLWZg" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/05/1_uXjTNgJQLRD6GxREPjLWZg.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/05/1_uXjTNgJQLRD6GxREPjLWZg.png 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"><figcaption>/r/WebGames</figcaption></figure><ul><li>Facebook (*).<em> Publique em sua página do Facebook (se você tiver uma) e em seu Facebook pessoal (se você se sentir confortável com isso). Há também vários grupos do Facebook onde você pode exibir seu jogo! Aqui estão alguns:</em></li></ul><p><strong><a href="https://www.facebook.com/groups/GameDevShowAndTest"><strong>GameDev Show</strong> and Test</a></strong><br><a href="https://www.facebook.com/groups/IndieGameDevs/" rel="noopener"><strong><strong>Indie Game Developers</strong></strong></a><br><a href="https://www.facebook.com/groups/IndieGamePromo/1066211690197686/" rel="noopener"><strong><strong>Indie Game Promo</strong></strong></a><br></p><ul><li>Tumblr (*).</li><li>Twitter (*). <em>Tente usar tags como<em> #gamedev, #indiedev </em>e<em> #screenshotsaturday </em>para ser descoberto<em>.</em></em></li></ul><p><strong><strong>Com</strong>unidade<strong>:</strong></strong></p><ul><li><a href="https://www.reddit.com/r/gamedev" rel="noopener">/r/gamedev</a> (*).</li><li><a href="https://ldjam.com/" rel="noopener">Ludum Dare</a> (*).</li><li><a href="https://www.facebook.com/groups/IndieGameDevs/" rel="noopener">Indie Game Devs</a> (*).</li></ul><h3 id="conclus-o"><strong><strong><strong><strong>Conclus</strong></strong></strong>ão</strong></h3><p>Não há cheat code que facilite criar um jogo. É apenas muita determinação e esforço.</p><blockquote>"Atrás de cada Half Life, Minecraft e Uncharted, há OCEANOS de sangue, suor e lágrimas."<br><br><a href="https://medium.com/@IGLevine/so-lots-of-people-have-responded-to-my-encouragement-to-get-into-the-industry-asking-how-do-i-get-e2d0cd738733" rel="noopener">— Ken Levine</a></blockquote><p>Você vai ficar confuso. Vai cometer erros. Você pode até chorar (eu chorei - e ainda choro).</p><p>Mas está tudo bem. Significa que você está evoluindo. Se você está se esforçando para fazer dar certo, eu acredito em você e no seu jogo: Você pode fazer acontecer.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/05/0_IH1bpE4Hf0crXYVd_.jpg" class="kg-image" alt="0_IH1bpE4Hf0crXYVd_" width="600" height="400" loading="lazy"><figcaption>foxtato de apoio de Emily’s Diary</figcaption></figure><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/05/0_cc_Fm6yLJIZaCGRB.gif" class="kg-image" alt="0_cc_Fm6yLJIZaCGRB" width="600" height="400" loading="lazy"></figure><p>Se você gostou de ler meu primeiro artigo, não se esqueça de recomendá-lo para todos que puder. Seria muito legal!</p><p>Você também pode me seguir/me enviar mensagens no <a href="https://twitter.com/zephybite" rel="noopener">Twitter</a>, no <a href="http://zephyo.tumblr.com/" rel="noopener">Tumblr</a> e no <a href="https://github.com/zephyo" rel="noopener">GitHub</a>. Também pode <a href="https://ko-fi.com/zephyo">me pagar um café</a>, se preferir.</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
