{"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\/es\/blog\/igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki","title":{"rendered":"Desarrollando un juego en Rust en 24 horas: experiencias personales","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Desarrollando un juego en Rust en 24 horas: experiencias personales\" src=\"\/wp-content\/uploads\/2019\/03\/ea25406c43ac90ce2e33e290168d1083.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEn este art\u00edculo, compartir\u00e9 mi experiencia personal en el desarrollo de un peque\u00f1o juego en Rust. La creaci\u00f3n de la versi\u00f3n funcional tom\u00f3 aproximadamente 24 horas (principalmente trabaj\u00e9 por las noches o los fines de semana). El juego a\u00fan est\u00e1 lejos de estar terminado, pero creo que la experiencia ser\u00e1 \u00fatil. Les contar\u00e9 lo que aprend\u00ed y algunas observaciones hechas durante la construcci\u00f3n del juego desde cero.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<blockquote><p><b>Skillbox recomienda:<\/b> Curso pr\u00e1ctico de dos a\u00f1os <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\">\u00abSoy desarrolladora web PRO\u00bb<\/a><\/noindex>.<\/p>\n<p><b>Recordamos:<\/b> <i>para todos los lectores de \u00abHabr\u00bb \u2014 un descuento de 10,000 rublos al registrarse en cualquier curso de Skillbox usando el c\u00f3digo promocional \u00abHabr\u00bb.<\/i><\/p><\/blockquote>\n<p><\/p>\n<h3>\u00bfPor qu\u00e9 Rust?<\/h3>\n<p>\nEleg\u00ed este lenguaje porque escuch\u00e9 muchas cosas buenas sobre \u00e9l y veo que se est\u00e1 volviendo cada vez m\u00e1s popular en el campo del desarrollo de juegos. Antes de escribir el juego, ten\u00eda algo de experiencia en el desarrollo de aplicaciones simples en Rust. Eso fue suficiente para sentir una cierta libertad al escribir el juego.<\/p>\n<h3>\u00bfPor qu\u00e9 un juego y qu\u00e9 tipo de juego?<\/h3>\n<p>\n\u00a1Crear juegos es divertido! Me gustar\u00eda que hubiera m\u00e1s razones, pero para proyectos \u00abdom\u00e9sticos\u00bb, elijo temas que no est\u00e1n demasiado relacionados con mi trabajo habitual. \u00bfQu\u00e9 tipo de juego? Quer\u00eda hacer algo as\u00ed como un simulador de tenis, donde se combinan Cities Skylines, Zoo Tycoon, Prison Architect y, por supuesto, tenis. En general, se trata de un juego sobre una academia de tenis, a la que la gente viene a jugar.<\/p>\n<h3>Preparaci\u00f3n t\u00e9cnica<\/h3>\n<p>\nQuer\u00eda usar Rust, pero no sab\u00eda exactamente cu\u00e1n \u00abdesde cero\u00bb necesitaba comenzar a trabajar. No quer\u00eda escribir shaders de p\u00edxeles ni usar drag-and-drop, as\u00ed que busqu\u00e9 las soluciones m\u00e1s flexibles.<\/p>\n<p>Encontr\u00e9 recursos \u00fatiles que comparto con ustedes:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/arewegameyet.com\/\">Are we game yet<\/a><\/noindex> \u2014 una lista de elementos necesarios para el desarrollo de juegos en Rust;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.reddit.com\/r\/rust_gamedev\">Subreddit de desarrollo de juegos en Rust;<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/kenney.nl\">Arte pixel gratuito.<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nInvestig\u00e9 varios motores de juego en Rust, eligiendo al final Piston y ggez. Me hab\u00eda encontrado con ellos mientras trabajaba en un proyecto anterior. Finalmente eleg\u00ed ggez, ya que me pareci\u00f3 m\u00e1s adecuado para implementar un peque\u00f1o juego 2D. La estructura modular de Piston es demasiado compleja para un desarrollador principiante (o alguien que trabaja con Rust por primera vez).<\/p>\n<h3>Estructura del juego<\/h3>\n<p>\nPas\u00e9 un tiempo reflexionando sobre la arquitectura del proyecto. El primer paso es crear la \u00abtierra\u00bb, las personas y las canchas de tenis. Las personas deben moverse por las canchas y esperar. Los jugadores deben tener habilidades que mejoren con el tiempo. Adem\u00e1s, debe haber un editor que permita agregar nuevas personas y canchas, pero eso ya no ser\u00e1 gratuito.<\/p>\n<p>Despu\u00e9s de pensar en todo, comenc\u00e9 a trabajar. <\/p>\n<h3>Creaci\u00f3n de un juego<\/h3>\n<p>\n<b>Inicio: c\u00edrculos y abstracciones<\/b><\/p>\n<p>Tom\u00e9 un ejemplo de ggez y obtuve un c\u00edrculo en la pantalla. \u00a1Asombroso! Ahora un poco de abstracciones. Me pareci\u00f3 que ser\u00eda bueno abstraer la idea del objeto del juego. Cada objeto debe ser renderizado y actualizado, como se indica aqu\u00ed:<\/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>\nEste fragmento de c\u00f3digo me permiti\u00f3 obtener una excelente lista de objetos que puedo actualizar y renderizar en un ciclo igualmente excelente.<\/p>\n<pre><code class=\"rust\">mpl event::EventHandler para MainState {\n    fn update(&amp;mut self, context: &amp;mut Context) -&gt; GameResult {\n        \/\/ Actualiza todos los 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        \/\/ Dibuja todos los 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 es necesario porque contiene todas las l\u00edneas de c\u00f3digo. Pas\u00e9 un tiempo separando archivos y optimizando la estructura de directorios. As\u00ed es como todo se ve despu\u00e9s de esto:<br \/>\n<i>resources -&gt; aqu\u00ed es donde est\u00e1n todos los activos (im\u00e1genes)<br \/>\nsrc<br \/>\n \u2014 entidades<br \/>\n \u2014 game_object.rs<br \/>\n \u2014 circle.rs<br \/>\n \u2014 main.rs -&gt; bucle principal<\/i><\/p>\n<p><b>Personas, canchas y im\u00e1genes<\/b><\/p>\n<p>El siguiente paso es crear el objeto de juego Person y cargar im\u00e1genes. Todo debe construirse sobre azulejos de 32*32.<\/p>\n<p><img decoding=\"async\" alt=\"Desarrollando un juego en Rust en 24 horas: experiencias personales\" src=\"\/wp-content\/uploads\/2019\/03\/265ed79e6784ef0180cfdc5aa8d96a4c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>Canchas de tenis<\/b><\/p>\n<p>Estudiando c\u00f3mo lucen las canchas de tenis, decid\u00ed hacerlas con azulejos de 4*2. Inicialmente se pod\u00eda hacer una imagen de ese tama\u00f1o o juntar 8 azulejos individuales. Pero luego entend\u00ed que solo necesitaba dos azulejos \u00fanicos, y aqu\u00ed est\u00e1 la raz\u00f3n.<\/p>\n<p>En total tenemos dos de esos azulejos: 1 y 2.<\/p>\n<p>Cada secci\u00f3n de la cancha consta de un azulejo 1 o un azulejo 2. Pueden estar dispuestos de manera normal o estar volteados 180 grados.<\/p>\n<p><img decoding=\"async\" alt=\"Desarrollando un juego en Rust en 24 horas: experiencias personales\" src=\"\/wp-content\/uploads\/2019\/03\/90d07caea0dee8673ada5d44963ab347.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>Modo principal de construcci\u00f3n (ensamblaje)<\/b><\/p>\n<p>Despu\u00e9s de lograr renderizar las canchas, las personas y los mapas, supe que tambi\u00e9n necesitaba un modo b\u00e1sico de ensamblaje. Lo implement\u00e9 as\u00ed: cuando se presiona un bot\u00f3n, se selecciona un objeto y un clic lo coloca en el lugar correcto. As\u00ed, el bot\u00f3n 1 permite seleccionar la cancha y el bot\u00f3n 2 permite seleccionar al jugador.<\/p>\n<p>Pero tambi\u00e9n es necesario recordar lo que significa 1 y 2, as\u00ed que a\u00f1ad\u00ed un wireframe para que fuera claro cu\u00e1l objeto estaba seleccionado. As\u00ed es como se ve.<\/p>\n<p><img decoding=\"async\" alt=\"Desarrollando un juego en Rust en 24 horas: experiencias personales\" src=\"\/wp-content\/uploads\/2019\/03\/09b92828fb9b8d4bfa5d5178ca99613c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>Preguntas sobre arquitectura y refactorizaci\u00f3n<\/b><\/p>\n<p>Ahora tengo varios objetos de juego: personas, canchas y pisos. Pero para que los wireframes funcionen, es necesario informar a cada entidad del objeto si los propios objetos est\u00e1n en modo de demostraci\u00f3n o si solo se dibuja un marco. Esto no es muy conveniente.<\/p>\n<p>Me pareci\u00f3 que era necesario replantear la arquitectura para que aparecieran algunas limitaciones:<\/p>\n<ul>\n<li>la existencia de una entidad que se muestra y actualiza a s\u00ed misma es un problema, ya que esta entidad no podr\u00e1 'saber' qu\u00e9 debe renderizar: una imagen y un wireframe;<\/li>\n<li>la falta de una herramienta para intercambiar propiedades y comportamientos entre entidades individuales (un ejemplo ser\u00eda la propiedad is_build_mode o el comportamiento de renderizado). Se podr\u00eda haber utilizado herencia, aunque en Rust no hay una forma adecuada de implementarlo. Lo que realmente necesitaba era composici\u00f3n;<\/li>\n<li>una herramienta para la interacci\u00f3n entre entidades era necesaria para asignar personas a las canchas;<\/li>\n<li>las propias entidades representaban una mezcla de datos y l\u00f3gica, lo que r\u00e1pidamente se volv\u00eda incontrolable.<\/li>\n<\/ul>\n<p><\/p>\n<blockquote><p><i>Realic\u00e9 un estudio adicional y descubr\u00ed la arquitectura <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Entity_component_system\">ECS \u2014 Sistema de Componentes de Entidad<\/a><\/noindex>, que se utiliza com\u00fanmente en los juegos. Aqu\u00ed est\u00e1n las ventajas de ECS:<\/p>\n<ul>\n<li>los datos est\u00e1n separados de la l\u00f3gica;<\/li>\n<li>composici\u00f3n en lugar de herencia;<\/li>\n<li>una arquitectura orientada a datos.<\/li>\n<\/ul>\n<p><\/i><\/p><\/blockquote>\n<p>\nECS se caracteriza por tres conceptos b\u00e1sicos:<\/p>\n<ul>\n<li>entidades \u2014 tipo de objeto al que se refiere un identificador (esto puede ser un jugador, una pelota o algo m\u00e1s);<\/li>\n<li>componentes \u2014 de los cuales est\u00e1n formadas las entidades. Ejemplo: componente de renderizado, ubicaci\u00f3n y otros. Son dep\u00f3sitos de datos;<\/li>\n<li>sistemas \u2014 utilizan tanto objetos como componentes, adem\u00e1s contienen comportamiento y l\u00f3gica que se basa en esos datos. Ejemplo: sistema de renderizado que recorre todas las entidades con componentes para el renderizado y se encarga de la reproducci\u00f3n.<\/li>\n<\/ul>\n<p>\nDespu\u00e9s de estudiar, qued\u00f3 claro que ECS aborda los siguientes problemas:<\/p>\n<ul>\n<li>aplicar composici\u00f3n en lugar de herencia para la organizaci\u00f3n sistem\u00e1tica de entidades; <\/li>\n<li>eliminar el desorden del c\u00f3digo a trav\u00e9s de sistemas de gesti\u00f3n; <\/li>\n<li>utilizar m\u00e9todos como is_build_mode para mantener la l\u00f3gica del wireframe en un solo lugar: en el sistema de renderizado.<\/li>\n<\/ul>\n<p>\nAs\u00ed qued\u00f3 despu\u00e9s de implementar ECS.<\/p>\n<p><i>resources -&gt; aqu\u00ed es donde est\u00e1n todos los activos (im\u00e1genes)<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; funciones de la f\u00e1brica mundial<br \/>\n \u2014 main.rs -&gt; bucle principal<\/i><\/p>\n<h3>Asignamos personas a las canchas<\/h3>\n<p>\nECS hizo la vida m\u00e1s f\u00e1cil. Ahora ten\u00eda un camino sistem\u00e1tico para agregar datos a las entidades y agregar l\u00f3gica basada en esos datos. Esto, a su vez, permiti\u00f3 organizar la distribuci\u00f3n de personas en las canchas.<\/p>\n<p>Lo que hice:<\/p>\n<ul>\n<li>agregu\u00e9 datos sobre las canchas asignadas en Person;<\/li>\n<li>agregu\u00e9 datos sobre las personas distribuidas en TennisCourt;<\/li>\n<li>agregu\u00e9 CourtChoosingSystem, que permite analizar personas y lugares, descubrir canchas disponibles y distribuir jugadores en ellas;<\/li>\n<li>agregu\u00e9 el sistema PersonMovementSystem, que busca personas asignadas a las canchas y, si no est\u00e1n all\u00ed, env\u00eda a las personas donde se necesita.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Desarrollando un juego en Rust en 24 horas: experiencias personales\" src=\"\/wp-content\/uploads\/2019\/03\/f2e4632de2cb9d1c3ec7c9d9310b8170.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <\/p>\n<h3>Resumen<\/h3>\n<p>\nDisfrut\u00e9 mucho trabajar en este juego simple. Adem\u00e1s, estoy contenta de que utilic\u00e9 Rust para escribirlo, ya que:<\/p>\n<ul>\n<li>Rust te da lo que necesitas;<\/li>\n<li>tiene una excelente documentaci\u00f3n, Rust es bastante elegante;<\/li>\n<li>la inmutabilidad es genial;<\/li>\n<li>no necesito recurrir a clonar, copiar o acciones similares, algo que sol\u00eda hacer con C++;<\/li>\n<li>Options son muy convenientes de manejar, tambi\u00e9n manejan errores de manera excelente;<\/li>\n<li>si el proyecto se compila, en un 99% funcionar\u00e1, y lo har\u00e1 exactamente como debe. Las mensajes de error del compilador, creo que son los mejores que he visto.<\/li>\n<\/ul>\n<p>\nEl desarrollo de juegos en Rust apenas est\u00e1 comenzando. Pero ya hay una comunidad estable y bastante grande trabajando para abrir Rust a todos. Por lo tanto, veo el futuro del lenguaje con optimismo, esperando con ansias los resultados de nuestro trabajo conjunto.<\/p>\n<blockquote><p><b>Skillbox recomienda:<\/b><\/p>\n<ul>\n<li>Curso en l\u00ednea <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\">\u00abLa profesi\u00f3n de desarrollador frontend\u00bb<\/a><\/noindex>.<\/li>\n<li>Curso pr\u00e1ctico <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\">\u00abDesarrollador M\u00f3vil PRO\u00bb<\/a><\/noindex>.<\/li>\n<li>Curso pr\u00e1ctico de un a\u00f1o <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\">\u00abDesarrollador PHP desde 0 hasta PRO\u00bb<\/a><\/noindex>.<\/li>\n<\/ul>\n<p>\n<\/p><\/blockquote>\n<p>Fuente: <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.2 - 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\/es\/blog\/igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\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\/es\/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\udd47Juego en Rust en 24 horas: experiencia personal de desarrollo | ProHoster","description":"En este art\u00edculo hablar\u00e9 de mi experiencia personal.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","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\/es\/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\/es\/wp-json\/wp\/v2\/posts\/29846","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=29846"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/29846\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=29846"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=29846"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=29846"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}