{"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\/fr\/blog\/igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki","title":{"rendered":"D\u00e9veloppement d'un jeu en Rust en 24 heures : exp\u00e9rience personnelle","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"D\u00e9veloppement d&#039;un jeu en Rust en 24 heures : exp\u00e9rience personnelle\" src=\"\/wp-content\/uploads\/2019\/03\/ea25406c43ac90ce2e33e290168d1083.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDans cet article, je vais partager mon exp\u00e9rience personnelle dans le d\u00e9veloppement d'un petit jeu en Rust. La cr\u00e9ation de la version fonctionnelle a pris environ 24 heures (principalement, je travaillais le soir ou le week-end). Le jeu est encore loin d'\u00eatre termin\u00e9, mais je pense que l'exp\u00e9rience sera b\u00e9n\u00e9fique. Je vais expliquer ce que j'ai appris et certaines observations faites lors de la construction du jeu \u00e0 partir de z\u00e9ro.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<blockquote><p><b>Skillbox recommande :<\/b> Cours pratique de deux ans <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\">\u00ab Je suis d\u00e9veloppeur web PRO \u00bb<\/a><\/noindex>.<\/p>\n<p><b>Rappelons-le :<\/b> <i>pour tous les lecteurs de \u00ab Habr \u00bb \u2014 une r\u00e9duction de 10 000 roubles lors de l'inscription \u00e0 tout cours Skillbox avec le code promo \u00ab Habr \u00bb.<\/i><\/p><\/blockquote>\n<p><\/p>\n<h3>Pourquoi Rust ?<\/h3>\n<p>\nJ'ai choisi ce langage car j'en ai beaucoup entendu de bien et je vois qu'il devient de plus en plus populaire dans le domaine du d\u00e9veloppement de jeux. Avant d'\u00e9crire le jeu, j'avais une petite exp\u00e9rience dans le d\u00e9veloppement d'applications simples en Rust. C'\u00e9tait juste assez pour sentir une certaine libert\u00e9 lors de l'\u00e9criture du jeu.<\/p>\n<h3>Pourquoi un jeu et quel type de jeu ?<\/h3>\n<p>\nCr\u00e9er des jeux est amusant ! J'aimerais qu'il y ait plus de raisons, mais pour les projets \u00ab maison \u00bb, je choisis des th\u00e8mes qui ne sont pas trop \u00e9troitement li\u00e9s \u00e0 mon travail habituel. Quel type de jeu ? Je voulais faire quelque chose comme un simulateur de tennis, combinant Cities Skylines, Zoo Tycoon, Prison Architect et bien s\u00fbr, le tennis. Au final, j'ai cr\u00e9\u00e9 un jeu sur une acad\u00e9mie de tennis o\u00f9 les gens viennent jouer.<\/p>\n<h3>Pr\u00e9paration technique<\/h3>\n<p>\nJe voulais utiliser Rust, mais je ne savais pas exactement par o\u00f9 commencer si je partais de \u00ab z\u00e9ro \u00bb. Je ne voulais pas \u00e9crire de shaders pixelis\u00e9s ou utiliser du glisser-d\u00e9poser, donc je cherchais les solutions les plus flexibles.<\/p>\n<p>J'ai trouv\u00e9 des ressources utiles que je partage avec vous :<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/arewegameyet.com\/\">Are we game yet<\/a><\/noindex> \u2014 une liste d'\u00e9l\u00e9ments n\u00e9cessaires au d\u00e9veloppement de jeux en Rust ;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.reddit.com\/r\/rust_gamedev\">Subreddit de d\u00e9veloppement de jeux Rust ;<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/kenney.nl\">Art pixel gratuit.<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nJ'ai \u00e9tudi\u00e9 plusieurs moteurs de jeux en Rust, et au final, j'ai choisi Piston et ggez. Je les avais rencontr\u00e9s lors d'un projet pr\u00e9c\u00e9dent. Au final, j'ai choisi ggez car il me semblait plus adapt\u00e9 pour r\u00e9aliser un petit jeu 2D. La structure modulaire de Piston est trop complexe pour un d\u00e9veloppeur d\u00e9butant (ou pour quelqu'un qui d\u00e9couvre Rust pour la premi\u00e8re fois).<\/p>\n<h3>Structure du jeu<\/h3>\n<p>\nJ'ai pass\u00e9 un certain temps \u00e0 r\u00e9fl\u00e9chir \u00e0 l'architecture du projet. La premi\u00e8re \u00e9tape consiste \u00e0 cr\u00e9er le \u00ab terrain \u00bb, les personnages et les courts de tennis. Les personnages doivent se d\u00e9placer sur les courts et attendre. Les joueurs doivent avoir des comp\u00e9tences qui s'am\u00e9liorent avec le temps. De plus, il doit y avoir un \u00e9diteur permettant d'ajouter de nouveaux personnages et courts, mais cela ne sera pas gratuit.<\/p>\n<p>Une fois tout cela r\u00e9fl\u00e9chi, j'ai commenc\u00e9 \u00e0 travailler. <\/p>\n<h3>Cr\u00e9ation de jeu<\/h3>\n<p>\n<b>D\u00e9but : cercles et abstractions<\/b><\/p>\n<p>J'ai pris un exemple de ggez et j'ai obtenu un cercle \u00e0 l'\u00e9cran. Incroyable ! Maintenant, un peu d'abstractions. J'ai pens\u00e9 qu'il serait bon de s'abstraire de l'id\u00e9e d'objet de jeu. Chaque objet doit \u00eatre rendu et mis \u00e0 jour comme indiqu\u00e9 ici :<\/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>\nCe morceau de code m'a permis d'obtenir une excellente liste d'objets que je peux mettre \u00e0 jour et rendre dans une boucle tout aussi excellente.<\/p>\n<pre><code class=\"rust\">mpl event::EventHandler pour MainState {\n    fn update(&amp;mut self, context: &amp;mut Context) -&gt; GameResult {\n        \/\/ Mettre \u00e0 jour tous les objets\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        \/\/ Dessiner tous les objets\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 est n\u00e9cessaire car il contient toutes les lignes de code. J'ai pass\u00e9 un peu de temps \u00e0 s\u00e9parer les fichiers et optimiser la structure des r\u00e9pertoires. Voici \u00e0 quoi tout cela ressemble apr\u00e8s cela :<br \/>\n<i>resources -&gt; c'est ici que se trouvent tous les actifs (images)<br \/>\nsrc<br \/>\n \u2014 entit\u00e9s<br \/>\n \u2014 game_object.rs<br \/>\n \u2014 circle.rs<br \/>\n \u2014 main.rs -&gt; boucle principale<\/i><\/p>\n<p><b>Personnes, terrains et images<\/b><\/p>\n<p>La prochaine \u00e9tape consiste \u00e0 cr\u00e9er l'objet de jeu Person et \u00e0 charger des images. Tout doit \u00eatre construit sur la base de tuiles de 32*32.<\/p>\n<p><img decoding=\"async\" alt=\"D\u00e9veloppement d&#039;un jeu en Rust en 24 heures : exp\u00e9rience personnelle\" src=\"\/wp-content\/uploads\/2019\/03\/265ed79e6784ef0180cfdc5aa8d96a4c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>Terrains de tennis<\/b><\/p>\n<p>Apr\u00e8s avoir \u00e9tudi\u00e9 \u00e0 quoi ressemblent les terrains de tennis, j'ai d\u00e9cid\u00e9 de les faire avec des tuiles de 4*2. Au d\u00e9part, il \u00e9tait possible de cr\u00e9er une image de cette taille ou de composer 8 tuiles s\u00e9par\u00e9es. Mais j'ai ensuite r\u00e9alis\u00e9 qu'il fallait seulement deux tuiles uniques, et voici pourquoi.<\/p>\n<p>Nous avons donc deux de ces tuiles : 1 et 2.<\/p>\n<p>Chaque section du court se compose soit de la tuile 1, soit de la tuile 2. Elles peuvent \u00eatre dispos\u00e9es normalement ou \u00eatre retourn\u00e9es de 180 degr\u00e9s.<\/p>\n<p><img decoding=\"async\" alt=\"D\u00e9veloppement d&#039;un jeu en Rust en 24 heures : exp\u00e9rience personnelle\" src=\"\/wp-content\/uploads\/2019\/03\/90d07caea0dee8673ada5d44963ab347.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>Mode principal de construction (assemblage)<\/b><\/p>\n<p>Apr\u00e8s avoir r\u00e9ussi \u00e0 rendre les terrains, les personnes et les cartes, j'ai compris qu'il fallait \u00e9galement un mode de construction de base. Je l'ai mis en \u0153uvre ainsi : lorsque le bouton est press\u00e9, l'objet est s\u00e9lectionn\u00e9, et un clic le place \u00e0 l'endroit souhait\u00e9. Ainsi, le bouton 1 permet de s\u00e9lectionner le court, et le bouton 2 permet de s\u00e9lectionner le joueur.<\/p>\n<p>Mais il faut aussi se rappeler ce que signifient 1 et 2, donc j'ai ajout\u00e9 un wireframe pour qu'il soit clair quel objet est s\u00e9lectionn\u00e9. Voici \u00e0 quoi cela ressemble.<\/p>\n<p><img decoding=\"async\" alt=\"D\u00e9veloppement d&#039;un jeu en Rust en 24 heures : exp\u00e9rience personnelle\" src=\"\/wp-content\/uploads\/2019\/03\/09b92828fb9b8d4bfa5d5178ca99613c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>Questions sur l'architecture et le refactoring<\/b><\/p>\n<p>Maintenant, j'ai plusieurs objets de jeu : des personnes, des courts et des \u00e9tages. Cependant, pour que les wireframes fonctionnent, il est n\u00e9cessaire d'indiquer \u00e0 chaque entit\u00e9 de l'objet si les objets eux-m\u00eames sont en mode de d\u00e9monstration, ou s'il ne s'agit que d'une simple bordure dessin\u00e9e. Ce n'est pas tr\u00e8s pratique.<\/p>\n<p>Il me semblait qu'il fallait repenser l'architecture pour faire ressortir certaines limitations :<\/p>\n<ul>\n<li>la pr\u00e9sence d'une entit\u00e9 qui s'affiche et se met \u00e0 jour elle-m\u00eame est un probl\u00e8me, car cette entit\u00e9 ne pourra pas \u00ab savoir \u00bb ce qu'elle doit rendre \u2014 une image ou un wireframe ;<\/li>\n<li>l'absence d'un outil d'\u00e9change de propri\u00e9t\u00e9s et de comportements entre des entit\u00e9s individuelles (par exemple, la propri\u00e9t\u00e9 is_build_mode ou le rendu du comportement). On aurait pu utiliser l'h\u00e9ritage, bien qu'il n'y ait pas de mani\u00e8re normale de l'impl\u00e9menter en Rust. Ce dont j'avais vraiment besoin, c'\u00e9tait de composition ;<\/li>\n<li>un outil pour faire interagir les entit\u00e9s entre elles \u00e9tait n\u00e9cessaire pour assigner des personnes aux courts ;<\/li>\n<li>les entit\u00e9s elles-m\u00eames repr\u00e9sentaient un m\u00e9lange de donn\u00e9es et de logique, ce qui devenait tr\u00e8s vite ing\u00e9rable.<\/li>\n<\/ul>\n<p><\/p>\n<blockquote><p><i>J'ai men\u00e9 une \u00e9tude approfondie et d\u00e9couvert l'architecture <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Entity_component_system\">ECS \u2014 Syst\u00e8me d'entit\u00e9s et de composants<\/a><\/noindex>, qui est g\u00e9n\u00e9ralement utilis\u00e9e dans les jeux. Voici les avantages de l'ECS :<\/p>\n<ul>\n<li>les donn\u00e9es sont s\u00e9par\u00e9es de la logique ;<\/li>\n<li>composition plut\u00f4t qu'h\u00e9ritage ;<\/li>\n<li>architecture orient\u00e9e donn\u00e9es.<\/li>\n<\/ul>\n<p><\/i><\/p><\/blockquote>\n<p>\nL'ECS se caract\u00e9rise par trois concepts de base :<\/p>\n<ul>\n<li>entit\u00e9s \u2014 un type d'objet auquel fait r\u00e9f\u00e9rence un identifiant (cela peut \u00eatre un joueur, une balle ou autre) ;<\/li>\n<li>composants \u2014 ce dont sont compos\u00e9es les entit\u00e9s. Exemple \u2014 le composant de rendu, de position, et d'autres. Ce sont des stockages de donn\u00e9es ;<\/li>\n<li>syst\u00e8mes \u2014 ils utilisent des objets et des composants, plus contiennent des comportements et une logique bas\u00e9s sur ces donn\u00e9es. Exemple \u2014 un syst\u00e8me de rendu, it\u00e9rant sur toutes les entit\u00e9s avec des composants \u00e0 rendre et s'occupant du dessin.<\/li>\n<\/ul>\n<p>\nApr\u00e8s l'\u00e9tude, il est devenu \u00e9vident que l'ECS r\u00e9sout les probl\u00e8mes suivants :<\/p>\n<ul>\n<li>application de la composition au lieu de l'h\u00e9ritage pour l'organisation syst\u00e9mique des entit\u00e9s ; <\/li>\n<li>\u00e9limination du fouillis de code gr\u00e2ce \u00e0 des syst\u00e8mes de gestion ; <\/li>\n<li>utilisation de m\u00e9thodes comme is_build_mode pour stocker la logique du wireframe au m\u00eame endroit \u2014 dans le syst\u00e8me de rendu.<\/li>\n<\/ul>\n<p>\nVoici ce qui a \u00e9t\u00e9 obtenu apr\u00e8s l'impl\u00e9mentation de l'ECS.<\/p>\n<p><i>resources -&gt; c'est ici que se trouvent tous les actifs (images)<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; fonctions de la fabrique du monde<br \/>\n \u2014 main.rs -&gt; boucle principale<\/i><\/p>\n<h3>Nous assignons des personnes aux courts<\/h3>\n<p>\nECS a rendu la vie plus simple. J'avais maintenant un moyen syst\u00e9mique d'ajouter des donn\u00e9es aux entit\u00e9s et d'ajouter de la logique bas\u00e9e sur ces donn\u00e9es. Cela a permis d'organiser la r\u00e9partition des personnes aux courts.<\/p>\n<p>Ce que j'ai fait :<\/p>\n<ul>\n<li>ajout\u00e9 les donn\u00e9es des courts assign\u00e9s dans Person ;<\/li>\n<li>ajout\u00e9 les donn\u00e9es des personnes r\u00e9parties dans TennisCourt ;<\/li>\n<li>ajout\u00e9 CourtChoosingSystem, qui analyse les personnes et les installations, d\u00e9tecte les courts disponibles et r\u00e9partit les joueurs sur ceux-ci ;<\/li>\n<li>ajout\u00e9 le syst\u00e8me PersonMovementSystem, qui cherche des personnes assign\u00e9es aux courts, et si elles n'y sont pas, les envoie l\u00e0 o\u00f9 elles doivent aller.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"D\u00e9veloppement d&#039;un jeu en Rust en 24 heures : exp\u00e9rience personnelle\" src=\"\/wp-content\/uploads\/2019\/03\/f2e4632de2cb9d1c3ec7c9d9310b8170.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <\/p>\n<h3>Bilan<\/h3>\n<p>\nJ'ai beaucoup aim\u00e9 travailler sur ce jeu simple. De plus, je suis contente d'avoir utilis\u00e9 Rust pour son d\u00e9veloppement, car :<\/p>\n<ul>\n<li>Rust vous fournit ce dont vous avez besoin ;<\/li>\n<li>il a une excellente documentation, Rust est tr\u00e8s \u00e9l\u00e9gant ;<\/li>\n<li>la constance, c'est g\u00e9nial ;<\/li>\n<li>je ne dois pas recourir \u00e0 des clonages, copies ou autres actions similaires, ce que je faisais souvent en C++ ;<\/li>\n<li>Les Options sont tr\u00e8s pratiques \u00e0 utiliser, elles g\u00e8rent aussi tr\u00e8s bien les erreurs ;<\/li>\n<li>si le projet a r\u00e9ussi \u00e0 se compiler, il fonctionne dans 99 % des cas comme il le devrait. Les messages d'erreur du compilateur me semblent les meilleurs que j'ai jamais vus.<\/li>\n<\/ul>\n<p>\nLe d\u00e9veloppement de jeux en Rust ne fait que commencer. Mais il y a d\u00e9j\u00e0 une communaut\u00e9 stable et assez importante qui travaille \u00e0 rendre Rust accessible \u00e0 tous. C'est pourquoi je suis optimiste quant \u00e0 l'avenir du langage, attendant avec impatience les r\u00e9sultats de notre travail collectif.<\/p>\n<blockquote><p><b>Skillbox recommande :<\/b><\/p>\n<ul>\n<li>Cours en ligne <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\">\u00abM\u00e9tier de d\u00e9veloppeur frontend\u00bb<\/a><\/noindex>.<\/li>\n<li>Cours pratique <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\">\u00ab D\u00e9veloppeur mobile PRO \u00bb<\/a><\/noindex>.<\/li>\n<li>Cours pratique d'un an <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\">\u00abD\u00e9veloppeur PHP de 0 \u00e0 PRO\u00bb<\/a><\/noindex>.<\/li>\n<\/ul>\n<p>\n<\/p><\/blockquote>\n<p>Source : <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\/fr\/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=\"fr_FR\" \/>\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\/fr\/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\udd47D\u00e9veloppement d'un jeu en Rust en 24 heures : exp\u00e9rience personnelle | ProHoster","description":"Dans cet article, je partagerai mon exp\u00e9rience personnelle.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","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\/fr\/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\/fr\/wp-json\/wp\/v2\/posts\/29846","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=29846"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/29846\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=29846"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=29846"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=29846"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}