{"id":29846,"date":"2019-10-31T21:32:19","date_gmt":"2019-10-31T18:32:19","guid":{"rendered":"https:\/\/prohoster.info\/blog\/igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki\/"},"modified":"2019-10-31T21:32:19","modified_gmt":"2019-10-31T18:32:19","slug":"igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pt\/blog\/igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki","title":{"rendered":"Jogando Rust em 24 horas: experi\u00eancia pessoal de desenvolvimento","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Jogando Rust em 24 horas: experi\u00eancia pessoal de desenvolvimento\" src=\"\/wp-content\/uploads\/2019\/03\/ea25406c43ac90ce2e33e290168d1083.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNeste artigo, compartilharei minha experi\u00eancia no desenvolvimento de um pequeno jogo em Rust. A cria\u00e7\u00e3o da vers\u00e3o funcional levou cerca de 24 horas (principalmente trabalhei \u00e0 noite ou nos finais de semana). O jogo ainda est\u00e1 longe de ser conclu\u00eddo, mas acredito que a experi\u00eancia ser\u00e1 \u00fatil. Vou contar o que aprendi e algumas observa\u00e7\u00f5es feitas ao construir o jogo do zero.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<blockquote><p><b>A Skillbox recomenda:<\/b> Curso Pr\u00e1tico de Dois Anos <noindex><a rel=\"nofollow\" href=\"https:\/\/iamwebdev.skillbox.ru\/?utm_source=skillbox.media&amp;utm_medium=habr.com&amp;utm_campaign=WEBDEVPRO&amp;utm_content=articles&amp;utm_term=rust24\">\u00abSou um desenvolvedor web PRO\u00bb<\/a><\/noindex>.<\/p>\n<p><b>Lembramos:<\/b> <i>para todos os leitores do \u00abHabr\u00bb \u2014 desconto de 10.000 rublos na inscri\u00e7\u00e3o em qualquer curso Skillbox com o c\u00f3digo promocional \u00abHabr\u00bb.<\/i><\/p><\/blockquote>\n<p><\/p>\n<h3>Por que Rust?<\/h3>\n<p>\nEscolhi esta linguagem porque ouvi muitas coisas boas sobre ela e vejo que est\u00e1 se tornando cada vez mais popular na \u00e1rea de desenvolvimento de jogos. Antes de escrever o jogo, tive uma experi\u00eancia leve no desenvolvimento de aplicativos simples em Rust. Isso foi suficiente para sentir uma certa liberdade ao escrever o jogo.<\/p>\n<h3>Por que um jogo e que tipo de jogo?<\/h3>\n<p>\nCriar jogos \u00e9 divertido! Eu gostaria que houvesse mais motivos, mas para projetos 'caseiros' eu escolho temas que n\u00e3o est\u00e3o muito intimamente relacionados ao meu trabalho habitual. Que tipo de jogo? Queria fazer algo como um simulador de t\u00eanis, onde se combinam Cities Skylines, Zoo Tycoon, Prison Architect e, naturalmente, t\u00eanis. Em suma, o resultado foi um jogo sobre uma academia de t\u00eanis, onde as pessoas v\u00eam para jogar.<\/p>\n<h3>Prepara\u00e7\u00e3o t\u00e9cnica<\/h3>\n<p>\nEu queria usar Rust, mas n\u00e3o sabia exatamente qu\u00e3o 'do zero' precisaria come\u00e7ar a trabalhar. N\u00e3o queria escrever shaders pixelados e usar drag-n-drop, ent\u00e3o procurei as solu\u00e7\u00f5es mais flex\u00edveis.<\/p>\n<p>Encontrei recursos \u00fateis, que compartilho com voc\u00eas:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/arewegameyet.com\/\">Are we game yet<\/a><\/noindex> \u2014 uma lista dos elementos necess\u00e1rios para o desenvolvimento de jogos em Rust;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.reddit.com\/r\/rust_gamedev\">subreddits de desenvolvimento de jogos em Rust;<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/kenney.nl\">Arte pixel gratuita.<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nEstudei v\u00e1rios motores de jogo em Rust, e no final escolhi o Piston e o ggez. J\u00e1 tinha encontrado esses durante um projeto anterior. Acabei escolhendo o ggez, pois pareceu mais adequado para a realiza\u00e7\u00e3o de um pequeno jogo 2D. A estrutura modular do Piston \u00e9 excessivamente complexa para um desenvolvedor iniciante (ou para algu\u00e9m que est\u00e1 trabalhando com Rust pela primeira vez).<\/p>\n<h3>Estrutura do jogo<\/h3>\n<p>\nGastei um tempo pensando sobre a arquitetura do projeto. O primeiro passo \u00e9 criar a 'terra', as pessoas e as quadras de t\u00eanis. As pessoas devem se mover pelas quadras e esperar. Os jogadores devem ter habilidades que melhoram com o tempo. Al\u00e9m disso, deve haver um editor que permita adicionar novas pessoas e quadras, mas isso j\u00e1 n\u00e3o \u00e9 gratuito.<\/p>\n<p>Ap\u00f3s pensar em tudo, comecei a trabalhar. <\/p>\n<h3>Cria\u00e7\u00e3o de jogos<\/h3>\n<p>\n<b>In\u00edcio: c\u00edrculos e abstra\u00e7\u00f5es<\/b><\/p>\n<p>Eu peguei um exemplo do ggez e consegui um c\u00edrculo na tela. Impressionante! Agora, vamos falar sobre algumas abstra\u00e7\u00f5es. Achei interessante abstrair da ideia de um objeto de jogo. Cada objeto deve ser renderizado e atualizado, como indicado aqui:<\/p>\n<pre><code class=\"rust\">\/\/ the game object trait\ntrait GameObject {\n    fn update(&amp;mut self, _ctx: &amp;mut Context) -&gt; GameResult&lt;()&gt;;\n    fn draw(&amp;mut self, ctx: &amp;mut Context) -&gt; GameResult&lt;()&gt;;\n}\n \n\/\/ a specific game object - Circle\nstruct Circle {\n    position: Point2,\n}\n \n impl Circle {\n    fn new(position: Point2) -&gt; Circle {\n        Circle { position }\n    }\n}\nimpl GameObject for Circle {\n    fn update(&amp;mut self, _ctx: &amp;mut Context) -&gt; GameResult&lt;()&gt; {\n        Ok(())\n    }\n    fn draw(&amp;mut self, ctx: &amp;mut Context) -&gt; GameResult&lt;()&gt; {\n        let circle =\n            graphics::Mesh::new_circle(ctx, graphics::DrawMode::Fill, self.position, 100.0, 2.0)?;\n \n         graphics::draw(ctx, &amp;circle, na::Point2::new(0.0, 0.0), 0.0)?;\n        Ok(())\n    }\n}<\/code><\/pre>\n<p>\nEsse trecho de c\u00f3digo me permitiu obter uma \u00f3tima lista de objetos que posso atualizar e renderizar em um ciclo igualmente \u00f3timo.<\/p>\n<pre><code class=\"rust\">mpl event::EventHandler para MainState {\n    fn update(&amp;mut self, context: &amp;mut Context) -&gt; GameResult {\n        \/\/ Atualizar todos os objetos\n        for object in self.objects.iter_mut() {\n            object.update(context)?;\n        }\n \n        Ok(())\n    }\n \n    fn draw(&amp;mut self, context: &amp;mut Context) -&gt; GameResult {\n        graphics::clear(context);\n \n        \/\/ Desenhar todos os objetos\n        for object in self.objects.iter_mut() {\n            object.draw(context)?;\n        }\n \n        graphics::present(context);\n \n        Ok(())\n    }\n}<\/code><\/pre>\n<p>\nmain.rs \u00e9 necess\u00e1rio porque cont\u00e9m todas as linhas de c\u00f3digo. Eu passei um tempo separando os arquivos e otimizando a estrutura de diret\u00f3rios. Aqui est\u00e1 como tudo ficou depois disso:<br \/>\n<i>resources -&gt; \u00e9 aqui que est\u00e3o todos os ativos (imagens)<br \/>\nsrc<br \/>\n \u2014 entidades<br \/>\n \u2014 game_object.rs<br \/>\n \u2014 circle.rs<br \/>\n \u2014 main.rs -&gt; loop principal<\/i><\/p>\n<p><b>Pessoas, quadras e imagens<\/b><\/p>\n<p>A pr\u00f3xima etapa \u00e9 criar o objeto de jogo Person e carregar as imagens. Tudo deve ser constru\u00eddo com base em blocos de 32x32.<\/p>\n<p><img decoding=\"async\" alt=\"Jogando Rust em 24 horas: experi\u00eancia pessoal de desenvolvimento\" src=\"\/wp-content\/uploads\/2019\/03\/265ed79e6784ef0180cfdc5aa8d96a4c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>Quadras de t\u00eanis<\/b><\/p>\n<p>Depois de estudar como s\u00e3o as quadras de t\u00eanis, decidi fazer as quadras usando blocos de 4x2. Inicialmente, poderia criar uma imagem desse tamanho ou juntar 8 blocos individuais. Mas depois percebi que s\u00f3 eram necess\u00e1rias duas pe\u00e7as \u00fanicas, e aqui est\u00e1 o porqu\u00ea.<\/p>\n<p>No total, temos duas dessas pe\u00e7as: 1 e 2.<\/p>\n<p>Cada se\u00e7\u00e3o da quadra \u00e9 composta pela pe\u00e7a 1 ou pela pe\u00e7a 2. Elas podem estar dispostas normalmente ou invertidas em 180 graus.<\/p>\n<p><img decoding=\"async\" alt=\"Jogando Rust em 24 horas: experi\u00eancia pessoal de desenvolvimento\" src=\"\/wp-content\/uploads\/2019\/03\/90d07caea0dee8673ada5d44963ab347.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>Modo principal de constru\u00e7\u00e3o (montagem)<\/b><\/p>\n<p>Depois de conseguir renderizar as quadras, as pessoas e os mapas, percebi que tamb\u00e9m precisava de um modo b\u00e1sico de montagem. Isso foi implementado da seguinte forma: quando o bot\u00e3o \u00e9 pressionado \u2014 o objeto \u00e9 selecionado, e o clique o coloca no lugar desejado. Assim, o bot\u00e3o 1 permite selecionar a quadra, e o bot\u00e3o 2 permite selecionar o jogador.<\/p>\n<p>Mas \u00e9 necess\u00e1rio lembrar o que 1 e 2 significam, ent\u00e3o eu adicionei um wireframe para que fique claro qual objeto foi selecionado. Aqui est\u00e1 como isso aparece.<\/p>\n<p><img decoding=\"async\" alt=\"Jogando Rust em 24 horas: experi\u00eancia pessoal de desenvolvimento\" src=\"\/wp-content\/uploads\/2019\/03\/09b92828fb9b8d4bfa5d5178ca99613c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>Quest\u00f5es sobre arquitetura e refatora\u00e7\u00e3o<\/b><\/p>\n<p>Agora eu tenho v\u00e1rios objetos de jogo: pessoas, quadras e andares. Mas para que os wireframes funcionem, \u00e9 necess\u00e1rio informar cada entidade do objeto se os pr\u00f3prios objetos est\u00e3o no modo de demonstra\u00e7\u00e3o ou se apenas um contorno est\u00e1 desenhado. Isso n\u00e3o \u00e9 muito pr\u00e1tico.<\/p>\n<p>Eu percebi que era necess\u00e1rio repensar a arquitetura para que algumas limita\u00e7\u00f5es surgissem:<\/p>\n<ul>\n<li>a presen\u00e7a de uma entidade que se representa e se atualiza sozinha \u00e9 um problema, pois essa entidade n\u00e3o poder\u00e1 'saber' o que deve renderizar - a imagem e o wireframe;<\/li>\n<li>a falta de uma ferramenta para compartilhar propriedades e comportamentos entre entidades espec\u00edficas (por exemplo, a propriedade is_build_mode ou o desenho de comportamentos). Poder\u00edamos usar heran\u00e7a, embora em Rust n\u00e3o exista uma maneira adequada de implement\u00e1-la. O que eu realmente precisava era da composi\u00e7\u00e3o;<\/li>\n<li>uma ferramenta para interagir entre as entidades era necess\u00e1ria para designar pessoas nas quadras;<\/li>\n<li>as pr\u00f3prias entidades eram uma mistura de dados e l\u00f3gica, que rapidamente sa\u00eda de controle.<\/li>\n<\/ul>\n<p><\/p>\n<blockquote><p><i>Eu fiz um estudo adicional e descobri a arquitetura <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Entity_component_system\">ECS \u2014 Entity Component System<\/a><\/noindex>, que \u00e9 comumente utilizada em jogos. Aqui est\u00e3o as vantagens do ECS:<\/p>\n<ul>\n<li>os dados s\u00e3o separados da l\u00f3gica;<\/li>\n<li>composi\u00e7\u00e3o em vez de heran\u00e7a;<\/li>\n<li>uma arquitetura orientada a dados.<\/li>\n<\/ul>\n<p><\/i><\/p><\/blockquote>\n<p>\nO ECS \u00e9 caracterizado por tr\u00eas conceitos b\u00e1sicos:<\/p>\n<ul>\n<li>entidades \u2014 um tipo de objeto que \u00e9 referenciado por um identificador (isso pode ser um jogador, uma bola ou algo assim);<\/li>\n<li>componentes \u2014 com os quais as entidades s\u00e3o compostas. Um exemplo \u00e9 um componente de renderiza\u00e7\u00e3o, posi\u00e7\u00e3o e outros. Esses s\u00e3o armazenamentos de dados;<\/li>\n<li>sistemas \u2014 eles usam tanto objetos quanto componentes, al\u00e9m de conter comportamentos e l\u00f3gica que se baseiam nesses dados. Um exemplo \u00e9 um sistema de renderiza\u00e7\u00e3o que percorre todas as entidades com componentes de renderiza\u00e7\u00e3o e realiza o desenho.<\/li>\n<\/ul>\n<p>\nAp\u00f3s o estudo, ficou claro que o ECS resolve os seguintes problemas:<\/p>\n<ul>\n<li>uso de composi\u00e7\u00e3o em vez de heran\u00e7a para a organiza\u00e7\u00e3o sist\u00eamica das entidades; <\/li>\n<li>elimina\u00e7\u00e3o da confus\u00e3o do c\u00f3digo por meio de sistemas de controle; <\/li>\n<li>uso de m\u00e9todos como is_build_mode para manter a l\u00f3gica do wireframe em um s\u00f3 lugar \u2014 no sistema de renderiza\u00e7\u00e3o.<\/li>\n<\/ul>\n<p>\nAqui est\u00e1 o que resultou ap\u00f3s a implementa\u00e7\u00e3o do ECS.<\/p>\n<p><i>resources -&gt; \u00e9 aqui que est\u00e3o todos os ativos (imagens)<br \/>\nsrc<br \/>\n \u2014 components<br \/>\n \u2014 position.rs<br \/>\n \u2014 person.rs<br \/>\n \u2014 tennis_court.rs<br \/>\n \u2014 floor.rs<br \/>\n \u2014 wireframe.rs<br \/>\n \u2014 mouse_tracked.rs<br \/>\n \u2014 resources<br \/>\n \u2014 mouse.rs<br \/>\n \u2014 systems<br \/>\n \u2014 rendering.rs<br \/>\n \u2014 constants.rs<br \/>\n \u2014 utils.rs<br \/>\n \u2014 world_factory.rs -&gt; fun\u00e7\u00f5es da f\u00e1brica mundial<br \/>\n \u2014 main.rs -&gt; loop principal<\/i><\/p>\n<h3>Atribu\u00edmos pessoas \u00e0s quadras<\/h3>\n<p>\nA ECS facilitou a vida. Agora eu tinha um caminho sistem\u00e1tico para adicionar dados \u00e0s entidades e incorporar l\u00f3gica baseada nesses dados. Isso, por sua vez, permitiu organizar a distribui\u00e7\u00e3o de pessoas nas quadras.<\/p>\n<p>O que eu fiz:<\/p>\n<ul>\n<li>adicionei dados sobre as quadras designadas \u00e0 Pessoa;<\/li>\n<li>adicionei dados sobre as pessoas distribu\u00eddas no TennisCourt;<\/li>\n<li>adicionei o CourtChoosingSystem, que permite analisar pessoas e locais, descobrir quadras dispon\u00edveis e distribuir jogadores nelas;<\/li>\n<li>adicionei o sistema PersonMovementSystem, que procura pessoas designadas para as quadras e, se elas n\u00e3o estiverem l\u00e1, envia as pessoas para onde precisam.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Jogando Rust em 24 horas: experi\u00eancia pessoal de desenvolvimento\" src=\"\/wp-content\/uploads\/2019\/03\/f2e4632de2cb9d1c3ec7c9d9310b8170.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <\/p>\n<h3>Resumindo<\/h3>\n<p>\nEu realmente gostei de trabalhar neste jogo simples. Al\u00e9m disso, estou feliz por ter usado Rust para escrev\u00ea-lo, pois:<\/p>\n<ul>\n<li>Rust lhe d\u00e1 o que voc\u00ea precisa;<\/li>\n<li>ele tem uma excelente documenta\u00e7\u00e3o, Rust \u00e9 bastante elegante;<\/li>\n<li>a consist\u00eancia \u00e9 incr\u00edvel;<\/li>\n<li>n\u00e3o preciso recorrer a clonagem, c\u00f3pia ou a\u00e7\u00f5es semelhantes, que eu frequentemente fazia em C++;<\/li>\n<li>Options s\u00e3o muito convenientes para trabalhar, e elas tamb\u00e9m lidam bem com erros;<\/li>\n<li>se o projeto foi compilado com sucesso, 99% das vezes ele funciona exatamente como deveria. As mensagens de erro do compilador, na minha opini\u00e3o, s\u00e3o as melhores que j\u00e1 vi.<\/li>\n<\/ul>\n<p>\nO desenvolvimento de jogos em Rust est\u00e1 apenas come\u00e7ando. Mas j\u00e1 existe uma comunidade est\u00e1vel e bastante grande trabalhando para tornar Rust acess\u00edvel a todos. Portanto, vejo o futuro da linguagem com otimismo, aguardando ansiosamente os resultados do nosso esfor\u00e7o coletivo.<\/p>\n<blockquote><p><b>A Skillbox recomenda:<\/b><\/p>\n<ul>\n<li>Curso online <noindex><a rel=\"nofollow\" href=\"https:\/\/skillbox.ru\/frontend-developer\/?utm_source=skillbox.media&amp;utm_medium=habr.com&amp;utm_campaign=FRENDEV&amp;utm_content=articles&amp;utm_term=rust24\">\u00abProfiss\u00e3o desenvolvedor frontend\u00bb<\/a><\/noindex>.<\/li>\n<li>Curso Pr\u00e1tico <noindex><a rel=\"nofollow\" href=\"https:\/\/skillbox.ru\/agima\/?utm_source=skillbox.media&amp;utm_medium=habr.com&amp;utm_campaign=AGIMA&amp;utm_content=articles&amp;utm_term=rust24\">\u2018Desenvolvedor M\u00f3vel PRO\u2019<\/a><\/noindex>.<\/li>\n<li>Curso pr\u00e1tico de um ano <noindex><a rel=\"nofollow\" href=\"https:\/\/skillbox.ru\/php\/?utm_source=skillbox.media&amp;utm_medium=habr.com&amp;utm_campaign=PHPDEV&amp;utm_content=articles&amp;utm_term=rust24\">\"Desenvolvedor PHP do zero ao PRO\"<\/a><\/noindex>.<\/li>\n<\/ul>\n<p>\n<\/p><\/blockquote>\n<p>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/skillbox\/blog\/444364\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u043b\u0438\u0447\u043d\u043e\u043c \u043e\u043f\u044b\u0442\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0438\u0433\u0440\u044b \u043d\u0430 Rust. \u041d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0443\u0448\u043b\u043e \u043e\u043a\u043e\u043b\u043e 24 \u0447\u0430\u0441\u043e\u0432 (\u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430 \u043f\u043e \u0432\u0435\u0447\u0435\u0440\u0430\u043c \u0438\u043b\u0438 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445). \u0418\u0433\u0440\u0430 \u0435\u0449\u0435 \u0434\u0430\u043b\u0435\u043a\u0430 \u043e\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f, \u043d\u043e \u044f \u0434\u0443\u043c\u0430\u044e, \u0447\u0442\u043e \u043e\u043f\u044b\u0442 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c. \u042f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u0447\u0435\u043c\u0443 \u043d\u0430\u0443\u0447\u0438\u043b\u0430\u0441\u044c, \u0438 \u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u044f\u0445, \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0438 \u0438\u0433\u0440\u044b \u0441 \u043d\u0443\u043b\u044f. [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-29846","post","type-post","status-publish","format-standard","hentry"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u043b\u0438\u0447\u043d\u043e\u043c \u043e\u043f\u044b\u0442\u0435.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pt\/blog\/igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0418\u0433\u0440\u0430 \u043d\u0430 Rust \u0437\u0430 24 \u0447\u0430\u0441\u0430: \u043b\u0438\u0447\u043d\u044b\u0439 \u043e\u043f\u044b\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u043b\u0438\u0447\u043d\u043e\u043c \u043e\u043f\u044b\u0442\u0435.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pt\/blog\/igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:32:19+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:32:19+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Jogo em Rust em 24 horas: experi\u00eancia pessoal de desenvolvimento | ProHoster","description":"Neste artigo, compartilharei uma experi\u00eancia pessoal.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0418\u0433\u0440\u0430 \u043d\u0430 Rust \u0437\u0430 24 \u0447\u0430\u0441\u0430: \u043b\u0438\u0447\u043d\u044b\u0439 \u043e\u043f\u044b\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 | ProHoster","og:description":"\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u043b\u0438\u0447\u043d\u043e\u043c \u043e\u043f\u044b\u0442\u0435.","og:url":"https:\/\/prohoster.info\/pt\/blog\/igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:32:19+00:00","article:modified_time":"2019-10-31T18:32:19+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"29846","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"Article","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-20 22:43:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 03:47:36","updated":"2026-01-20 22:43:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/29846","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=29846"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/29846\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=29846"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=29846"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=29846"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}