{"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\/sv\/blog\/igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki","title":{"rendered":"Spelande i Rust p\u00e5 24 timmar: personlig erfarenhet av utveckling","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Spelande i Rust p\u00e5 24 timmar: personlig erfarenhet av utveckling\" src=\"\/wp-content\/uploads\/2019\/03\/ea25406c43ac90ce2e33e290168d1083.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nI den h\u00e4r artikeln kommer jag att ber\u00e4tta om min personliga erfarenhet av att utveckla ett litet spel i Rust. Det tog ungef\u00e4r 24 timmar att skapa en fungerande version (f\u00f6r det mesta arbetade jag p\u00e5 kv\u00e4llar eller helger). Spelet \u00e4r fortfarande l\u00e5ngt ifr\u00e5n klart, men jag tror att erfarenheten kommer att vara anv\u00e4ndbar. Jag kommer att dela med mig av vad jag har l\u00e4rt mig och n\u00e5gra observationer som jag har gjort under byggandet av spelet fr\u00e5n grunden.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<blockquote><p><b>Skillbox rekommenderar:<\/b> Tv\u00e5\u00e5rig praktisk kurs <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\">\u201eJag \u00e4r en PRO webbutvecklare\u201c<\/a><\/noindex>.<\/p>\n<p><b>P\u00e5minnelse:<\/b> <i>f\u00f6r alla l\u00e4sare av \"Habr\" \u2014 10 000 rubel rabatt vid registrering f\u00f6r vilken kurs som helst p\u00e5 Skillbox med rabattkoden \"Habr\".<\/i><\/p><\/blockquote>\n<p><\/p>\n<h3>Varf\u00f6r Rust?<\/h3>\n<p>\nJag valde detta spr\u00e5k eftersom jag har h\u00f6rt mycket bra om det och ser att det blir alltmer popul\u00e4rt inom spelutveckling. Innan jag skrev spelet hade jag lite erfarenhet av att utveckla enkla program i Rust. Det var precis tillr\u00e4ckligt f\u00f6r att k\u00e4nna en viss frihet n\u00e4r jag skrev spelet.<\/p>\n<h3>Varf\u00f6r just spel och vilket spel?<\/h3>\n<p>\nAtt skapa spel \u00e4r roligt! Jag skulle vilja ha fler sk\u00e4l, men f\u00f6r \u201ehemma\u201c projekt v\u00e4ljer jag \u00e4mnen som inte \u00e4r f\u00f6r n\u00e4ra kopplade till mitt vanliga arbete. Vilket spel? Jag ville g\u00f6ra n\u00e5got som en tennissimulator d\u00e4r Cities Skylines, Zoo Tycoon, Prison Architect och egen tennis blandas. I allm\u00e4nhet blev det ett spel om en tennisklubb d\u00e4r m\u00e4nniskor kommer f\u00f6r att spela.<\/p>\n<h3>Teknisk f\u00f6rberedelse<\/h3>\n<p>\nJag ville anv\u00e4nda Rust, men jag visste inte exakt hur mycket jag beh\u00f6vde b\u00f6rja fr\u00e5n \u201egrunden\u201c. Jag ville inte skriva pixel-shaders eller anv\u00e4nda drag-n-drop, s\u00e5 jag letade efter de mest flexibla l\u00f6sningarna.<\/p>\n<p>Jag har hittat anv\u00e4ndbara resurser som jag delar med er:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/arewegameyet.com\/\">Are we game yet<\/a><\/noindex> \u2014 en lista \u00f6ver n\u00f6dv\u00e4ndiga Rust-element f\u00f6r spelutveckling;<\/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 pixelkonst.<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nJag studerade flera Rust-spelmotorer och valde till slut Piston och ggez. Jag hade st\u00f6tt p\u00e5 dem n\u00e4r jag arbetade med mitt tidigare projekt. I slut\u00e4ndan valde jag ggez eftersom det verkade mer l\u00e4mpligt f\u00f6r att skapa ett litet 2D-spel. Den modul\u00e4ra strukturen i Piston \u00e4r f\u00f6r komplicerad f\u00f6r en nyb\u00f6rjare (eller n\u00e5gon som arbetar med Rust f\u00f6r f\u00f6rsta g\u00e5ngen).<\/p>\n<h3>Spelstruktur<\/h3>\n<p>\nJag spenderade lite tid p\u00e5 att t\u00e4nka p\u00e5 projektets arkitektur. Det f\u00f6rsta steget \u00e4r att g\u00f6ra \"jorden\", m\u00e4nniskor och tennisbanor. M\u00e4nniskor ska kunna r\u00f6ra sig p\u00e5 banorna och v\u00e4nta. Spelarna ska ha f\u00e4rdigheter som f\u00f6rb\u00e4ttras \u00f6ver tid. Dessutom m\u00e5ste det finnas en redakt\u00f6r som g\u00f6r det m\u00f6jligt att l\u00e4gga till nya m\u00e4nniskor och banor, men det \u00e4r inte gratis.<\/p>\n<p>Efter att ha \u00f6verv\u00e4gt allt b\u00f6rjade jag arbeta. <\/p>\n<h3>Skapande av spel<\/h3>\n<p>\n<b>Inledning: cirklar och abstraktioner<\/b><\/p>\n<p>Jag tog ett exempel fr\u00e5n ggez och fick en cirkel p\u00e5 sk\u00e4rmen. Fantastiskt! Nu lite abstraktioner. Jag k\u00e4nde att det var bra att abstrahera fr\u00e5n id\u00e9n om ett spelobjekt. Varje objekt m\u00e5ste renderas och uppdateras som anges h\u00e4r:<\/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>\nDenna kodsnutt gjorde att jag fick en fantastisk lista \u00f6ver objekt som jag kan uppdatera och rendera i en lika fantastisk loop.<\/p>\n<pre><code class=\"rust\">mpl event::EventHandler f\u00f6r MainState {\n    fn update(&amp;mut self, context: &amp;mut Context) -&gt; GameResult {\n        \/\/ Uppdatera alla objekt\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        \/\/ Rita alla objekt\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 \u00e4r n\u00f6dv\u00e4ndig eftersom den inneh\u00e5ller alla kodrader. Jag la ner lite tid p\u00e5 att dela upp filerna och optimera mappstrukturen. S\u00e5 h\u00e4r ser allt ut efter detta:<br \/>\n<i>resources -&gt; h\u00e4r finns alla tillg\u00e5ngar (bilder)<br \/>\nsrc<br \/>\n \u2014 entities<br \/>\n \u2014 game_object.rs<br \/>\n \u2014 circle.rs<br \/>\n \u2014 main.rs -&gt; huvudloop<\/i><\/p>\n<p><b>M\u00e4nniskor, banor och bilder<\/b><\/p>\n<p>N\u00e4sta steg \u00e4r att skapa spelobjektet Person och ladda bilder. Allt ska byggas p\u00e5 grundval av brickor som \u00e4r 32*32.<\/p>\n<p><img decoding=\"async\" alt=\"Spelande i Rust p\u00e5 24 timmar: personlig erfarenhet av utveckling\" src=\"\/wp-content\/uploads\/2019\/03\/265ed79e6784ef0180cfdc5aa8d96a4c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>Tennisbanor<\/b><\/p>\n<p>Efter att ha studerat hur tennisbanor ser ut best\u00e4mde jag mig f\u00f6r att g\u00f6ra dem av 4*2-brickor. Inledningsvis kunde jag antingen skapa en bild av denna storlek eller sammanfoga 8 separata brickor. Men senare ins\u00e5g jag att det bara beh\u00f6vdes tv\u00e5 unika brickor, och h\u00e4r \u00e4r varf\u00f6r.<\/p>\n<p>Vi har totalt tv\u00e5 s\u00e5dana brickor: 1 och 2.<\/p>\n<p>Varje sektion av banan best\u00e5r av antingen bricka 1 eller bricka 2. De kan placeras som vanligt eller v\u00e4ndas 180 grader.<\/p>\n<p><img decoding=\"async\" alt=\"Spelande i Rust p\u00e5 24 timmar: personlig erfarenhet av utveckling\" src=\"\/wp-content\/uploads\/2019\/03\/90d07caea0dee8673ada5d44963ab347.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>Huvudbyggnadsl\u00e4get (sammanst\u00e4llning)<\/b><\/p>\n<p>N\u00e4r jag lyckades f\u00e5 till rendering av banor, m\u00e4nniskor och kartor ins\u00e5g jag att jag ocks\u00e5 beh\u00f6vde ett grundl\u00e4ggande byggl\u00e4gen. Jag implementerade det s\u00e5 h\u00e4r: n\u00e4r en knapp trycks ned v\u00e4ljs ett objekt, och ett klick placerar det p\u00e5 \u00f6nskad plats. S\u00e5, knapp 1 l\u00e5ter mig v\u00e4lja en bana, medan knapp 2 l\u00e5ter mig v\u00e4lja en spelare.<\/p>\n<p>Men vi m\u00e5ste ocks\u00e5 komma ih\u00e5g vad 1 och 2 betyder, s\u00e5 jag lade till en wireframe f\u00f6r att g\u00f6ra det tydligt vilket objekt som var valt. S\u00e5 h\u00e4r ser det ut.<\/p>\n<p><img decoding=\"async\" alt=\"Spelande i Rust p\u00e5 24 timmar: personlig erfarenhet av utveckling\" src=\"\/wp-content\/uploads\/2019\/03\/09b92828fb9b8d4bfa5d5178ca99613c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>Fr\u00e5gor om arkitektur och refaktorering<\/b><\/p>\n<p>Nu har jag n\u00e5gra spelobjekt: m\u00e4nniskor, tennisplaner och v\u00e5ningar. Men f\u00f6r att wireframes ska fungera m\u00e5ste varje objekts enhet informeras om huruvida sj\u00e4lva objekten \u00e4r i demonstrationsl\u00e4ge eller bara har en ritad ram. Det \u00e4r inte s\u00e4rskilt praktiskt.<\/p>\n<p>Jag tyckte att det var n\u00f6dv\u00e4ndigt att ompr\u00f6va arkitekturen s\u00e5 att vissa begr\u00e4nsningar framtr\u00e4dde:<\/p>\n<ul>\n<li>N\u00e4rvaron av en enhet som visar och uppdaterar sig sj\u00e4lv \u00e4r ett problem, eftersom den enheten inte kan \"veta\" vad den ska rendera \u2013 bild och wireframe;<\/li>\n<li>Det finns en brist p\u00e5 ett verktyg f\u00f6r att utbyta egenskaper och beteenden mellan separata enheter (exempel - egenskapen is_build_mode eller renderingbeteenden). Man skulle kunna anv\u00e4nda arv, men i Rust finns det inget bra s\u00e4tt att implementera detta. Vad jag verkligen beh\u00f6vde var komposition;<\/li>\n<li>Ett verktyg f\u00f6r att interagera mellan enheterna var n\u00f6dv\u00e4ndigt f\u00f6r att tilldela m\u00e4nniskor till tennisplaner;<\/li>\n<li>Sj\u00e4lva enheterna var en blandning av data och logik, vilket snabbt blev o\u00f6versk\u00e5dligt.<\/li>\n<\/ul>\n<p><\/p>\n<blockquote><p><i>Jag genomf\u00f6rde en ytterligare studie och uppt\u00e4ckte arkitekturen <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Entity_component_system\">ECS \u2013 Entity Component System<\/a><\/noindex>, som vanligtvis anv\u00e4nds i spel. H\u00e4r \u00e4r f\u00f6rdelarna med ECS:<\/p>\n<ul>\n<li>Data \u00e4r separerade fr\u00e5n logik;<\/li>\n<li>Komposition ist\u00e4llet f\u00f6r arv;<\/li>\n<li>Dataorienterad arkitektur.<\/li>\n<\/ul>\n<p><\/i><\/p><\/blockquote>\n<p>\nECS k\u00e4nnetecknas av tre grundl\u00e4ggande koncept:<\/p>\n<ul>\n<li>Enheter \u2013 en typ av objekt som refereras av en identifierare (det kan vara en spelare, en boll eller n\u00e5got annat);<\/li>\n<li>Komponenter \u2013 dessa utg\u00f6r enheterna. Exempel - renderingkomponent, positionskomponent och andra. Dessa \u00e4r datalagringsutrymmen;<\/li>\n<li>System \u2013 de anv\u00e4nder b\u00e5de objekt och komponenter, samt inneh\u00e5ller beteende och logik baserat p\u00e5 dessa data. Exempel - rendering system som g\u00e5r igenom alla enheter med komponenter f\u00f6r rendering och hanterar ritningen.<\/li>\n<\/ul>\n<p>\nEfter studien blev det klart att ECS l\u00f6ser s\u00e5dana problem:<\/p>\n<ul>\n<li>Anv\u00e4ndning av komposition ist\u00e4llet f\u00f6r arv f\u00f6r systematisk organisering av enheter; <\/li>\n<li>Bli av med kodpackningen genom system f\u00f6r hantering; <\/li>\n<li>Anv\u00e4ndning av metoder som is_build_mode f\u00f6r att lagra wireframe-logiken p\u00e5 samma st\u00e4lle - i rendering systemet.<\/li>\n<\/ul>\n<p>\nH\u00e4r \u00e4r vad som kom ut efter implementeringen av ECS.<\/p>\n<p><i>resources -&gt; h\u00e4r finns alla tillg\u00e5ngar (bilder)<br \/>\nsrc<br \/>\n \u2014 komponenter<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 resurser<br \/>\n \u2014 mouse.rs<br \/>\n \u2014 system<br \/>\n \u2014 rendering.rs<br \/>\n \u2014 constants.rs<br \/>\n \u2014 utils.rs<br \/>\n \u2014 world_factory.rs -&gt; v\u00e4rldsfabriksfunktioner<br \/>\n \u2014 main.rs -&gt; huvudloop<\/i><\/p>\n<h3>Vi tilldelar personer till tennisbanor<\/h3>\n<p>\nECS har gjort livet enklare. Nu har jag ett systematiskt s\u00e4tt att l\u00e4gga till data till entiteter och l\u00e4gga till logik baserad p\u00e5 dessa data. Detta har i sin tur m\u00f6jliggjort att organisera f\u00f6rdelningen av m\u00e4nniskor p\u00e5 tennisbanorna.<\/p>\n<p>Vad jag gjorde:<\/p>\n<ul>\n<li>lade till data om tilldelade banor i Person;<\/li>\n<li>lade till data om de f\u00f6rdelade personerna i TennisCourt;<\/li>\n<li>lade till CourtChoosingSystem, som g\u00f6r det m\u00f6jligt att analysera m\u00e4nniskor och anl\u00e4ggningar, uppt\u00e4cka tillg\u00e4ngliga banor och f\u00f6rdela spelare p\u00e5 dem;<\/li>\n<li>lade till PersonMovementSystem, som letar efter personer som \u00e4r tilldelade banorna, och om de inte \u00e4r d\u00e4r, skickar folk dit de beh\u00f6vs.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Spelande i Rust p\u00e5 24 timmar: personlig erfarenhet av utveckling\" src=\"\/wp-content\/uploads\/2019\/03\/f2e4632de2cb9d1c3ec7c9d9310b8170.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <\/p>\n<h3>Sammanfattning<\/h3>\n<p>\nJag gillade verkligen att arbeta med detta enkla spel. Dessutom \u00e4r jag n\u00f6jd med att jag anv\u00e4nde Rust f\u00f6r att skriva det, eftersom:<\/p>\n<ul>\n<li>Rust ger dig det du beh\u00f6ver;<\/li>\n<li>det har utm\u00e4rkt dokumentation, Rust \u00e4r mycket elegant;<\/li>\n<li>konstans \u00e4r coolt;<\/li>\n<li>jag beh\u00f6ver inte f\u00f6rlita mig p\u00e5 kloning, kopiering eller liknande \u00e5tg\u00e4rder, vilket jag ofta gjorde i C++;<\/li>\n<li>Options \u00e4r v\u00e4ldigt anv\u00e4ndarv\u00e4nliga, de hanterar ocks\u00e5 fel bra;<\/li>\n<li>om projektet lyckas kompilera, fungerar det i 99% av fallen precis som det ska. Jag tycker att kompilatorns felmeddelanden \u00e4r de b\u00e4sta jag sett.<\/li>\n<\/ul>\n<p>\nSpelutveckling med Rust \u00e4r i sitt begynnelsefas. Men det finns redan ett stabilt och ganska stort community som arbetar f\u00f6r att g\u00f6ra Rust tillg\u00e4ngligt f\u00f6r alla. D\u00e4rf\u00f6r ser jag med optimism p\u00e5 spr\u00e5kets framtid, ivrigt v\u00e4ntande p\u00e5 resultaten av v\u00e5rt gemensamma arbete.<\/p>\n<blockquote><p><b>Skillbox rekommenderar:<\/b><\/p>\n<ul>\n<li>Onlinekurs <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\">\u00abYrket frontendutvecklare\u00bb<\/a><\/noindex>.<\/li>\n<li>Praktisk kurs <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\">\u00abMobilutvecklare PRO\u00bb<\/a><\/noindex>.<\/li>\n<li>Praktisk \u00e5rskurs <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\">PHP-utvecklare fr\u00e5n grunden till PRO<\/a><\/noindex>.<\/li>\n<\/ul>\n<p>\n<\/p><\/blockquote>\n<p>K\u00e4lla: <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.4 - 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\/sv\/blog\/igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\/sv\/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\udd47Spela p\u00e5 Rust p\u00e5 24 timmar: personlig utvecklingserfarenhet | ProHoster","description":"I denna artikel kommer jag att ber\u00e4tta om mina personliga erfarenheter.","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/29846","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=29846"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/29846\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=29846"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=29846"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=29846"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}