{"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\/no\/blog\/igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki","title":{"rendered":"Spill p\u00e5 Rust p\u00e5 24 timer: personlig utviklingserfaring","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Spill p\u00e5 Rust p\u00e5 24 timer: personlig utviklingserfaring\" src=\"\/wp-content\/uploads\/2019\/03\/ea25406c43ac90ce2e33e290168d1083.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nI denne artikkelen vil jeg dele min personlige erfaring med utviklingen av et lite spill i Rust. Det tok omtrent 24 timer \u00e5 lage en fungerende versjon (jeg jobbet hovedsakelig om kveldene eller i helgene). Spillet er fortsatt langt fra ferdig, men jeg mener erfaringen vil v\u00e6re nyttig. Jeg vil fortelle hva jeg har l\u00e6rt og om noen observasjoner jeg har gjort mens jeg bygde spillet fra bunnen av.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<blockquote><p><b>Skillbox anbefaler:<\/b> To\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\">\u00abJeg er PRO webutvikler\u00bb<\/a><\/noindex>.<\/p>\n<p><b>Vi minner om:<\/b> <i>for alle lesere av \u00abHabr\u00bb \u2014 10 000 rubler rabatt ved p\u00e5melding til hvilket som helst Skillbox-kurs med kampanjekoden \u00abHabr\u00bb.<\/i><\/p><\/blockquote>\n<p><\/p>\n<h3>Hvorfor Rust?<\/h3>\n<p>\nJeg valgte dette spr\u00e5ket fordi jeg har h\u00f8rt mye positivt om det og ser at det blir stadig mer popul\u00e6rt innen spillutvikling. F\u00f8r jeg begynte med spillet, hadde jeg noe erfaring med \u00e5 utvikle enkle applikasjoner i Rust. Dette var akkurat nok til \u00e5 f\u00f8le en viss frihet mens jeg skrev spillet.<\/p>\n<h3>Hvorfor spill og hvilket spill?<\/h3>\n<p>\n\u00c5 lage spill er g\u00f8y! Jeg skulle \u00f8nske det var flere grunner, men for \u00abhjemme\u00bb prosjekter velger jeg temaer som ikke er alltf\u00f6r n\u00e6rt knyttet til min vanlige jobb. Hvilket spill? Jeg \u00f8nsket \u00e5 lage noe som lignet p\u00e5 en tennissimulator, hvor Cities Skylines, Zoo Tycoon, Prison Architect og selve tennis blandes. Totalt sett ble det et spill om en tennisskole der folk kommer for \u00e5 spille.<\/p>\n<h3>Teknisk forberedelse<\/h3>\n<p>\nJeg \u00f8nsket \u00e5 bruke Rust, men jeg visste ikke n\u00f8yaktig hvor mye jeg m\u00e5tte begynne fra \u00abbunnen\u00bb av. Jeg ville ikke skrive pikselshadere eller bruke dra-og-slipp, s\u00e5 jeg lette etter de mest fleksible l\u00f8sningene.<\/p>\n<p>Jeg fant nyttige ressurser som jeg deler med deg:<\/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 for spillutvikling 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 pikselkunst.<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nJeg utforsket flere spillmotorer i Rust og endte til slutt opp med Piston og ggez. Jeg hadde st\u00f8tt p\u00e5 dem da jeg jobbet med et tidligere prosjekt. Til slutt valgte jeg ggez fordi det virket mer passende for \u00e5 lage et lite 2D-spill. Den modul\u00e6re strukturen i Piston er for komplisert for en nybegynner (eller for de som jobber med Rust for f\u00f8rste gang).<\/p>\n<h3>Spillstrukturen<\/h3>\n<p>\nJeg brukte litt tid p\u00e5 \u00e5 tenke over prosjektets arkitektur. Det f\u00f8rste steget er \u00e5 lage \u00abjorden\u00bb, folk og tennisbaner. Folk skal bevege seg rundt p\u00e5 banene og vente. Spillerne skal ha ferdigheter som forbedres over tid. I tillegg b\u00f8r det v\u00e6re en redakt\u00f8r som lar deg legge til nye folk og baner, men det er ikke gratis.<\/p>\n<p>Etter \u00e5 ha tenkt over alt, begynte jeg arbeidet. <\/p>\n<h3>Spilling av spillet<\/h3>\n<p>\n<b>Start: sirkler og abstraksjoner<\/b><\/p>\n<p>Jeg tok et eksempel fra ggez og fikk en sirkel p\u00e5 skjermen. Fantastisk! N\u00e5 litt abstraksjoner. Jeg mente det var en god id\u00e9 \u00e5 abstrahere fra tanken om et spillobjekt. Hvert objekt m\u00e5 bli gjengitt og oppdatert, som angitt 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 koden ga meg en flott liste over objekter jeg kan oppdatere og gjengi i en minst like flott l\u00f8kke.<\/p>\n<pre><code class=\"rust\">mpl event::EventHandler for MainState {\n    fn update(&amp;mut self, context: &amp;mut Context) -&gt; GameResult {\n        \/\/ Oppdater 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 det inneholder alle kodebitene. Jeg brukte litt tid p\u00e5 \u00e5 dele opp filene og optimalisere mappestrukturen. Her er hvordan alt s\u00e5 ut etter dette:<br \/>\n<i>resources -&gt; dette er hvor alle ressursene er (bilder)<br \/>\nsrc<br \/>\n \u2014 enheter<br \/>\n \u2014 game_object.rs<br \/>\n \u2014 circle.rs<br \/>\n \u2014 main.rs -&gt; hovedl\u00f8kken<\/i><\/p>\n<p><b>Mennesker, baner og bilder<\/b><\/p>\n<p>Neste steg er \u00e5 lage spillobjektet Person og laste opp bilder. Alt m\u00e5 bygges p\u00e5 32*32 fliser.<\/p>\n<p><img decoding=\"async\" alt=\"Spill p\u00e5 Rust p\u00e5 24 timer: personlig utviklingserfaring\" src=\"\/wp-content\/uploads\/2019\/03\/265ed79e6784ef0180cfdc5aa8d96a4c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>Tennisbaner<\/b><\/p>\n<p>Etter \u00e5 ha sett hvordan tennisbaner ser ut, bestemte jeg meg for \u00e5 lage dem med 4*2 fliser. Jeg kunne opprinnelig lage et bilde av den st\u00f8rrelsen eller sette sammen 8 separate fliser. Men s\u00e5 inns\u00e5 jeg at bare to unike fliser er n\u00f8dvendige, og her er hvorfor.<\/p>\n<p>Vi har totalt to slike fliser: 1 og 2.<\/p>\n<p>Hver seksjon av banen best\u00e5r av flis 1 eller flis 2. De kan plasseres vanlig eller v\u00e6re snudd 180 grader.<\/p>\n<p><img decoding=\"async\" alt=\"Spill p\u00e5 Rust p\u00e5 24 timer: personlig utviklingserfaring\" src=\"\/wp-content\/uploads\/2019\/03\/90d07caea0dee8673ada5d44963ab347.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>Grunnleggende bygge-modus<\/b><\/p>\n<p>Etter \u00e5 ha f\u00e5tt til gjengivelsen av baner, mennesker og kart, forstod jeg at vi ogs\u00e5 trenger en grunnleggende byggemodus. Jeg implementerte det slik: n\u00e5r knappen trykkes, blir objektet valgt, og et klikk plasserer det p\u00e5 riktig sted. Dermed lar knapp 1 oss velge banen, mens knapp 2 lar oss velge spilleren.<\/p>\n<p>Men vi m\u00e5 ogs\u00e5 huske hva 1 og 2 betyr, s\u00e5 jeg la til et wireframe for \u00e5 vise hvilket objekt som er valgt. Slik ser det ut.<\/p>\n<p><img decoding=\"async\" alt=\"Spill p\u00e5 Rust p\u00e5 24 timer: personlig utviklingserfaring\" src=\"\/wp-content\/uploads\/2019\/03\/09b92828fb9b8d4bfa5d5178ca99613c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>Sp\u00f8rsm\u00e5l om arkitektur og refaktorering<\/b><\/p>\n<p>N\u00e5 har jeg flere spillobjekter: mennesker, baner og etasjer. Men for at rammeverkene skal fungere, m\u00e5 hver objekt enhet informere om de selv er i demonstrasjonsmodus eller om det bare er et rammeverk tegnet. Det er ikke veldig praktisk.<\/p>\n<p>Jeg f\u00f8lte at det var n\u00f8dvendig \u00e5 revurdere arkitekturen slik at noen begrensninger ble avsl\u00f8rt:<\/p>\n<ul>\n<li>tilstedev\u00e6relsen av en enhet som viser og oppdaterer seg selv er et problem, siden denne enheten ikke vil kunne \u00abvite\u00bb hva den skal rendere \u2014 bilde og rammeverk;<\/li>\n<li>mangel p\u00e5 et verkt\u00f8y for utveksling av egenskaper og atferd mellom separate enheter (for eksempel egenskapen is_build_mode eller rendering av atferd). Man kunne ha brukt arv, selv om Rust ikke har en ordentlig m\u00e5te \u00e5 implementere det p\u00e5. Det jeg virkelig trengte var komposisjon;<\/li>\n<li>et verkt\u00f8y for interaksjon mellom enheter var n\u00f8dvendig for \u00e5 tilordne mennesker til baner;<\/li>\n<li>selve enhetene bestod av en blanding av data og logikk, noe som raskt kom ut av kontroll.<\/li>\n<\/ul>\n<p><\/p>\n<blockquote><p><i>Jeg gjorde en ekstra studie og oppdaget arkitekturen <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Entity_component_system\">ECS \u2014 Entity Component System<\/a><\/noindex>, som vanligvis brukes i spill. Her er fordelene med ECS:<\/p>\n<ul>\n<li>data er adskilt fra logikk;<\/li>\n<li>komposisjon i stedet for arv;<\/li>\n<li>dataorientert arkitektur.<\/li>\n<\/ul>\n<p><\/i><\/p><\/blockquote>\n<p>\nFor ECS er tre grunnleggende konsepter karakteristiske:<\/p>\n<ul>\n<li>enheter \u2014 en type objekt som henvises til av en identifikator (dette kan v\u00e6re en spiller, en ball, eller noe annet);<\/li>\n<li>komponenter \u2014 de som enhetene best\u00e5r av. For eksempel \u2014 renderingskomponent, plassering og andre. Dette er datalagre;<\/li>\n<li>systemer \u2014 de bruker b\u00e5de objektene og komponentene, og inneholder atferd og logikk som er basert p\u00e5 disse dataene. For eksempel \u2014 et renderingssystem som g\u00e5r gjennom alle enheter med komponenter for rendering og h\u00e5ndterer tegning.<\/li>\n<\/ul>\n<p>\nEtter studien ble det klart at ECS l\u00f8ser slike problemer:<\/p>\n<ul>\n<li>bruk av komposisjon i stedet for arv for systematisk organisering av enheter; <\/li>\n<li>fjerning av kodehermetikk gjennom styringssystemer; <\/li>\n<li>bruk av metoder som is_build_mode for \u00e5 lagre rammeverkatferd p\u00e5 ett og samme sted - i renderingssystemet.<\/li>\n<\/ul>\n<p>\nSlik ble det etter implementeringen av ECS.<\/p>\n<p><i>resources -&gt; dette er hvor alle ressursene er (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 ressurser<br \/>\n \u2014 mouse.rs<br \/>\n \u2014 systemer<br \/>\n \u2014 rendering.rs<br \/>\n \u2014 constants.rs<br \/>\n \u2014 utils.rs<br \/>\n \u2014 world_factory.rs -&gt; world factory functions<br \/>\n \u2014 main.rs -&gt; hovedl\u00f8kken<\/i><\/p>\n<h3>Vi har tildelt folk til banene<\/h3>\n<p>\nECS har gjort livet enklere. N\u00e5 hadde jeg en systemisk m\u00e5te \u00e5 legge til data til enheter og legge til logikk basert p\u00e5 disse dataene. Dette har igjen gjort det mulig \u00e5 organisere tildelingen av folk til banene.<\/p>\n<p>Hva jeg gjorde:<\/p>\n<ul>\n<li>la til data om tildelte baner i Person;<\/li>\n<li>la til data om fordelte personer i TennisCourt;<\/li>\n<li>la til CourtChoosingSystem som lar analysere folk og fasiliteter, oppdage tilgjengelige baner og fordele spillere til dem;<\/li>\n<li>la til PersonMovementSystem som finner personer tildelt til banene, og hvis de ikke er der, sender dem dit de trenger \u00e5 v\u00e6re.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Spill p\u00e5 Rust p\u00e5 24 timer: personlig utviklingserfaring\" src=\"\/wp-content\/uploads\/2019\/03\/f2e4632de2cb9d1c3ec7c9d9310b8170.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <\/p>\n<h3>Oppsummering<\/h3>\n<p>\nJeg likte veldig godt \u00e5 jobbe med dette enkle spillet. Dessuten er jeg forn\u00f8yd med at jeg brukte Rust til \u00e5 skrive det, fordi:<\/p>\n<ul>\n<li>Rust gir deg det du trenger;<\/li>\n<li>det har utmerket dokumentasjon, Rust er ganske elegant;<\/li>\n<li>konstans er kult;<\/li>\n<li>jeg trenger ikke \u00e5 ty til kloning, kopiering eller andre lignende handlinger, som jeg ofte gjorde i C++;<\/li>\n<li>Options er veldig praktiske \u00e5 jobbe med, de h\u00e5ndterer ogs\u00e5 feil p\u00e5 en utmerket m\u00e5te;<\/li>\n<li>hvis prosjektet klarte \u00e5 kompilere, s\u00e5 fungerer det i 99% av tilfellene, n\u00f8yaktig slik det skal. Kompilatork feilmeldinger er, etter min mening, de beste jeg har sett.<\/li>\n<\/ul>\n<p>\nSpillutvikling p\u00e5 Rust er bare i gang. Men det finnes allerede et stabilt og ganske stort fellesskap som jobber med \u00e5 \u00e5pne Rust for alle. Derfor ser jeg optimistisk p\u00e5 framtiden for spr\u00e5ket, og ser frem til resultatene av v\u00e5rt felles arbeid.<\/p>\n<blockquote><p><b>Skillbox anbefaler:<\/b><\/p>\n<ul>\n<li>Nettkurs <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-utvikler\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\">\u00abMobiludvikler PRO\u00bb<\/a><\/noindex>.<\/li>\n<li>Praktisk ett\u00e5rig kurs <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\">\u00abPHP-utvikler fra 0 til PRO\u00bb<\/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.5 - 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\/no\/blog\/igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.5\" \/>\n\t\t<meta property=\"og:locale\" content=\"nn_NO\" \/>\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\/no\/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\udd47Spill p\u00e5 Rust p\u00e5 24 timer: personlig utviklingserfaring | ProHoster","description":"I denne artikkelen vil jeg fortelle om personlig erfaring.","canonical_url":"https:\/\/prohoster.info\/no\/blog\/igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nn_NO","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\/no\/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\/no\/wp-json\/wp\/v2\/posts\/29846","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/comments?post=29846"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts\/29846\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/media?parent=29846"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/categories?post=29846"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/tags?post=29846"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}