{"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\/sl\/blog\/igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki","title":{"rendered":"Igra na Rustu v 24 urah: osebna izku\u0161nja razvoja","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Igra na Rustu v 24 urah: osebna izku\u0161nja razvoja\" src=\"\/wp-content\/uploads\/2019\/03\/ea25406c43ac90ce2e33e290168d1083.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nV tem \u010dlanku bom delila osebne izku\u0161nje pri razvoju male igre v Rustu. Ustvarjanje delujo\u010de razli\u010dice je trajalo pribli\u017eno 24 ur (predvsem sem delala zve\u010der ali ob koncih tedna). Igra je \u0161e dale\u010d od konca, a verjamem, da bo izku\u0161nja koristna. Povedala bom, \u010desa sem se nau\u010dila, in o nekaterih opa\u017eanjih, ki sem jih imela pri gradnji igre od za\u010detka.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<blockquote><p><b>Skillbox priporo\u010da:<\/b> \u0414\u0432\u0443\u0445\u043b\u0435\u0442\u043d\u0438\u0439 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u0443\u0440\u0441 <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\">\u00bbSem PRO spletni razvijalec\u00ab<\/a><\/noindex>.<\/p>\n<p><b>Opominjamo:<\/b> <i>za vse bralce \u00bbHabra\u00ab \u2014 popust 10 000 rubljev ob vpisu na kateri koli te\u010daj Skillbox s promo kodo \u00bbHabr\u00ab.<\/i><\/p><\/blockquote>\n<p><\/p>\n<h3>Zakaj Rust?<\/h3>\n<p>\nIzbrala sem ta jezik, ker sem sli\u0161ala veliko dobrih stvari o njem in vidim, da postaja vse bolj priljubljen na podro\u010dju razvoja iger. Pred pisanjem igre sem imela nekaj izku\u0161enj z razvojem preprostih aplikacij v Rustu. To je bilo ravno dovolj, da sem za\u010dutila dolo\u010den ob\u010dutek svobode pri pisanju igre.<\/p>\n<h3>Zakaj prav igra in kak\u0161na igra?<\/h3>\n<p>\nUstvarjanje iger je zabavno! Rada bi, da bi bilo razlogov ve\u010d, a za \u00bbdoma\u010de\u00ab projekte izbiram teme, ki niso preve\u010d tesno povezane z mojo obi\u010dajno delo. Kak\u0161na igra? \u017delela sem narediti nekaj takega kot teni\u0161ki simulator, kjer se zdru\u017eijo Cities Skylines, Zoo Tycoon, Prison Architect in seveda tenis. Na koncu je nastala igra o teni\u0161ki akademiji, kjer ljudje prihajajo igrati.<\/p>\n<h3>Tehni\u010dna priprava<\/h3>\n<p>\n\u017delela sem uporabiti Rust, a natan\u010dno nisem vedela, koliko raziskovanja bo potrebno. Nisem hotela pisati pikselnih shaderjev in uporabljati drsanja in pada, zato sem iskala najbolj fleksibilne re\u0161itve.<\/p>\n<p>Na\u0161la sem koristne vire, ki jih delim z vami:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/arewegameyet.com\/\">Are we game yet<\/a><\/noindex> \u2014 seznam potrebnih elementov za razvoj iger v Rustu;<\/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\">Brezpla\u010dna pikselna umetnost.<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nPreu\u010dila sem nekaj Rust iger motorjev, na koncu pa izbrala Piston in ggez. S temi sem se sre\u010devala pri delu na prej\u0161njem projektu. Na koncu sem se odlo\u010dila za ggez, saj se mi je zdel bolj primeren za realizacijo majhne 2D igre. Modularna struktura Piston je preve\u010d zapletena za za\u010detnika (ali nekoga, ki prvi\u010d dela z Rustom).<\/p>\n<h3>Struktura igre<\/h3>\n<p>\nPorabila sem nekaj \u010dasa za razmi\u0161ljanje o arhitekturi projekta. Prvi korak je ustvariti 'zemljo', ljudi in teni\u0161ke igri\u0161\u010da. Ljudje se morajo gibati po igri\u0161\u010dih in \u010dakati. Igralci morajo imeti sposobnosti, ki se s \u010dasom izbolj\u0161ujejo. Poleg tega mora biti na voljo urejevalnik, ki omogo\u010da dodajanje novih ljudi in igri\u0161\u010d, a to ni zastonj.<\/p>\n<p>Ko sem premislila vse, sem se lotila dela. <\/p>\n<h3>Ustvarjanje igre<\/h3>\n<p>\n<b>Za\u010detek: krogi in abstractions<\/b><\/p>\n<p>Vzela sem primer iz ggez in dobila krog na ekranu. Neverjetno! Zdaj malo abstrakcij. Zdi se mi, da je dobro abstrahirati od ideje igralnega objekta. Vsak objekt mora biti upodobljen in posodobljen, kot je navedeno tukaj:<\/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>\nTa del kode mi je omogo\u010dil, da sem dobila odli\u010den seznam objektov, ki jih lahko posodobim in upodobim v vsaj enako odli\u010dnem ciklu.<\/p>\n<pre><code class=\"rust\">mpl event::EventHandler for MainState {\n    fn update(&amp;mut self, context: &amp;mut Context) -&gt; GameResult {\n        \/\/ Posodobite vse objekte\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        \/\/ Nari\u0161ite vse objekte\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 je potreben, ker vsebuje vse vrstice kode. Porabila sem malo \u010dasa, da sem razdelila datoteke in optimizirala strukturo imenika. Tako je zdaj vse videti:<br \/>\n<i>resources -&gt; tukaj so vsi viri (slike)<br \/>\nsrc<br \/>\n \u2014 entitete<br \/>\n \u2014 game_object.rs<br \/>\n \u2014 circle.rs<br \/>\n \u2014 main.rs -&gt; glavna zanka<\/i><\/p>\n<p><b>Ljudje, igri\u0161\u010da in slike<\/b><\/p>\n<p>Naslednji korak je ustvarjanje igralnega objekta Oseba in nalaganje slik. Vse mora biti zgrajeno na osnovi plo\u0161\u010dic velikosti 32*32.<\/p>\n<p><img decoding=\"async\" alt=\"Igra na Rustu v 24 urah: osebna izku\u0161nja razvoja\" src=\"\/wp-content\/uploads\/2019\/03\/265ed79e6784ef0180cfdc5aa8d96a4c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>Tenis igri\u0161\u010da<\/b><\/p>\n<p>Po preu\u010devanju, kako izgledajo tenis igri\u0161\u010da, sem se odlo\u010dila, da jih naredim iz plo\u0161\u010dic 4*2. Sprva je bilo mogo\u010de narediti sliko te velikosti ali pa sestaviti skupaj 8 lo\u010denih plo\u0161\u010dic. A kmalu sem spoznala, da potrebujem le dve edinstveni plo\u0161\u010dici, in to je razlog.<\/p>\n<p>Skupaj imamo dve taki plo\u0161\u010dici: 1 in 2.<\/p>\n<p>Vsak del igri\u0161\u010da je sestavljen iz plo\u0161\u010dice 1 ali plo\u0161\u010dice 2. Lahko so postavljene obi\u010dajno ali pa obrnjene za 180 stopinj.<\/p>\n<p><img decoding=\"async\" alt=\"Igra na Rustu v 24 urah: osebna izku\u0161nja razvoja\" src=\"\/wp-content\/uploads\/2019\/03\/90d07caea0dee8673ada5d44963ab347.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>Glavni na\u010din gradnje (sestavljanja)<\/b><\/p>\n<p>Potem ko sem dosegla upodabljanje igri\u0161\u010d, ljudi in zemljevidov, sem spoznala, da potrebujem tudi osnovni na\u010din sestavljanja. Uresni\u010dila sem ga tako: ko je gumb pritisnjen - objekt je izbran, klikanje pa ga postavi na pravo mesto. Tako gumb 1 omogo\u010da izbiro igri\u0161\u010da, gumb 2 pa izbiro igralca.<\/p>\n<p>Toda potrebno je tudi zapomniti, kaj pomenita 1 in 2, zato sem dodala \u017ei\u010dnato mre\u017eo, da bi bilo jasno, kateri objekt je izbran. Tako to izgleda.<\/p>\n<p><img decoding=\"async\" alt=\"Igra na Rustu v 24 urah: osebna izku\u0161nja razvoja\" src=\"\/wp-content\/uploads\/2019\/03\/09b92828fb9b8d4bfa5d5178ca99613c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>Vpra\u0161anja o arhitekturi in refaktoringu<\/b><\/p>\n<p>Zdaj imam nekaj igralnih objektov: ljudje, igri\u0161\u010da in nadstropja. Da bi delovali prototipi, je treba vsakemu objektu sporo\u010diti, ali so ti objekti v na\u010dinu prikazovanja ali pa gre le za narisano ovrednotenje. To ni prav priro\u010dno.<\/p>\n<p>Zdel se mi je, da je treba ponovno premisliti arhitekturo, da se razkrijejo dolo\u010dene omejitve:<\/p>\n<ul>\n<li>prisotnost entitete, ki se sama prikazuje in posodablja, je te\u017eava, saj ta entiteta ne more 'vedeti', kaj mora renderirati \u2013 sliko ali prototip;<\/li>\n<li>pomanjkanje orodja za izmenjavo lastnosti in vedenja med posameznimi entitetami (primer \u2013 lastnost is_build_mode ali pa upodobitev vedenja). Uporaba dedi\u0161\u010dine bi bila mogo\u010da, \u010deprav v Rustu ni normalnega na\u010dina za njeno implementacijo. Kar sem resni\u010dno potrebovala, je bila kompozicija;<\/li>\n<li>orodje za interakcijo med entitetami je bilo potrebno, da bi dodelili ljudi na igri\u0161\u010da;<\/li>\n<li>same entitete so predstavljale me\u0161anico podatkov in logike, kar je hitro postalo neobvladljivo.<\/li>\n<\/ul>\n<p><\/p>\n<blockquote><p><i>Opravila sem dodatno raziskovanje in odkrila arhitekturo <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Entity_component_system\">ECS \u2013 Sistem entitet in komponent<\/a><\/noindex>, ki se obi\u010dajno uporablja v igrah. Tukaj so prednosti ECS:<\/p>\n<ul>\n<li>podatki so lo\u010deni od logike;<\/li>\n<li>kompozicija namesto dedi\u0161\u010dine;<\/li>\n<li>arhitektura, usmerjena v podatke.<\/li>\n<\/ul>\n<p><\/i><\/p><\/blockquote>\n<p>\nZa ECS so zna\u010dilni trije osnovni koncepti:<\/p>\n<ul>\n<li>entitete \u2013 tip objekta, na katerega se sklicuje identifikator (to je lahko igralec, \u017eogica ali karkoli drugega);<\/li>\n<li>komponente \u2013 iz katerih so sestavljene entitete. Primer \u2013 komponenta za prikaz, lokacijo in druge. To so skladi\u0161\u010da podatkov;<\/li>\n<li>sistem \u2013 uporablja tako objekte kot komponente, poleg tega vsebuje vedenje in logiko, ki temelji na teh podatkih. Primer \u2013 sistem prikazovanja, ki pregleduje vse entitete s komponentami za prikaz in se ukvarja s renderiranjem.<\/li>\n<\/ul>\n<p>\nPo preu\u010devanju je postalo jasno, da ECS re\u0161uje naslednje probleme:<\/p>\n<ul>\n<li>uporaba kompozicije namesto dedi\u0161\u010dine za sistemsko organizacijo entitet; <\/li>\n<li>znebitev natrpanosti kode z uporabo sistemov za upravljanje; <\/li>\n<li>uporaba metod, kot je is_build_mode, da se logika prototipa shrani na enem mestu \u2013 v sistemu prikazovanja.<\/li>\n<\/ul>\n<p>\nTukaj je, kaj je nastalo po uvedbi ECS.<\/p>\n<p><i>resources -&gt; tukaj so vsi viri (slike)<br \/>\nsrc<br \/>\n \u2013 komponente<br \/>\n \u2013 position.rs<br \/>\n \u2013 person.rs<br \/>\n \u2013 tennis_court.rs<br \/>\n \u2013 floor.rs<br \/>\n \u2013 wireframe.rs<br \/>\n \u2013 mouse_tracked.rs<br \/>\n \u2013 viri<br \/>\n \u2013 mouse.rs<br \/>\n \u2013 sistemi<br \/>\n \u2013 rendering.rs<br \/>\n \u2013 constants.rs<br \/>\n \u2014 utils.rs<br \/>\n \u2014 world_factory.rs -&gt; funkcije tovarne sveta<br \/>\n \u2014 main.rs -&gt; glavna zanka<\/i><\/p>\n<h3>Dodeljujem ljude na terene<\/h3>\n<p>\nECS je olak\u0161ao \u017eivot. Sada sam imala sistemski put za dodavanje podataka entitetima i dodavanje logike zasnovane na tim podacima. To je, zauzvrat, omogu\u0107ilo organizaciju raspodjele ljudi po terenima.<\/p>\n<p>\u0160ta sam uradila:<\/p>\n<ul>\n<li>dodala podatke o dodeljenim terenima u Osobu;<\/li>\n<li>dodala podatke o raspodeljenim ljudima u TeniskiTeren;<\/li>\n<li>dodala sistem OdabiraTerena, koji analizira ljude i terene, pronalazi dostupne terene i raspore\u0111uje igra\u010de na njih;<\/li>\n<li>dodala sistem KretanjaOsobu, koji tra\u017ei ljude dodeljene terenima, i ako ih tamo nema, \u0161alje ljude gde je potrebno.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Igra na Rustu v 24 urah: osebna izku\u0161nja razvoja\" src=\"\/wp-content\/uploads\/2019\/03\/f2e4632de2cb9d1c3ec7c9d9310b8170.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <\/p>\n<h3>Zaklju\u010dno<\/h3>\n<p>\nVeoma mi se dopalo da radim na ovoj jednostavnoj igri. \u0160tavi\u0161e, zadovoljna sam \u0161to sam je napisala u Rustu, jer:<\/p>\n<ul>\n<li>Rust vam daje ono \u0161to vam je potrebno;<\/li>\n<li>ima odli\u010dnu dokumentaciju, Rust je prili\u010dno elegantan;<\/li>\n<li>konstantnost je sjajna;<\/li>\n<li>ne moram pribegavati kloniranju, kopiranju ili sli\u010dnim radnjama, \u0161to sam \u010desto radila u C++;<\/li>\n<li>Options su veoma korisni za rad, tako\u0111e su odli\u010dno rukovode\u0107i gre\u0161kama;<\/li>\n<li>ako je projekat uspe\u0161no kompajliran, u 99% slu\u010dajeva radi onako kako treba. Poruke gre\u0161aka kompajlera su po mom mi\u0161ljenju najbolje koje sam videla.<\/li>\n<\/ul>\n<p>\nRazvoj igara u Rustu tek zapo\u010dinje. Ali ve\u0107 postoji stabilna i prili\u010dno velika zajednica koja radi na tome da otvori Rust za sve. Zato na budu\u0107nost jezika gledam optimisti\u010dno, sa nestrpljenjem o\u010dekuju\u0107i rezultate na\u0161eg zajedni\u010dkog rada.<\/p>\n<blockquote><p><b>Skillbox priporo\u010da:<\/b><\/p>\n<ul>\n<li>Spletni te\u010daj <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\">\u201ePoklic frontend razvijalec\u201c<\/a><\/noindex>.<\/li>\n<li>Prakti\u010dni te\u010daj <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\">Mobilni razvijalec PRO<\/a><\/noindex>.<\/li>\n<li>\u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0433\u043e\u0434\u043e\u0432\u043e\u0439 \u043a\u0443\u0440\u0441 <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-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441 0 \u0434\u043e PRO\u00bb<\/a><\/noindex>.<\/li>\n<\/ul>\n<p>\n<\/p><\/blockquote>\n<p>Izvor: <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\/sl\/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=\"sl_SI\" \/>\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\/sl\/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\udd47Igra na Rustu za 24 sata: li\u010dno iskustvo razvoja | ProHoster","description":"U ovom \u010dlanku \u0107u govoriti o li\u010dnom iskustvu.","canonical_url":"https:\/\/prohoster.info\/sl\/blog\/igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sl_SI","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\/sl\/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\/sl\/wp-json\/wp\/v2\/posts\/29846","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/comments?post=29846"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/posts\/29846\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/media?parent=29846"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/categories?post=29846"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/tags?post=29846"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}