{"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\/da\/blog\/igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki","title":{"rendered":"Spil p\u00e5 Rust p\u00e5 24 timer: personlig erfaring med udvikling","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Spil p\u00e5 Rust p\u00e5 24 timer: personlig erfaring med udvikling\" src=\"\/wp-content\/uploads\/2019\/03\/ea25406c43ac90ce2e33e290168d1083.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nI denne artikel vil jeg dele min personlige erfaring med at udvikle et lille spil p\u00e5 Rust. Det tog cirka 24 timer at skabe en fungerende version (prim\u00e6rt arbejdede jeg om aftenen eller i weekenden). Spillet er stadig langt fra f\u00e6rdigt, men jeg tror, at erfaringen vil v\u00e6re nyttig. Jeg vil fort\u00e6lle, hvad jeg har l\u00e6rt, og nogle observationer, jeg har gjort under opbygningen af spillet fra bunden.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<blockquote><p><b>Skillbox anbefaler:<\/b> To\u00e5rigt praktisk kursus <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\">\u00abJeg er webudvikler PRO\u00bb<\/a><\/noindex>.<\/p>\n<p><b>Vi minder om:<\/b> <i>til alle l\u00e6sere af 'Habr' \u2014 rabat p\u00e5 10.000 rubler ved tilmelding til et hvilket som helst Skillbox-kursus med rabatkoden 'Habr'.<\/i><\/p><\/blockquote>\n<p><\/p>\n<h3>Hvorfor Rust?<\/h3>\n<p>\nJeg valgte dette sprog, fordi jeg havde h\u00f8rt meget godt om det, og jeg kan se, at det bliver mere og mere popul\u00e6rt inden for spiludvikling. F\u00f8r jeg begyndte at skrive spillet, havde jeg en smule erfaring med at udvikle simple applikationer p\u00e5 Rust. Det var lige nok til at f\u00f8le en vis frihed under udviklingen af spillet.<\/p>\n<h3>Hvorfor netop et spil, og hvad for et spil?<\/h3>\n<p>\nAt skabe spil er sjovt! Jeg ville \u00f8nske, at der var flere grunde, men til \u00abhjemmeprojekter\u00bb v\u00e6lger jeg emner, der ikke er for t\u00e6t forbundet med mit s\u00e6dvanlige arbejde. Hvad for et spil? Jeg ville gerne lave noget i stil med en tennissimulator, hvor der kombineres Cities Skylines, Zoo Tycoon, Prison Architect og selvf\u00f8lgelig tennis. Samlet set blev det et spil om en tennisklub, hvor folk kommer for at spille.<\/p>\n<h3>Teknisk forberedelse<\/h3>\n<p>\nJeg ville gerne bruge Rust, men jeg vidste ikke pr\u00e6cis, hvor meget jeg skulle starte \u2018fra bunden\u2019. Jeg \u00f8nskede ikke at skrive pixel-shaders og bruge drag-n-drop, s\u00e5 jeg s\u00f8gte efter de mest fleksible l\u00f8sninger.<\/p>\n<p>Jeg fandt nyttige ressourcer, som jeg vil dele med dig:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/arewegameyet.com\/\">Are we game yet<\/a><\/noindex> \u2014 en liste over n\u00f8dvendige elementer til spiludvikling i 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>\nJeg har unders\u00f8gt flere Rust spillemotorer og valgte til sidst Piston og ggez. Jeg st\u00f8dte p\u00e5 dem, da jeg arbejdede p\u00e5 et tidligere projekt. Til sidst valgte jeg ggez, da det syntes mere passende til implementeringen af et lille 2D-spil. Den modul\u00e6re struktur af Piston er for kompleks til en ny udvikler (eller en, der arbejder med Rust for f\u00f8rste gang).<\/p>\n<h3>Spilstruktur<\/h3>\n<p>\nJeg brugte lidt tid p\u00e5 at overveje projektets arkitektur. F\u00f8rste skridt er at lave \u2018jorden\u2019, menneskerne og tennisbanerne. Folk skal bev\u00e6ge sig rundt p\u00e5 banerne og vente. Spillerne skal have f\u00e6rdigheder, der forbedres over tid. Desuden skal der v\u00e6re en editor, der tillader tilf\u00f8jelse af nye mennesker og baner, men det er ikke gratis.<\/p>\n<p>Efter at have gennemt\u00e6nkt alt, gik jeg i gang med arbejdet. <\/p>\n<h3>Oprettelse af spil<\/h3>\n<p>\n<b>Begyndelse: cirkler og abstraktioner<\/b><\/p>\n<p>Jeg tog et eksempel fra ggez og fik en cirkel p\u00e5 sk\u00e6rmen. Fantastisk! Nu lidt abstraktioner. Jeg syntes, det ville v\u00e6re godt at abstrahere fra ideen om et spilleobjekt. Hvert objekt skal rendres og opdateres som beskrevet her:<\/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>\nDenne kode gjorde det muligt for mig at f\u00e5 en fantastisk liste over objekter, som jeg kan opdatere og rendere i en lige s\u00e5 fantastisk loop.<\/p>\n<pre><code class=\"rust\">mpl event::EventHandler for MainState {\n    fn update(&amp;mut self, context: &amp;mut Context) -&gt; GameResult {\n        \/\/ Opdater alle objekter\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        \/\/ Tegn alle objekter\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 er n\u00f8dvendig, fordi den indeholder alle kodelinjer. Jeg brugte lidt tid p\u00e5 at opdele filer og optimere mappestrukturen. S\u00e5dan s\u00e5 alt ud efterf\u00f8lgende:<br \/>\n<i>resources -&gt; her er alle aktiverne (billeder)<br \/>\nsrc<br \/>\n \u2014 entities<br \/>\n \u2014 game_object.rs<br \/>\n \u2014 circle.rs<br \/>\n \u2014 main.rs -&gt; hovedl\u00f8kke<\/i><\/p>\n<p><b>Personer, etager og billeder<\/b><\/p>\n<p>N\u00e6ste skridt er at oprette spilleobjektet Person og indl\u00e6se billeder. Alt skal bygges p\u00e5 fliser, der er 32*32.<\/p>\n<p><img decoding=\"async\" alt=\"Spil p\u00e5 Rust p\u00e5 24 timer: personlig erfaring med udvikling\" src=\"\/wp-content\/uploads\/2019\/03\/265ed79e6784ef0180cfdc5aa8d96a4c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>Tennisbaner<\/b><\/p>\n<p>Efter at have studeret, hvordan tennisbaner ser ud, besluttede jeg at lave dem af fliser 4*2. Oprindeligt kunne man lave et billede af denne st\u00f8rrelse eller samle 8 separate fliser. Men senere inds\u00e5 jeg, at der kun var brug for to unikke fliser, og her er hvorfor.<\/p>\n<p>Vi har i alt to s\u00e5danne fliser: 1 og 2.<\/p>\n<p>Hver sektion af banen best\u00e5r af flise 1 eller flise 2. De kan v\u00e6re normalt placeret eller v\u00e6ltet 180 grader.<\/p>\n<p><img decoding=\"async\" alt=\"Spil p\u00e5 Rust p\u00e5 24 timer: personlig erfaring med udvikling\" src=\"\/wp-content\/uploads\/2019\/03\/90d07caea0dee8673ada5d44963ab347.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>Hovedbygningsmodellen (samlingen)<\/b><\/p>\n<p>Efter at have opn\u00e5et rendering af banerne, folkene og kortene, inds\u00e5 jeg, at jeg ogs\u00e5 havde brug for en grundl\u00e6ggende samlingsmode. Jeg implementerede det s\u00e5ledes: n\u00e5r knappen er trykket p\u00e5 - objektet er valgt, og klikker placerer det p\u00e5 det \u00f8nskede sted. S\u00e5 knap 1 giver mulighed for at v\u00e6lge banen, mens knap 2 tillader at v\u00e6lge spilleren.<\/p>\n<p>Men man skal ogs\u00e5 huske, hvad 1 og 2 betyder, derfor tilf\u00f8jede jeg et wireframe for at g\u00f8re det klart, hvilket objekt der er valgt. S\u00e5dan ser det ud.<\/p>\n<p><img decoding=\"async\" alt=\"Spil p\u00e5 Rust p\u00e5 24 timer: personlig erfaring med udvikling\" src=\"\/wp-content\/uploads\/2019\/03\/09b92828fb9b8d4bfa5d5178ca99613c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>Sp\u00f8rgsm\u00e5l om arkitektur og refactoring<\/b><\/p>\n<p>Nu har jeg flere spilelementer: mennesker, baner og etager. Men for at wireframes skal fungere, skal hver objekts entitet informeres om, hvorvidt selve objekterne er i demonstrationsmodus, eller om der blot er tegnet en ramme. Det er ikke s\u00e6rlig praktisk.<\/p>\n<p>Jeg syntes, det var n\u00f8dvendigt at gent\u00e6nke arkitekturen, s\u00e5 nogle begr\u00e6nsninger kunne fremh\u00e6ves:<\/p>\n<ul>\n<li>tilstedev\u00e6relsen af en entitet, der viser og opdaterer sig selv, er et problem, da denne entitet ikke kan 'vide', hvad den skal gengive - billede og wireframe;<\/li>\n<li>manglen p\u00e5 et v\u00e6rkt\u00f8j til at udveksle egenskaber og adf\u00e6rd mellem individuelle entiteter (f.eks. egenskaben is_build_mode eller gengivelse af adf\u00e6rd). Man kunne have brugt inheritance, selvom der ikke er nogen ordentlig m\u00e5de at implementere det p\u00e5 i Rust. Hvad jeg virkelig havde brug for, var sammens\u00e6tning;<\/li>\n<li>et v\u00e6rkt\u00f8j til at interagere mellem entiteter var n\u00f8dvendigt for at tildele mennesker til banerne;<\/li>\n<li>selve entiteterne var en blanding af data og logik, hvilket hurtigt kom ud af kontrol.<\/li>\n<\/ul>\n<p><\/p>\n<blockquote><p><i>Jeg foretog en yderligere unders\u00f8gelse og opdagede arkitekturen <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Entity_component_system\">ECS - Entity Component System<\/a><\/noindex>, som normalt anvendes i spil. Her er fordelene ved ECS:<\/p>\n<ul>\n<li>data er adskilt fra logik;<\/li>\n<li>komposition i stedet for arv;<\/li>\n<li>dataorienteret arkitektur.<\/li>\n<\/ul>\n<p><\/i><\/p><\/blockquote>\n<p>\nECS er kendetegnet ved tre grundl\u00e6ggende koncepter:<\/p>\n<ul>\n<li>entiteter - en type objekt, som en identifikator refererer til (det kan v\u00e6re en spiller, en bold eller noget andet);<\/li>\n<li>komponenter - som entiteterne best\u00e5r af. Eksempel - en rendering komponent, placering, og andre. Dette er datalagre;<\/li>\n<li>systemer - de bruger b\u00e5de objekter og komponenter, plus indeholder adf\u00e6rd og logik baseret p\u00e5 disse data. Eksempel - et renderingssystem, der itererer over alle entiteter med komponenter til rendering og h\u00e5ndterer gengivelsen.<\/li>\n<\/ul>\n<p>\nEfter unders\u00f8gelsen blev det klart, at ECS l\u00f8ser s\u00e5danne problemer:<\/p>\n<ul>\n<li>anvendelsen af komposition i stedet for arv til systematisk organisering af entiteter; <\/li>\n<li>fjernelse af kodekaos ved hj\u00e6lp af kontrolsystemer; <\/li>\n<li>brug af metoder som is_build_mode til at opbevare logikken for wireframe p\u00e5 \u00e9t sted - i renderingssystemet.<\/li>\n<\/ul>\n<p>\nHer er, hvad der kom ud af implementeringen af ECS.<\/p>\n<p><i>resources -&gt; her er alle aktiverne (billeder)<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; verdens fabriksfunktioner<br \/>\n \u2014 main.rs -&gt; hovedl\u00f8kke<\/i><\/p>\n<h3>Tildeler folk til banerne<\/h3>\n<p>\nECS har gjort livet nemmere. Nu havde jeg en systematisk m\u00e5de at tilf\u00f8je data til enhederne og tilf\u00f8je logik baseret p\u00e5 disse data. Dette gjorde det muligt at organisere fordelingen af folk til banerne.<\/p>\n<p>Hvad jeg har gjort:<\/p>\n<ul>\n<li>tilf\u00f8jet data om tildelte baner til Person;<\/li>\n<li>tilf\u00f8jet data om fordelte personer til TennisCourt;<\/li>\n<li>tilf\u00f8jet CourtChoosingSystem, der analyserer folk og steder, opdager ledige baner og fordeler spillere til dem;<\/li>\n<li>tilf\u00f8jet PersonMovementSystem, der leder efter personer, der er tildelt til banerne, og hvis de ikke er der, sender folk derhen, hvor de skal v\u00e6re.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Spil p\u00e5 Rust p\u00e5 24 timer: personlig erfaring med udvikling\" src=\"\/wp-content\/uploads\/2019\/03\/f2e4632de2cb9d1c3ec7c9d9310b8170.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <\/p>\n<h3>Sammenfatning<\/h3>\n<p>\nJeg n\u00f8d virkelig at arbejde p\u00e5 dette enkle spil. Desuden er jeg glad for, at jeg brugte Rust til at skrive det, fordi:<\/p>\n<ul>\n<li>Rust giver dig det, du har brug for;<\/li>\n<li>den har fremragende dokumentation, Rust er meget elegant;<\/li>\n<li>konstanten er fantastisk;<\/li>\n<li>jeg beh\u00f8ver ikke at ty til kloning, kopiering eller lignende handlinger, som jeg ofte gjorde i C++;<\/li>\n<li>Options er meget praktiske at arbejde med, de h\u00e5ndterer ogs\u00e5 fejl fremragende;<\/li>\n<li>hvis projektet kunne kompilere, s\u00e5 fungerer det i 99%, og pr\u00e6cis som det skal. Kompilationsfejlmeddelelserne er efter min mening de bedste, jeg har set.<\/li>\n<\/ul>\n<p>\nSpiludvikling p\u00e5 Rust er kun lige begyndt. Men der er allerede et stabilt og ret stort f\u00e6llesskab, der arbejder p\u00e5 at g\u00f8re Rust tilg\u00e6ngelig for alle. Derfor ser jeg optimistisk p\u00e5 fremtiden for sproget og ser frem til resultaterne af vores f\u00e6lles arbejde.<\/p>\n<blockquote><p><b>Skillbox anbefaler:<\/b><\/p>\n<ul>\n<li>Online kursus <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\">\u00abFrontend Developer Profession\u00bb<\/a><\/noindex>.<\/li>\n<li>Praktisk kursus <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\">\u00abMobil udvikler PRO\u00bb<\/a><\/noindex>.<\/li>\n<li>Praktisk \u00e5rs kursus <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-udvikler fra 0 til PRO\"<\/a><\/noindex>.<\/li>\n<\/ul>\n<p>\n<\/p><\/blockquote>\n<p>Kilde: <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\/da\/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=\"da_DK\" \/>\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\/da\/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\udd47Spil p\u00e5 Rust p\u00e5 24 timer: personlig udviklingserfaring | ProHoster","description":"I denne artikel vil jeg dele min personlige erfaring.","canonical_url":"https:\/\/prohoster.info\/da\/blog\/igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/29846","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=29846"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/29846\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=29846"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=29846"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=29846"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}