{"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\/et\/blog\/igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki","title":{"rendered":"M\u00e4ng Rustis 24 tunni jooksul: isiklik arenduskogemus","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"M\u00e4ng Rustis 24 tunni jooksul: isiklik arenduskogemus\" src=\"\/wp-content\/uploads\/2019\/03\/ea25406c43ac90ce2e33e290168d1083.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSelles artiklis jagan oma isiklikku kogemust v\u00e4ikese m\u00e4ngu arendamisel Rustis. T\u00f6\u00f6tava versiooni loomiseks kulus umbes 24 tundi (peamiselt t\u00f6\u00f6tasin \u00f5htuti v\u00f5i n\u00e4dalavahetustel). M\u00e4ng on veel kaugel valmimisest, kuid arvan, et see kogemus on kasulik. R\u00e4\u00e4gin, mida \u00f5ppisin, ja m\u00f5nest t\u00e4helepanekust, mida tegin m\u00e4ngu nullist ehitamisel.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<blockquote><p><b>Skillbox soovitab:<\/b> Kaheaastane praktiline 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\">\u201eMina olen PRO veebiarendaja\u201c<\/a><\/noindex>.<\/p>\n<p><b>Tuletame meelde:<\/b> <i>k\u00f5igile \u00abHabra\u00bb lugejatele \u2014 10 000 rubla soodustus, kui registreerite end Skillboxi mis tahes kursusele promokoodi \u00abHabr\u00bb abil.<\/i><\/p><\/blockquote>\n<p><\/p>\n<h3>Miks Rust?<\/h3>\n<p>\nValisin selle keele, kuna olin kuulnud sellest palju head ja n\u00e4en, et see muutub m\u00e4nguarenduse valdkonnas \u00fcha populaarsemaks. Enne m\u00e4ngu kirjutamist oli mul v\u00e4hene kogemus lihtsate rakenduste arendamisel Rustis. Seda oli just piisavalt, et tunda kindlat vabadust m\u00e4ngu kirjutamisel.<\/p>\n<h3>Miks just m\u00e4ng ja milline m\u00e4ng?<\/h3>\n<p>\nM\u00e4ngude loomine on l\u00f5bus! Sooviksin, et p\u00f5hjus oleks rohkem, kuid koduste projektide puhul valin teeman, mis ei ole liiga closely seotud minu tavap\u00e4rase t\u00f6\u00f6ga. Mis m\u00e4ng see on? Soovis teha midagi nagu tennis sims, kus segunevad Cities Skylines, Zoo Tycoon, Prison Architect ja tennis ise. Kokkuv\u00f5ttes kujunes v\u00e4lja m\u00e4ng tennisekadeemiast, kuhu inimesed tulevad m\u00e4ngima.<\/p>\n<h3>Tehniline ettevalmistus<\/h3>\n<p>\nSoovisin kasutada Rust'i, kuid ma ei teadnud t\u00e4pselt, kui palju tuleb alustada nullist. Ma ei soovinud kirjutada pikslite varjutusi ja kasutada drag-n-drop'i, seega otsisin paindlikumaid lahendusi.<\/p>\n<p>Leidsin kasulikke ressursse, mida jagan teiega:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/arewegameyet.com\/\">Are we game yet<\/a><\/noindex> \u2014 nimekiri vajalikest elementidest m\u00e4ngude arendamiseks Rust'is;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.reddit.com\/r\/rust_gamedev\">Rust m\u00e4ngude arenduse subreddiit;<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/kenney.nl\">Tasuta pikselkunst.<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nUurisin mitmeid m\u00e4ngumootoreid Rust'is, valides l\u00f5puks Piston ja ggez. Kohtusin nendega, t\u00f6\u00f6tades varasema projekti kallal. L\u00f5puks valisin ggez, kuna see tundus sobivam v\u00e4ikese 2D-m\u00e4ngu elluviimiseks. Piston'i modulaarne struktuur on algajale arendajale (v\u00f5i sellele, kes esmakordselt Rust'iga t\u00f6\u00f6tab) liiga keeruline.<\/p>\n<h3>M\u00e4ngu struktuur<\/h3>\n<p>\nKulutasin veidi aega projekti arhitektuuri m\u00f5tlemiseks. Esimene samm on luua \u201emaa\u201c, inimesed ja tennisev\u00e4ljakud. Inimesed peavad v\u00e4ljakutel liikuma ja ootama. M\u00e4ngijatel peavad olema oskused, mis ajas arenevad. Lisaks peab olema redaktor, mis v\u00f5imaldab lisada uusi inimesi ja v\u00e4ljakuid, kuid see ei ole enam tasuta.<\/p>\n<p>Kui k\u00f5ik l\u00e4bi m\u00f5eldud, asusin t\u00f6\u00f6le. <\/p>\n<h3>M\u00e4ngu loomine<\/h3>\n<p>\n<b>Algus: ringid ja abstraktsioonid<\/b><\/p>\n<p>V\u00f5tsin eeskujuks ggez'i ja sain ringi ekraanile. Imeline! N\u00fc\u00fcd natuke abstraktsioone. Tundus, et oleks hea, kui abstrakteeruda m\u00e4ngu objekti ideest. Iga objekt peab olema renderdatud ja uuendatud, nagu siin n\u00e4idatud:<\/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>\nSee koodil\u00f5ik v\u00f5imaldas mul saada suurep\u00e4rase objekti nimekirja, mida saan uuendada ja renderdada v\u00e4hemalt sama suurep\u00e4rases ts\u00fcklis.<\/p>\n<pre><code class=\"rust\">mpl event::EventHandler for MainState {\n    fn update(&amp;mut self, context: &amp;mut Context) -&gt; GameResult {\n        \/\/ Uuenda k\u00f5ik objektid\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        \/\/ Joonista k\u00f5ik objektid\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 on vajalik, kuna seal on k\u00f5ik koodiread. M\u00e4letan, et kulutasin natuke aega failide jagamisele ja kaustastruktuuri optimeerimisele. Nii see k\u00f5ik p\u00e4rast muutus:<br \/>\n<i>resources -&gt; siia kogunevad k\u00f5ik varad (pildid)<br \/>\nsrc<br \/>\n \u2014 entities<br \/>\n \u2014 game_object.rs<br \/>\n \u2014 circle.rs<br \/>\n \u2014 main.rs -&gt; p\u00f5hits\u00fckkel<\/i><\/p>\n<p><b>Inimesed, tasanded ja pildid<\/b><\/p>\n<p>J\u00e4rgmine etapp on m\u00e4ngu objekti Person loomine ja piltide laadimine. K\u00f5ik peab olema ehitatud 32*32 plaatide alusel.<\/p>\n<p><img decoding=\"async\" alt=\"M\u00e4ng Rustis 24 tunni jooksul: isiklik arenduskogemus\" src=\"\/wp-content\/uploads\/2019\/03\/265ed79e6784ef0180cfdc5aa8d96a4c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>Tennisev\u00e4ljakud<\/b><\/p>\n<p>Uurides, kuidas tennisev\u00e4ljakud v\u00e4lja n\u00e4evad, otsustasin teha need 4*2 plaatidest. Alguses oleks v\u00f5inud sellise suuruse jaoks teha kas \u00fche pildi v\u00f5i kokku panna 8 eraldi plaati. Kuid hiljem sain aru, et on vajalikud vaid kaks ainulaadset plaati, ja siit tulenebki p\u00f5hjus.<\/p>\n<p>Kokku on meil ainult kaks sellist plaati: 1 ja 2.<\/p>\n<p>Iga v\u00e4ljakusektsioon koosneb plaadist 1 v\u00f5i plaadist 2. Need v\u00f5ivad paikneda nagu tavaliselt v\u00f5i olla p\u00f6\u00f6ratud 180 kraadi.<\/p>\n<p><img decoding=\"async\" alt=\"M\u00e4ng Rustis 24 tunni jooksul: isiklik arenduskogemus\" src=\"\/wp-content\/uploads\/2019\/03\/90d07caea0dee8673ada5d44963ab347.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>Peamine ehitamisre\u017eiim (kokkupanek)<\/b><\/p>\n<p>P\u00e4rast seda, kui sain renderdamisega hakkama, m\u00e4rkasin, et on vajalik ka p\u00f5hikoosolekure\u017eiim. Selle lahendasin nii: kui nuppu vajutatakse \u2014 objekt on valitud ja klikk paigutab selle soovitud kohta. Nii annab nupp 1 v\u00f5imaluse valida koht, samas kui nupp 2 v\u00f5imaldab valida m\u00e4ngijat.<\/p>\n<p>Kuid peame veel meeles pidama, mida 1 ja 2 t\u00e4hendavad, seet\u00f5ttu lisasin juhtplaani, et selge oleks, milline objekt on valitud. Nii see v\u00e4lja n\u00e4eb.<\/p>\n<p><img decoding=\"async\" alt=\"M\u00e4ng Rustis 24 tunni jooksul: isiklik arenduskogemus\" src=\"\/wp-content\/uploads\/2019\/03\/09b92828fb9b8d4bfa5d5178ca99613c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>K\u00fcsimused arhitektuuri ja refaktoreerimise kohta<\/b><\/p>\n<p>N\u00fc\u00fcd on mul mitu m\u00e4nguobjekti: inimesed, v\u00e4ljakud ja korrused. Kuid selleks, et juhtplaanid t\u00f6\u00f6taksid, peab iga objekti \u00fchik olema kursis, kas objektid on esitluse re\u017eiimis v\u00f5i on lihtsalt joonistatud raam. See ei ole kuigi mugav.<\/p>\n<p>Mulle tundus, et arhitektuuri tuleks \u00fcmber m\u00f5elda, et leida m\u00f5ned piirangud:<\/p>\n<ul>\n<li>\u00fcksuse olemasolu, mis kuvab ja uuendab ennast, on probleem, kuna see \u00fchik ei suuda 'teada', mida ta peab renderdama \u2014 pilti ja juhtplaani;<\/li>\n<li>puuduvad vahendid omaduste ja k\u00e4itumise vahetamiseks \u00fcksikute objektide vahel (n\u00e4ide \u2014 omadus is_build_mode v\u00f5i k\u00e4itumise joonistamine). Oleks v\u00f5inud kasutada p\u00e4randamist, kuigi Rustis pole selle rakendamiseks korralikku viisi. Mind t\u00f5eliselt huvitas kompositsioon;<\/li>\n<li>vahend objektide omavaheliseks suhtlemiseks oli vajalik, et m\u00e4\u00e4rata inimesi v\u00e4ljakutele;<\/li>\n<li>need objektid olid andmete ja loogika segu, mis kiiresti hukka l\u00e4ks.<\/li>\n<\/ul>\n<p><\/p>\n<blockquote><p><i>Tehnisin veel ja avastasin arhitehtuuri <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Entity_component_system\">ECS \u2014 Entity Component System<\/a><\/noindex>, mida kasutatakse sageli m\u00e4ngudes. Siin on ECS eelised:<\/p>\n<ul>\n<li>andmed on eraldatud loogikast;<\/li>\n<li>kompositsioon p\u00e4rimise asemel;<\/li>\n<li>andmep\u00f5hine arhitektuur.<\/li>\n<\/ul>\n<p><\/i><\/p><\/blockquote>\n<p>\nECS-i iseloomustavad kolm p\u00f5hikontseptsiooni:<\/p>\n<ul>\n<li>objektid \u2014 objekti t\u00fc\u00fcp, millele viitab identifikaator (see v\u00f5ib olla m\u00e4ngija, pall v\u00f5i midagi muud);<\/li>\n<li>komponendid \u2014 need moodustavad objektid. N\u00e4ide \u2014 renderdamise komponent, asukoht ja teised. Need on andmete hoidlad;<\/li>\n<li>s\u00fcsteemid \u2014 nad kasutavad nii objekte kui komponente ning sisaldavad k\u00e4itumist ja loogikat, mis p\u00f5hinevad nende andmetel. N\u00e4ide \u2014 renderdamisseade, mis l\u00e4bib k\u00f5ik olemused koos komponentidega renderdamiseks ja tegeleb joonistamisega.<\/li>\n<\/ul>\n<p>\nUurimise j\u00e4rel selgus, et ECS lahendab j\u00e4rgmised probleemid:<\/p>\n<ul>\n<li>komponendi kasutamine asemel p\u00e4rimise s\u00fcsteemseks korraldamiseks; <\/li>\n<li>koodi segadusest vabastamine s\u00fcsteemide haldamise kaudu; <\/li>\n<li>meetodite nagu is_build_mode kasutamine, et hoida traate loogikat samas kohas \u2014 renderdamisseadmes.<\/li>\n<\/ul>\n<p>\nSiin on, mis s\u00fcndis p\u00e4rast ECS-i rakendamist.<\/p>\n<p><i>resources -&gt; siia kogunevad k\u00f5ik varad (pildid)<br \/>\nsrc<br \/>\n \u2014 komponendid<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 s\u00fcsteemid<br \/>\n \u2014 rendering.rs<br \/>\n \u2014 constants.rs<br \/>\n \u2014 utils.rs<br \/>\n \u2014 world_factory.rs -&gt; maailmade tehasetooted<br \/>\n \u2014 main.rs -&gt; p\u00f5hits\u00fckkel<\/i><\/p>\n<h3>M\u00e4\u00e4rame inimesed kohtadele<\/h3>\n<p>\nECS on elu lihtsamaks teinud. N\u00fc\u00fcd oli mul s\u00fcsteemne tee andmete lisamiseks olemustele ja nende andmete p\u00f5hjal loogika lisamiseks. See, omakorda, v\u00f5imaldas korraldada inimeste jaotamist kohtadele.<\/p>\n<p>Mida ma tegin:<\/p>\n<ul>\n<li>lisati Person-i m\u00e4\u00e4ratud kohtade andmed;<\/li>\n<li>lisati TennisCourt-i jaotatud inimeste andmed;<\/li>\n<li>lisatud CourtChoosingSystem, mis v\u00f5imaldab anal\u00fc\u00fcsida inimesi ja platsse, avastada saadaolevaid v\u00e4ljakuid ja jaotada m\u00e4ngijaid neile;<\/li>\n<li>lisatud PersonMovementSystem, mis otsib inimesi, kes on m\u00e4\u00e4ratud v\u00e4ljakutele, ja kui neid seal pole, suunab inimesi sinna, kus nad peavad olema.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"M\u00e4ng Rustis 24 tunni jooksul: isiklik arenduskogemus\" src=\"\/wp-content\/uploads\/2019\/03\/f2e4632de2cb9d1c3ec7c9d9310b8170.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <\/p>\n<h3>Teeme kokkuv\u00f5tteid<\/h3>\n<p>\nMulle meeldis v\u00e4ga t\u00f6\u00f6tada selle lihtsa m\u00e4nguga. Veelgi enam, olen rahul, et kasutasin selle kirjutamiseks Rust'i, kuna:<\/p>\n<ul>\n<li>Rust annab teile k\u00f5ik, mis vajalik;<\/li>\n<li>sellel on suurep\u00e4rane dokumentatsioon, Rust on v\u00e4ga elegantne;<\/li>\n<li>p\u00fcsivus on suurep\u00e4rane;<\/li>\n<li>ei pea kasutama kloonimist, kopeerimist v\u00f5i muid sarnaseid toiminguid, mida ma sageli tegin C++-s;<\/li>\n<li>Options on v\u00e4ga mugavad kasutada ja nad k\u00e4sitlevad vigu suurep\u00e4raselt;<\/li>\n<li>kui projekt \u00f5nnestub kompileerida, siis 99% t\u00f5en\u00e4osusega t\u00f6\u00f6tab see just nii, nagu peab. Arvutiviga teated on minu arvates parimad, mida ma olen n\u00e4inud.<\/li>\n<\/ul>\n<p>\nM\u00e4ngude arendamine Rust'i keeles on alles alguses. Kuid juba on olemas stabiilne ja \u00fcsna suur kogukond, mis t\u00f6\u00f6tab selle nimel, et avada Rust k\u00f5igile. Seet\u00f5ttu vaatan keele tulevikku optimistlikult, oodates meie \u00fchise t\u00f6\u00f6 tulemusi kannatamatult.<\/p>\n<blockquote><p><b>Skillbox soovitab:<\/b><\/p>\n<ul>\n<li>Veebikursus <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\">\u201eFrontend-arendaja amet\u201c<\/a><\/noindex>.<\/li>\n<li>Praktiline 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\">\u00abMobiilne arendaja PRO\u00bb<\/a><\/noindex>.<\/li>\n<li>Praktiline aastakursus <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\">\u201ePHP arendaja algusest PRO-ni\u201c<\/a><\/noindex>.<\/li>\n<\/ul>\n<p>\n<\/p><\/blockquote>\n<p>Allikas: <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.0.1 - 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\/et\/blog\/igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\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\/et\/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\udd47Rusti m\u00e4ng 24 tunni jooksul: isiklik arendus kogemus | ProHoster","description":"Selles artiklis r\u00e4\u00e4gin oma isiklikest kogemustest.","canonical_url":"https:\/\/prohoster.info\/et\/blog\/igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","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\/et\/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\/et\/wp-json\/wp\/v2\/posts\/29846","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=29846"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/29846\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=29846"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=29846"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=29846"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}