{"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\/hr\/blog\/igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki","title":{"rendered":"Igra na Rust u 24 sata: osobno iskustvo razvoja","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Igra na Rust u 24 sata: osobno iskustvo razvoja\" src=\"\/wp-content\/uploads\/2019\/03\/ea25406c43ac90ce2e33e290168d1083.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nU ovom \u010dlanku \u0107u pri\u010dati o osobnom iskustvu razvoja male igre na Rustu. Izrada funkcionalne verzije trajala je oko 24 sata (ve\u0107inom sam radila nave\u010der ili vikendom). Igra je jo\u0161 uvijek daleko od zavr\u0161etka, ali mislim da \u0107e iskustvo biti korisno. Ispri\u010dat \u0107u \u0161to sam nau\u010dila i neka zapa\u017eanja koja sam stekla tijekom stvaranja igre od nule.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<blockquote><p><b>Skillbox preporu\u010duje:<\/b> Dvoipogodi\u0161nji prakti\u010dni te\u010daj <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\">\u201eJa sam PRO web programer\u201c<\/a><\/noindex>.<\/p>\n<p><b>Podsje\u0107amo:<\/b> <i>za sve \u010ditatelje \"Habra\" \u2014 popust od 10 000 rubalja prilikom upisa na bilo koji te\u010daj Skillbox uz promo kod \"Habr\".<\/i><\/p><\/blockquote>\n<p><\/p>\n<h3>Za\u0161to Rust?<\/h3>\n<p>\nOdabrala sam ovaj jezik jer sam \u010dula mnogo dobrih stvari o njemu i vidim da postaje sve popularniji u podru\u010dju razvoja igara. Prije pisanja igre imala sam malo iskustva u razvoju jednostavnih aplikacija na Rustu. To je bilo dovoljno da osjetim odre\u0111enu slobodu tijekom pisanja igre.<\/p>\n<h3>Za\u0161to ba\u0161 igra i koja igra?<\/h3>\n<p>\nGradnja igara je zabavna! Voljela bih da razloga ima vi\u0161e, ali za \u201eku\u0107ne\u201c projekte biram teme koje nisu previ\u0161e povezane s mojim uobi\u010dajenim poslom. Koja je to igra? Htjela sam napraviti ne\u0161to poput teniskog simulatora, gdje se kombiniraju Cities Skylines, Zoo Tycoon, Prison Architect i, naravno, tenis. Ukratko, nastala je igra o teniskoj akademiji, gdje ljudi dolaze igrati.<\/p>\n<h3>Tehni\u010dka priprema<\/h3>\n<p>\n\u017deljela sam koristiti Rust, ali nisam bila sigurna koliko \u201eod nule\u201c \u0107u trebati po\u010deti raditi. Nisam htjela pisati pikselne shadere i koristiti drag-n-drop, pa sam tra\u017eila najfleksibilnija rje\u0161enja.<\/p>\n<p>Na\u0161la sam korisne izvore koje dijelim s vama:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/arewegameyet.com\/\">Are we game yet<\/a><\/noindex> \u2014 popis potrebnih elemenata Rust za razvoj igara;<\/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\">Besplatni piksel-art.<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nIstra\u017eila sam nekoliko Rust game engine-a, a na kraju sam odabrala Piston i ggez. S njima sam se susretala rade\u0107i na prethodnom projektu. Na kraju sam odabrala ggez jer mi se \u010dinilo prikladnijim za realizaciju male 2D igre. Modularna struktura Piston-a previ\u0161e je slo\u017eena za po\u010detnika (ili onoga tko prvi put radi s Rust-om).<\/p>\n<h3>Struktura igre<\/h3>\n<p>\nProvela sam malo vremena razmi\u0161ljaju\u0107i o arhitekturi projekta. Prvi korak je napraviti \u201ezemlju\u201c, ljude i teniske terene. Ljudi trebaju biti u mogu\u0107nosti kretati se po terenima i \u010dekati. Igra\u010di trebaju imati vje\u0161tine koje se razvijaju s vremenom. Tako\u0111er, trebao bi postojati urednik koji omogu\u0107uje dodavanje novih ljudi i terena, ali to ve\u0107 nije besplatno.<\/p>\n<p>Razmi\u0161ljaju\u0107i o svemu, po\u010dela sam s radom. <\/p>\n<h3>Izrada igre<\/h3>\n<p>\n<b>Po\u010detak: krugovi i apstrakcije<\/b><\/p>\n<p>Uzeo sam primjer iz ggez i dobio krug na ekranu. Nevjerojatno! Sada malo apstrakcija. \u010cinilo mi se da bi bilo dobro apstrahirati se od ideje igra\u010dke objekta. Svaki objekt trebao bi biti renderiran i a\u017euriran, kao \u0161to je ovdje navedeno:<\/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>\nOvaj dio koda omogu\u0107io mi je da dobijem izvrstan popis objekata koje mogu a\u017eurirati i renderirati u ne manje odli\u010dnom ciklusu.<\/p>\n<pre><code class=\"rust\">mpl event::EventHandler for MainState {\n    fn update(&amp;mut self, context: &amp;mut Context) -&gt; GameResult {\n        \/\/ A\u017euriraj sve 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        \/\/ Nacrtaj sve 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 potreban jer sadr\u017ei sve linije koda. Provela sam malo vremena kako bih razdvojila datoteke i optimizirala strukturu direktorija. Evo kako je sve izgledalo nakon toga:<br \/>\n<i>resources -&gt; ovdje su svi resursi (slike)<br \/>\nsrc<br \/>\n \u2014 entiteti<br \/>\n \u2014 game_object.rs<br \/>\n \u2014 circle.rs<br \/>\n \u2014 main.rs -&gt; glavna petlja<\/i><\/p>\n<p><b>Ljudi, tereni i slike<\/b><\/p>\n<p>Sljede\u0107i korak je stvaranje igra\u010dkog objekta Person i u\u010ditavanje slika. Sve bi se trebalo temeljiti na plo\u010dicama dimenzija 32*32.<\/p>\n<p><img decoding=\"async\" alt=\"Igra na Rust u 24 sata: osobno iskustvo razvoja\" src=\"\/wp-content\/uploads\/2019\/03\/265ed79e6784ef0180cfdc5aa8d96a4c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>Teniski tereni<\/b><\/p>\n<p>Istra\u017euju\u0107i kako izgledaju teniski tereni, odlu\u010dila sam ih napraviti od plo\u010dica 4*2. Isprva se moglo napraviti sliku te veli\u010dine ili sastaviti 8 odvojenih plo\u010dica. No kasnije sam shvatila da su potrebne samo dvije jedinstvene plo\u010dice, i evo za\u0161to.<\/p>\n<p>Ima samo dvije takve plo\u010dice: 1 i 2.<\/p>\n<p>Svaka sekcija terena sastoji se od plo\u010dice 1 ili plo\u010dice 2. Mogu se nalaziti obi\u010dno ili biti okrenute za 180 stupnjeva.<\/p>\n<p><img decoding=\"async\" alt=\"Igra na Rust u 24 sata: osobno iskustvo razvoja\" src=\"\/wp-content\/uploads\/2019\/03\/90d07caea0dee8673ada5d44963ab347.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>Glavni na\u010din gradnje (sastavljanja)<\/b><\/p>\n<p>Nakon \u0161to sam bila u mogu\u0107nosti posti\u0107i renderiranje igrali\u0161ta, ljudi i karata, shvatila sam da mi je potreban i osnovni na\u010din sastavljanja. Implementirala sam ga tako: kada se pritisne gumb \u2014 objekt se odabire, a klik ga postavlja na \u017eeljeno mjesto. Tako gumb 1 omogu\u0107ava odabir terena, a gumb 2 dopu\u0161ta odabir igra\u010da.<\/p>\n<p>Ali potrebno je i zapamtiti \u0161to za nas 1 i 2 zna\u010de, pa sam dodala wireframe kako bi bilo jasno koji je objekt odabran. Evo kako to izgleda.<\/p>\n<p><img decoding=\"async\" alt=\"Igra na Rust u 24 sata: osobno iskustvo razvoja\" src=\"\/wp-content\/uploads\/2019\/03\/09b92828fb9b8d4bfa5d5178ca99613c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>Pitanja o arhitekturi i refaktoringu<\/b><\/p>\n<p>Sada imam nekoliko igra\u0107ih objekata: ljude, terene i eta\u017ee. No, kako bi wireframeovi funkcionirali, svakoj entiteti objekta treba re\u0107i jesu li sami objekti u na\u010dinu demonstracije ili je samo okvir nacrtan. To nije ba\u0161 prakti\u010dno.<\/p>\n<p>\u010cinilo mi se da treba preispitati arhitekturu kako bi se otkrila odre\u0111ena ograni\u010denja:<\/p>\n<ul>\n<li>postojanje entiteta koji se prikazuje i a\u017eurira samog sebe \u2014 to je problem, jer taj entitet ne mo\u017ee \"znati\" \u0161to treba renderirati \u2014 sliku i wireframe;<\/li>\n<li>nedostatak alata za razmjenu svojstava i pona\u0161anja izme\u0111u pojedina\u010dnih entiteta (primjer \u2014 svojstvo is_build_mode ili renderiranje pona\u0161anja). Moglo bi se koristiti naslje\u0111ivanje, iako u Rustu ne postoji normalan na\u010din njegove implementacije. Ono \u0161to mi je zaista trebalo \u2014 to je kompozicija;<\/li>\n<li>alat za me\u0111usobnu interakciju entiteta bio je potreban kako bi se ljudi dodijelili terenom;<\/li>\n<li>sami entiteti predstavljali su mje\u0161avinu podataka i logike, \u0161to je vrlo brzo izmaklo kontroli.<\/li>\n<\/ul>\n<p><\/p>\n<blockquote><p><i>Provela sam dodatno istra\u017eivanje i otkrila arhitekturu <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Entity_component_system\">ECS \u2014 Sustav Entitet-Komponenta<\/a><\/noindex>, koji se obi\u010dno koristi u igrama. Evo prednosti ECS-a:<\/p>\n<ul>\n<li>podaci su odvojeni od logike;<\/li>\n<li>kompozicija umjesto naslje\u0111ivanja;<\/li>\n<li>arhitektura usmjerena na podatke.<\/li>\n<\/ul>\n<p><\/i><\/p><\/blockquote>\n<p>\nZa ECS su karakteristi\u010dne tri osnovne koncepcije:<\/p>\n<ul>\n<li>entiteti \u2014 tip objekta na koji se odnosi identifikator (to mo\u017ee biti igra\u010d, loptica ili ne\u0161to drugo);<\/li>\n<li>komponente \u2014 od kojih se sastoje entiteti. Primjer \u2014 komponenta za renderiranje, pozicioniranje i druge. To su skladi\u0161ta podataka;<\/li>\n<li>sustavi \u2014 oni koriste i objekte i komponente, plus sadr\u017ee pona\u0161anje i logiku koja se temelji na tim podacima. Primjer \u2014 sustav za renderiranje koji prolazi kroz sve entitete s komponentama za renderiranje i bavi se crtanjem.<\/li>\n<\/ul>\n<p>\nNakon prou\u010davanja, postalo je jasno da ECS rje\u0161ava takve probleme:<\/p>\n<ul>\n<li>primjenu kompozicije umjesto naslje\u0111ivanja za sistemsku organizaciju entiteta; <\/li>\n<li>uklanjanje neredovitosti koda pomo\u0107u sustava upravljanja; <\/li>\n<li>kori\u0161tenje metoda poput is_build_mode za pohranu logike wireframea na istom mjestu \u2014 u sustavu za renderiranje.<\/li>\n<\/ul>\n<p>\nEvo \u0161to je rezultiralo nakon implementacije ECS-a.<\/p>\n<p><i>resources -&gt; ovdje su svi resursi (slike)<br \/>\nsrc<br \/>\n \u2014 komponente<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 resursi<br \/>\n \u2014 mouse.rs<br \/>\n \u2014 sustavi<br \/>\n \u2014 rendering.rs<br \/>\n \u2014 constants.rs<br \/>\n \u2014 utils.rs<br \/>\n \u2014 world_factory.rs -&gt; funkcije svjetske tvornice<br \/>\n \u2014 main.rs -&gt; glavna petlja<\/i><\/p>\n<h3>Dodeljujemo ljude na terene<\/h3>\n<p>\nECS je olak\u0161ala \u017eivot. Sada sam imala sistemski put za dodavanje podataka entitetima i dodavanje logike zasnovane na tim podacima. To je zauzvrat omogu\u0107ilo organizaciju raspodele ljudi po terenima.<\/p>\n<p>\u0160ta sam uradila:<\/p>\n<ul>\n<li>dodala podatke o dodeljenim terenima u Person;<\/li>\n<li>dodala podatke o raspodeljenim ljudima u TennisCourt;<\/li>\n<li>dodala CourtChoosingSystem, koja omogu\u0107ava analiziranje ljudi i terena, otkrivanje dostupnih terena i raspore\u0111ivanje igra\u010da na njih;<\/li>\n<li>dodala sistem PersonMovementSystem, koji pronalazi ljude dodeljene terenom, i ako ih nema tamo, \u0161alje ljude gde treba.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Igra na Rust u 24 sata: osobno iskustvo razvoja\" src=\"\/wp-content\/uploads\/2019\/03\/f2e4632de2cb9d1c3ec7c9d9310b8170.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <\/p>\n<h3>Zaklju\u010dujemo<\/h3>\n<p>\nVrlo mi je bilo drago raditi na ovoj jednostavnoj igri. \u0160tavi\u0161e, zadovoljna sam \u0161to sam koristila Rust za njeno pisanje, jer:<\/p>\n<ul>\n<li>Rust vam pru\u017ea ono \u0161to je potrebno;<\/li>\n<li>ima odli\u010dnu dokumentaciju, Rust je veoma elegantan;<\/li>\n<li>postojanost 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 korisne za rad, tako\u0111e savr\u0161eno obra\u0111uju gre\u0161ke;<\/li>\n<li>ako je projekat uspeo da se kompajlira, u 99% slu\u010dajeva funkcioni\u0161e onako kako treba. Smatram da su poruke gre\u0161aka kompajlera najbolje koje sam videla.<\/li>\n<\/ul>\n<p>\nRazvoj igara na Rustu tek po\u010dinje. Ali postoji stabilna i prili\u010dno velika zajednica koja radi na tome da otvori Rust za sve. Zbog toga gledam na budu\u0107nost jezika s optimizmom, s nestrpljenjem o\u010dekuju\u0107i rezultate na\u0161eg zajedni\u010dkog rada.<\/p>\n<blockquote><p><b>Skillbox preporu\u010duje:<\/b><\/p>\n<ul>\n<li>Online 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\">\u00abZanimanje frontend razvojni in\u017eenjer\u00bb<\/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\">\u00abMobilni programer PRO\u00bb<\/a><\/noindex>.<\/li>\n<li>Prakti\u010dni godi\u0161nji te\u010daj <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 programer od nule do 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.4 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u043b\u0438\u0447\u043d\u043e\u043c \u043e\u043f\u044b\u0442\u0435.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/hr\/blog\/igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"hr_HR\" \/>\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\/hr\/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 podeli\u0107u svoje li\u010dno iskustvo.","canonical_url":"https:\/\/prohoster.info\/hr\/blog\/igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hr_HR","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\/hr\/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\/hr\/wp-json\/wp\/v2\/posts\/29846","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/comments?post=29846"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts\/29846\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media?parent=29846"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/categories?post=29846"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/tags?post=29846"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}