{"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\/nl\/blog\/igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki","title":{"rendered":"Spelen op Rust in 24 uur: persoonlijke ontwikkelervaring","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Spelen op Rust in 24 uur: persoonlijke ontwikkelervaring\" src=\"\/wp-content\/uploads\/2019\/03\/ea25406c43ac90ce2e33e290168d1083.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIn dit artikel deel ik mijn persoonlijke ervaring met het ontwikkelen van een kleine game in Rust. Het kostte ongeveer 24 uur om een werkende versie te maken (voornamelijk werkte ik \u2019s avonds of in het weekend). De game is nog lang niet af, maar ik denk dat de ervaring waardevol zal zijn. Ik zal vertellen wat ik geleerd heb en enkele observaties delen die ik heb gedaan bij het bouwen van de game vanaf nul.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<blockquote><p><b>Skillbox raadt aan:<\/b> Praktische tweejarenopleiding <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\">Ik ben een PRO webontwikkelaar<\/a><\/noindex>.<\/p>\n<p><b>Ter herinnering:<\/b> <i>voor alle lezers van \u00abHabr\u00bb \u2014 een korting van 10.000 roebel bij inschrijving voor elke cursus van Skillbox met de promocode \u00abHabr\u00bb.<\/i><\/p><\/blockquote>\n<p><\/p>\n<h3>Waarom Rust?<\/h3>\n<p>\nIk koos deze taal omdat ik veel goeds erover had gehoord en zie dat deze steeds populairder wordt in de game-ontwikkelingssector. Voor het schrijven van de game had ik enige ervaring met de ontwikkeling van eenvoudige applicaties in Rust. Dat was precies genoeg om een bepaalde vrijheid te voelen tijdens het schrijven van de game.<\/p>\n<h3>Waarom juist een game en wat voor game?<\/h3>\n<p>\nGames maken is leuk! Ik zou willen dat er meer redenen waren, maar voor \u2018thuis\u2019 projecten kies ik onderwerpen die niet te nauw verbonden zijn met mijn reguliere werk. Wat voor game? Ik wilde iets maken als een tennis simulator, waarbij elementen van Cities Skylines, Zoo Tycoon, Prison Architect en tennis zelf worden gecombineerd. Kortom, het is een game over een tennisacademie waar mensen komen om te spelen.<\/p>\n<h3>Technische voorbereiding<\/h3>\n<p>\nIk wilde Rust gebruiken, maar wist niet precies hoe \u2018van nul\u2019 ik moest beginnen. Ik wilde geen pixel shaders schrijven en geen drag-and-drop gebruiken, dus zocht ik naar de meest flexibele oplossingen.<\/p>\n<p>Ik vond enkele nuttige bronnen die ik met jullie deel:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/arewegameyet.com\/\">Are we game yet<\/a><\/noindex> \u2014 een lijst met noodzakelijke elementen voor het ontwikkelen van games in Rust;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.reddit.com\/r\/rust_gamedev\">Rust game dev subreddit;<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/kenney.nl\">Gratis pixel art.<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nIk heb verschillende game engines in Rust bestudeerd en uiteindelijk gekozen voor Piston en ggez. Ik had met hen gewerkt aan een eerder project. Uiteindelijk koos ik voor ggez omdat het geschikter leek voor de implementatie van een kleine 2D-game. De modulaire structuur van Piston is te complex voor een beginnende ontwikkelaar (of iemand die voor het eerst met Rust werkt).<\/p>\n<h3>Structuur van de game<\/h3>\n<p>\nIk heb wat tijd besteed aan het nadenken over de architectuur van het project. De eerste stap is om \u2018grond\u2019, mensen en tennisbanen te maken. Mensen moeten zich over de banen kunnen verplaatsen en wachten. De spelers moeten vaardigheden hebben die in de loop van de tijd verbeteren. Bovendien moet er een editor zijn waarmee nieuwe mensen en banen kunnen worden toegevoegd, maar dat is al niet gratis.<\/p>\n<p>Nadat ik alles had doordacht, begon ik met het werk. <\/p>\n<h3>Een spel maken<\/h3>\n<p>\n<b>Begin: cirkels en abstracties<\/b><\/p>\n<p>Ik heb een voorbeeld uit ggez genomen en kreeg een cirkel op het scherm. Verbazingwekkend! Nu wat abstracties. Het leek me goed om me te abstraheren van het idee van een game-object. Elk object moet worden gerenderd en bijgewerkt, zoals hier aangegeven:<\/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>\nDit stuk code stelde me in staat om een uitstekende lijst van objecten te krijgen die ik kan bijwerken en renderen in een minimaal uitstekende lus.<\/p>\n<pre><code class=\"rust\">mpl event::EventHandler voor MainState {\n    fn update(&amp;mut self, context: &amp;mut Context) -&gt; GameResult {\n        \/\/ Werk alle objecten bij\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        \/\/ Teken alle objecten\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 is nodig omdat het alle rijbewijsregels bevat. Ik heb wat tijd besteed aan het splitsen van bestanden en het optimaliseren van de directorystructuur. Zo zag alles eruit na deze aanpassingen:<br \/>\n<i>resources -&gt; dit is waar alle middelen zijn (afbeeldingen)<br \/>\nsrc<br \/>\n \u2014 entiteiten<br \/>\n \u2014 game_object.rs<br \/>\n \u2014 circle.rs<br \/>\n \u2014 main.rs -&gt; hoofdloop<\/i><\/p>\n<p><b>Mensen, banen en afbeeldingen<\/b><\/p>\n<p>De volgende stap is het cre\u00ebren van het game-object Persoon en het laden van afbeeldingen. Alles moet gebaseerd zijn op tegels van 32*32.<\/p>\n<p><img decoding=\"async\" alt=\"Spelen op Rust in 24 uur: persoonlijke ontwikkelervaring\" src=\"\/wp-content\/uploads\/2019\/03\/265ed79e6784ef0180cfdc5aa8d96a4c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>Tennisbanen<\/b><\/p>\n<p>Na het bestuderen van hoe tennisbanen eruitzien, besloot ik ze te maken met tegels van 4*2. In het begin kon ik een afbeelding van die grootte maken of 8 afzonderlijke tegels samenvoegen. Maar later besefte ik dat er slechts twee unieke tegels nodig zijn, en hier is waarom.<\/p>\n<p>We hebben in totaal twee van deze tegels: 1 en 2.<\/p>\n<p>Elke sectie van de baan bestaat uit tegel 1 of tegel 2. Ze kunnen normaal worden geplaatst of 180 graden worden gedraaid.<\/p>\n<p><img decoding=\"async\" alt=\"Spelen op Rust in 24 uur: persoonlijke ontwikkelervaring\" src=\"\/wp-content\/uploads\/2019\/03\/90d07caea0dee8673ada5d44963ab347.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>De belangrijkste bouwmodus (assemblage)<\/b><\/p>\n<p>Nadat ik had bereikt dat de velden, mensen en kaarten werden gerenderd, realiseerde ik me dat er ook een basisassemblagemodus nodig was. Dit implementeerde ik zo: wanneer er op de knop wordt gedrukt, wordt het object geselecteerd en de klik plaatst het op de gewenste plek. Knop 1 stelt me in staat om de baan te selecteren, terwijl knop 2 de speler kan selecteren.<\/p>\n<p>Maar het is ook belangrijk om te onthouden wat 1 en 2 betekenen, dus ik voegde een wireframe toe om te laten zien welk object is geselecteerd. Zo ziet dat eruit.<\/p>\n<p><img decoding=\"async\" alt=\"Spelen op Rust in 24 uur: persoonlijke ontwikkelervaring\" src=\"\/wp-content\/uploads\/2019\/03\/09b92828fb9b8d4bfa5d5178ca99613c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>Vragen over architectuur en refactoring<\/b><\/p>\n<p>Nu heb ik verschillende game-objecten: mensen, tennisbanen en verdiepingen. Maar om de wireframes te laten werken, moet ik elke objectentiteit vertellen of de objecten zich in een demomodus bevinden of dat het gewoon een frame is. Dit is niet erg handig.<\/p>\n<p>Het leek me nodig om de architectuur opnieuw te overdenken, zodat er enkele beperkingen naar voren komen:<\/p>\n<ul>\n<li>het bestaan van een entiteit die zichzelf weergeeft en bijwerkt, is een probleem, omdat deze entiteit niet kan \"weten\" wat ze moet renderen \u2014 afbeelding of wireframe;<\/li>\n<li>het ontbreken van een hulpmiddel om eigenschappen en gedrag uit te wisselen tussen afzonderlijke entiteiten (voorbeeld \u2014 eigenschap is_build_mode of het tekenen van gedrag). Je zou overerving kunnen gebruiken, hoewel er in Rust geen goede manier is om dit te implementeren. Wat ik echt nodig had, was compositie;<\/li>\n<li>een hulpmiddel om de interactie tussen entiteiten mogelijk te maken, was nodig om mensen aan de tennisbanen toe te wijzen;<\/li>\n<li>de entiteiten bestonden uit een mix van gegevens en logica, wat al snel buiten controle raakte.<\/li>\n<\/ul>\n<p><\/p>\n<blockquote><p><i>Ik heb verder onderzoek gedaan en ontdekte de architectuur <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Entity_component_system\">ECS \u2014 Entity Component System<\/a><\/noindex>, die doorgaans in games wordt gebruikt. Hier zijn de voordelen van ECS:<\/p>\n<ul>\n<li>gegevens zijn gescheiden van logica;<\/li>\n<li>compositie in plaats van overerving;<\/li>\n<li>een architectuur die op gegevens is gericht.<\/li>\n<\/ul>\n<p><\/i><\/p><\/blockquote>\n<p>\nECS heeft drie basale concepten:<\/p>\n<ul>\n<li>entiteiten \u2014 een type object waar een identificator naar verwijst (dit kan een speler, een bal of iets anders zijn);<\/li>\n<li>componenten \u2014 waaruit entiteiten bestaan. Voorbeeld \u2014 renderingcomponent, positionering en andere. Dit zijn gegevensopslagplaatsen;<\/li>\n<li>systemen \u2014 ze gebruiken zowel objecten als componenten, plus bevatten gedrag en logica die op deze gegevens zijn gebaseerd. Voorbeeld \u2014 een renderingsysteem dat door alle entiteiten met renderingscomponenten gaat en zich bezighoudt met de weergave.<\/li>\n<\/ul>\n<p>\nNa het bestuderen werd het duidelijk dat ECS de volgende problemen oplost:<\/p>\n<ul>\n<li>toepassing van compositie in plaats van overerving voor de systeemsorganisatie van entiteiten; <\/li>\n<li>ontsporing van rommelige code door beheersystemen; <\/li>\n<li>gebruik van methoden zoals is_build_mode om de logica van het wireframe op dezelfde plaats te bewaren \u2014 in het renderingsysteem.<\/li>\n<\/ul>\n<p>\nDit is wat eruit kwam na de implementatie van ECS.<\/p>\n<p><i>resources -&gt; dit is waar alle middelen zijn (afbeeldingen)<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; wereldfabriekfuncties<br \/>\n \u2014 main.rs -&gt; hoofdloop<\/i><\/p>\n<h3>We wijzen mensen toe aan de tennisbanen<\/h3>\n<p>\nECS heeft het leven gemakkelijker gemaakt. Nu had ik een systeem om gegevens aan entiteiten toe te voegen en logica op basis van deze gegevens toe te voegen. Dit stelde me in staat om de verdeling van mensen over de tennisbanen te organiseren.<\/p>\n<p>Wat ik heb gedaan:<\/p>\n<ul>\n<li>ik heb gegevens over toegewezen banen aan Person toegevoegd;<\/li>\n<li>ik heb gegevens over verdeelde mensen aan TennisCourt toegevoegd;<\/li>\n<li>ik heb CourtChoosingSystem toegevoegd, dat mensen en locaties analyseert, beschikbare banen ontdekt en spelers erop verdeelt;<\/li>\n<li>ik heb PersonMovementSystem toegevoegd, dat mensen zoekt die aan banen zijn toegewezen, en als ze daar niet zijn, ze naar de juiste locatie stuurt.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Spelen op Rust in 24 uur: persoonlijke ontwikkelervaring\" src=\"\/wp-content\/uploads\/2019\/03\/f2e4632de2cb9d1c3ec7c9d9310b8170.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <\/p>\n<h3>Laten we de balans opmaken<\/h3>\n<p>\nIk heb erg veel genoten van het werken aan dit eenvoudige spel. Bovendien ben ik blij dat ik Rust heb gebruikt om het te schrijven, omdat:<\/p>\n<ul>\n<li>Rust geeft je wat je nodig hebt;<\/li>\n<li>het heeft uitstekende documentatie, Rust is erg elegant;<\/li>\n<li>de stabiliteit is geweldig;<\/li>\n<li>je hoeft geen klonen, kopie\u00ebn of soortgelijke acties te ondernemen, wat ik vaak in C++ deed;<\/li>\n<li>Options zijn zeer handig om mee te werken, ze verwerken ook fouten perfect;<\/li>\n<li>als het project succesvol is gecompileerd, werkt het in 99% van de gevallen zoals het hoort. De foutmeldingen van de compiler zijn naar mijn mening de beste die ik heb gezien.<\/li>\n<\/ul>\n<p>\nGame-ontwikkeling in Rust staat nog in de kinderschoenen. Maar er is al een stabiele en redelijk grote community die werkt aan het toegankelijk maken van Rust voor iedereen. Daarom kijk ik optimistisch naar de toekomst van de taal, in afwachting van de resultaten van ons gezamenlijke werk.<\/p>\n<blockquote><p><b>Skillbox raadt aan:<\/b><\/p>\n<ul>\n<li>Online cursus <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\">\u00abBeroep frontend-developer\u00bb<\/a><\/noindex>.<\/li>\n<li>Praktische cursus <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\">\u2018Mobiele Ontwikkelaar PRO\u2019<\/a><\/noindex>.<\/li>\n<li>Praktische jaaropleiding <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\">\u2018PHP-developer van 0 tot PRO\u2019<\/a><\/noindex>.<\/li>\n<\/ul>\n<p>\n<\/p><\/blockquote>\n<p>Bron: <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\/nl\/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=\"nl_NL\" \/>\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\/nl\/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\udd47Spelen op Rust in 24 uur: persoonlijke ontwikkelervaring | ProHoster","description":"In dit artikel zal ik mijn persoonlijke ervaring beschrijven.","canonical_url":"https:\/\/prohoster.info\/nl\/blog\/igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nl_NL","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\/nl\/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\/nl\/wp-json\/wp\/v2\/posts\/29846","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/comments?post=29846"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/29846\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media?parent=29846"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/categories?post=29846"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/tags?post=29846"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}