{"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\/ro\/blog\/igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki","title":{"rendered":"Joc \u00een Rust \u00een 24 de ore: experien\u021ba personal\u0103 de dezvoltare","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Joc \u00een Rust \u00een 24 de ore: experien\u021ba personal\u0103 de dezvoltare\" src=\"\/wp-content\/uploads\/2019\/03\/ea25406c43ac90ce2e33e290168d1083.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00cen acest articol, voi povesti despre experien\u021ba mea personal\u0103 \u00een dezvoltarea unui mic joc pe Rust. Crearea versiunii func\u021bionale a durat aproximativ 24 de ore (predominant am lucrat seara sau \u00een weekend). Jocul este \u00eenc\u0103 departe de a fi finalizat, dar consider c\u0103 experien\u021ba va fi util\u0103. Voi povesti ce am \u00eenv\u0103\u021bat \u0219i despre c\u00e2teva observa\u021bii f\u0103cute \u00een construirea jocului de la zero.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<blockquote><p><b>Skillbox recomand\u0103:<\/b> Curs practic de doi ani <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\">\u201eSunt dezvoltator web PRO\u201d<\/a><\/noindex>.<\/p>\n<p><b>V\u0103 reamintim:<\/b> <i>pentru to\u021bi cititorii \u201eHabr\u201d \u2014 reducere de 10.000 de ruble la \u00eenscrierea la orice curs Skillbox cu codul de promovare \u201eHabr\u201d.<\/i><\/p><\/blockquote>\n<p><\/p>\n<h3>De ce Rust?<\/h3>\n<p>\nAm ales acest limbaj deoarece am auzit multe lucruri bune despre el \u0219i observ c\u0103 devine din ce \u00een ce mai popular \u00een domeniul dezvolt\u0103rii de jocuri. \u00cenainte de a scrie jocul, am avut o experien\u021b\u0103 limitat\u0103 \u00een dezvoltarea de aplica\u021bii simple pe Rust. Aceasta a fost suficient\u0103 pentru a sim\u021bi o anumit\u0103 libertate \u00een timpul scrierii jocului.<\/p>\n<h3>De ce un joc \u0219i despre ce fel de joc este vorba?<\/h3>\n<p>\nCrearea de jocuri este distractiv\u0103! Mi-a\u0219 fi dorit s\u0103 fie mai multe motive, dar pentru proiectele \u201ede cas\u0103\u201d aleg teme care nu sunt foarte legate de munca mea obi\u0219nuit\u0103. Ce fel de joc? Am vrut s\u0103 fac ceva de genul unui simulator de tenis, unde se \u00eembin\u0103 Cities Skylines, Zoo Tycoon, Prison Architect \u0219i, desigur, tenis. \u00cen general, a ie\u0219it un joc despre o academie de tenis, unde oamenii vin s\u0103 joace.<\/p>\n<h3>Preg\u0103tire tehnic\u0103<\/h3>\n<p>\nAm vrut s\u0103 folosesc Rust, dar nu \u0219tiam exact de la ce \u201ezero\u201d trebuie s\u0103 \u00eencep lucrul. Nu voiam s\u0103 scriu shader-e pixelate \u0219i s\u0103 folosesc drag-n-drop, a\u0219a c\u0103 am c\u0103utat cele mai flexibile solu\u021bii.<\/p>\n<p>Am g\u0103sit resurse utile pe care le \u00eemp\u0103rt\u0103\u0219esc cu voi:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/arewegameyet.com\/\">Are we game yet<\/a><\/noindex> \u2014 lista elementelor necesare pentru dezvoltarea jocurilor pe Rust;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.reddit.com\/r\/rust_gamedev\">subreddit-ul Rust game dev;<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/kenney.nl\">Art\u0103 pixel gratuit\u0103.<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nAm studiat c\u00e2teva motoare de jocuri Rust, aleg\u00e2nd \u00een cele din urm\u0103 Piston \u0219i ggez. M-am \u00eent\u00e2lnit cu ele \u00een timpul lucrului la proiectul anterior. \u00cen final, am ales ggez, deoarece a p\u0103rut mai potrivit pentru realizarea unui mic joc 2D. Structura modular\u0103 a Piston este prea complex\u0103 pentru un dezvoltator \u00eencep\u0103tor (sau pentru cineva care lucreaz\u0103 pentru prima dat\u0103 cu Rust).<\/p>\n<h3>Structura jocului<\/h3>\n<p>\nAm dedicat pu\u021bin timp g\u00e2ndindu-m\u0103 la arhitectura proiectului. Primul pas este s\u0103 fac \u201ep\u0103m\u00e2ntul\u201d, oamenii \u0219i terenurile de tenis. Oamenii trebuie s\u0103 se deplaseze pe terenuri \u0219i s\u0103 a\u0219tepte. Juc\u0103torii trebuie s\u0103 aib\u0103 abilit\u0103\u021bi care se dezvolt\u0103 \u00een timp. \u00cen plus, trebuie s\u0103 existe un editor care s\u0103 permit\u0103 ad\u0103ugarea de noi persoane \u0219i terenuri, dar asta nu e gratuit.<\/p>\n<p>Dup\u0103 ce am g\u00e2ndit totul, am \u00eenceput lucrul. <\/p>\n<h3>Crearea unui joc<\/h3>\n<p>\n<b>\u00cenceput: cercuri \u0219i abstrac\u021bii<\/b><\/p>\n<p>Am luat un exemplu din ggez \u0219i am ob\u021binut un cerc pe ecran. Uimitor! Acum, c\u00e2teva abstrac\u021bii. Mi s-a p\u0103rut bine s\u0103 m\u0103 ab\u021bin de la ideea de obiect de joc. Fiecare obiect trebuie s\u0103 fie redat \u0219i actualizat, a\u0219a cum este specificat aici:<\/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>\nAceast\u0103 sec\u021biune de cod mi-a permis s\u0103 ob\u021bin o list\u0103 excelent\u0103 de obiecte pe care le pot actualiza \u0219i reda \u00eentr-un ciclu nu mai pu\u021bin excelent.<\/p>\n<pre><code class=\"rust\">mpl event::EventHandler for MainState {\n    fn update(&amp;mut self, context: &amp;mut Context) -&gt; GameResult {\n        \/\/ Actualizeaz\u0103 toate obiectele\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        \/\/ Deseneaz\u0103 toate obiectele\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 este necesar deoarece con\u021bine toate liniile de cod. Am dedicat pu\u021bin timp pentru a \u00eemp\u0103r\u021bi fi\u0219ierele \u0219i a optimiza structura directorilor. Iat\u0103 cum a ar\u0103tat totul dup\u0103 aceasta:<br \/>\n<i>resources -&gt; acesta este locul unde se afl\u0103 toate activele (imagini)<br \/>\nsrc<br \/>\n \u2014 entities<br \/>\n \u2014 game_object.rs<br \/>\n \u2014 circle.rs<br \/>\n \u2014 main.rs -&gt; bucla principal\u0103<\/i><\/p>\n<p><b>Oameni, etaje \u0219i imagini<\/b><\/p>\n<p>Urm\u0103torul pas este crearea obiectului de joc Person \u0219i \u00eenc\u0103rcarea imaginilor. Totul trebuie s\u0103 fie construit pe baza pl\u0103cilor de dimensiune 32*32.<\/p>\n<p><img decoding=\"async\" alt=\"Joc \u00een Rust \u00een 24 de ore: experien\u021ba personal\u0103 de dezvoltare\" src=\"\/wp-content\/uploads\/2019\/03\/265ed79e6784ef0180cfdc5aa8d96a4c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>Terenuri de tenis<\/b><\/p>\n<p>Dup\u0103 ce am studiat cum arat\u0103 terenurile de tenis, am decis s\u0103 le fac din pl\u0103ci de 4*2. La \u00eenceput, putea fi creat\u0103 o imagine de aceast\u0103 dimensiune sau se puteau combina 8 pl\u0103ci separate. Dar ulterior am realizat c\u0103 sunt necesare doar dou\u0103 pl\u0103ci unice \u0219i iat\u0103 de ce.<\/p>\n<p>Avem \u00een total dou\u0103 pl\u0103ci de acest tip: 1 \u0219i 2.<\/p>\n<p>Fiecare sec\u021biune a terenului const\u0103 din placa 1 sau placa 2. Acestea pot fi plasate \u00een mod obi\u0219nuit sau pot fi \u00eentoarse cu 180 de grade.<\/p>\n<p><img decoding=\"async\" alt=\"Joc \u00een Rust \u00een 24 de ore: experien\u021ba personal\u0103 de dezvoltare\" src=\"\/wp-content\/uploads\/2019\/03\/90d07caea0dee8673ada5d44963ab347.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>Modul principal de construc\u021bie (asambleaz\u0103)<\/b><\/p>\n<p>Dup\u0103 ce am reu\u0219it s\u0103 ob\u021bin redarea terenurilor, oamenilor \u0219i hartelor, am realizat c\u0103 este necesar \u0219i un mod de baz\u0103 de asamblare. L-am implementat astfel: c\u00e2nd butonul este ap\u0103sat, obiectul este selectat, iar un clic \u00eel plaseaz\u0103 \u00een locul dorit. Astfel, butonul 1 permite selectarea terenului, iar butonul 2 permite selectarea juc\u0103torului.<\/p>\n<p>Dar trebuie s\u0103 ne amintim ce \u00eenseamn\u0103 1 \u0219i 2, a\u0219a c\u0103 am ad\u0103ugat un wireframe pentru a fi clar ce obiect este selectat. Iat\u0103 cum arat\u0103.<\/p>\n<p><img decoding=\"async\" alt=\"Joc \u00een Rust \u00een 24 de ore: experien\u021ba personal\u0103 de dezvoltare\" src=\"\/wp-content\/uploads\/2019\/03\/09b92828fb9b8d4bfa5d5178ca99613c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>\u00centreb\u0103ri despre arhitectur\u0103 \u0219i refactorizare<\/b><\/p>\n<p>Acum am c\u00e2teva obiecte de joc: oameni, terenuri \u0219i etaje. Dar pentru ca wireframe-urile s\u0103 func\u021bioneze, fiecare entitate trebuie s\u0103 comunice dac\u0103 obiectele \u00een sine sunt \u00een modul de demonstra\u021bie sau dac\u0103 este doar o ram\u0103 desenat\u0103. Nu este foarte convenabil.<\/p>\n<p>Mi s-a p\u0103rut c\u0103 trebuie reexaminat\u0103 arhitectura pentru a eviden\u021bia anumite limit\u0103ri:<\/p>\n<ul>\n<li>prezen\u021ba unei entit\u0103\u021bi care se autoafi\u015feaz\u0103 \u0219i se actualizeaz\u0103 este o problem\u0103, deoarece aceast\u0103 entitate nu va putea \"afla\" ce trebuie s\u0103 redare \u2014 imaginea \u0219i wireframe-ul;<\/li>\n<li>absen\u021ba unui instrument de schimb de propriet\u0103\u021bi \u0219i comportamente \u00eentre entit\u0103\u021bi distincte (exemplu \u2014 proprietatea is_build_mode sau redarea comportamentului). S-ar fi putut folosi mo\u0219tenirea, de\u0219i \u00een Rust nu exist\u0103 o modalitate normal\u0103 de a o implementa. Ceea ce aveam cu adev\u0103rat nevoie era compunerea;<\/li>\n<li>un instrument pentru interac\u021biunea entit\u0103\u021bilor \u00eentre ele era necesar pentru a asigna oameni pe terenuri;<\/li>\n<li>\u00eens\u0103\u0219i entit\u0103\u021bile reprezint\u0103 un amestec de date \u0219i logic\u0103, ceea ce rapid ie\u0219ea de sub control.<\/li>\n<\/ul>\n<p><\/p>\n<blockquote><p><i>Am efectuat o cercetare suplimentar\u0103 \u0219i am descoperit arhitectura <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Entity_component_system\">ECS \u2014 Sistem de Componente Entitate<\/a><\/noindex>, care este folosit\u0103 de obicei \u00een jocuri. Iat\u0103 avantajele ECS:<\/p>\n<ul>\n<li>datele sunt separate de logic\u0103;<\/li>\n<li>compunerea \u00een loc de mo\u0219tenire;<\/li>\n<li>arhitectur\u0103 orientat\u0103 pe date.<\/li>\n<\/ul>\n<p><\/i><\/p><\/blockquote>\n<p>\nPentru ECS, sunt caracteristice trei concepte de baz\u0103:<\/p>\n<ul>\n<li>entit\u0103\u021bi \u2014 tipul de obiect la care se refer\u0103 un identificator (aceasta poate fi un juc\u0103tor, o minge sau altceva);<\/li>\n<li>componente \u2014 din care sunt compuse entit\u0103\u021bile. Exemplu \u2014 componenta de redare, de pozi\u021bionare \u0219i altele. Acestea sunt depozite de date;<\/li>\n<li>sistemele \u2014 ele utilizeaz\u0103 at\u00e2t obiecte, c\u00e2t \u0219i componente, plus con\u021bin comportament \u0219i logic\u0103, care se bazeaz\u0103 pe aceste date. Un exemplu \u2014 un sistem de redare, care parcurge toate entit\u0103\u021bile cu componente pentru redare \u0219i se ocup\u0103 de desenare.<\/li>\n<\/ul>\n<p>\nDup\u0103 studiu, a devenit clar c\u0103 ECS rezolv\u0103 aceste probleme:<\/p>\n<ul>\n<li>aplicarea compunerii \u00een locul mo\u0219tenirii pentru organizarea sistematic\u0103 a entit\u0103\u021bilor; <\/li>\n<li>eliminarea amestecului de cod prin sisteme de gestionare; <\/li>\n<li>folosirea metodelor precum is_build_mode, pentru a p\u0103stra logica wireframe-ului \u00een acela\u0219i loc \u2014 \u00een sistemul de redare.<\/li>\n<\/ul>\n<p>\nIat\u0103 ce a ie\u0219it dup\u0103 implementarea ECS.<\/p>\n<p><i>resources -&gt; acesta este locul unde se afl\u0103 toate activele (imagini)<br \/>\nsrc<br \/>\n \u2014 componente<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 resurse<br \/>\n \u2014 mouse.rs<br \/>\n \u2014 sisteme<br \/>\n \u2014 rendering.rs<br \/>\n \u2014 constants.rs<br \/>\n \u2014 utils.rs<br \/>\n \u2014 world_factory.rs -&gt; func\u021biile fabricii de lume<br \/>\n \u2014 main.rs -&gt; bucla principal\u0103<\/i><\/p>\n<h3>Atribuim oamenii la terenuri<\/h3>\n<p>\nECS mi-a f\u0103cut via\u021ba mai u\u0219oar\u0103. Acum aveam o modalitate sistematic\u0103 de a ad\u0103uga date la entit\u0103\u021bi \u0219i de a ad\u0103uga logic\u0103 bazat\u0103 pe aceste date. Iar asta, la r\u00e2ndul s\u0103u, a permis organizarea distribuit\u0103 a oamenilor pe terenuri.<\/p>\n<p>Ce am f\u0103cut:<\/p>\n<ul>\n<li>am ad\u0103ugat date despre terenurile desemnate \u00een Person;<\/li>\n<li>am ad\u0103ugat date despre persoanele distribuite \u00een TennisCourt;<\/li>\n<li>am ad\u0103ugat CourtChoosingSystem, care permite analiza oamenilor \u0219i terenurilor, identificarea terenurilor disponibile \u0219i distribuirea juc\u0103torilor pe acestea;<\/li>\n<li>am ad\u0103ugat sistemul PersonMovementSystem, care caut\u0103 persoanele desemnate pe terenuri \u0219i, dac\u0103 nu sunt acolo, trimite persoanele unde trebuie.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Joc \u00een Rust \u00een 24 de ore: experien\u021ba personal\u0103 de dezvoltare\" src=\"\/wp-content\/uploads\/2019\/03\/f2e4632de2cb9d1c3ec7c9d9310b8170.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <\/p>\n<h3>\u00cencheiem<\/h3>\n<p>\nMi-a pl\u0103cut foarte mult s\u0103 lucrez la acest joc simplu. Mai mult, sunt mul\u021bumit\u0103 c\u0103 am folosit Rust pentru a-l scrie, deoarece:<\/p>\n<ul>\n<li>Rust \u00ee\u021bi ofer\u0103 ceea ce ai nevoie;<\/li>\n<li>are o documenta\u021bie excelent\u0103, Rust este foarte elegant;<\/li>\n<li>permanen\u021ba este fantastic\u0103;<\/li>\n<li>nu trebuie s\u0103 recurg la clonare, copiere sau alte ac\u021biuni similare, ceea ce f\u0103ceam adesea \u00een C++;<\/li>\n<li>Options sunt foarte convenabile de utilizat, de asemenea gestioneaz\u0103 erorile foarte bine;<\/li>\n<li>dac\u0103 proiectul a reu\u0219it s\u0103 se compileze, atunci \u00een 99% din cazuri acesta func\u021bioneaz\u0103 a\u0219a cum trebuie. Mesajele de eroare ale compilatorului sunt, cred, cele mai bune pe care le-am \u00eent\u00e2lnit.<\/li>\n<\/ul>\n<p>\nDezvoltarea jocurilor \u00een Rust abia \u00eencepe. Dar deja exist\u0103 o comunitate stabil\u0103 \u0219i destul de mare, care lucreaz\u0103 pentru a deschide Rust pentru toat\u0103 lumea. A\u0219adar, privesc cu optimism spre viitorul limbajului, a\u0219tept\u00e2nd cu ner\u0103bdare rezultatele muncii noastre comune.<\/p>\n<blockquote><p><b>Skillbox recomand\u0103:<\/b><\/p>\n<ul>\n<li>Curs online <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\">\u00abProfesie de dezvoltator frontend\u00bb<\/a><\/noindex>.<\/li>\n<li>Curs practic <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\">\u00abDezvoltator mobil PRO\u00bb<\/a><\/noindex>.<\/li>\n<li>Curs practic anual <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\">\u00abDezvoltator PHP de la 0 la PRO\u00bb<\/a><\/noindex>.<\/li>\n<\/ul>\n<p>\n<\/p><\/blockquote>\n<p>Sursa: <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.2.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\/ro\/blog\/igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\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\/ro\/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\udd47Joc pe Rust \u00een 24 de ore: experien\u021b\u0103 personal\u0103 de dezvoltare | ProHoster","description":"\u00cen acest articol v\u0103 voi povesti despre experien\u021ba mea personal\u0103.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/29846","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=29846"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/29846\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=29846"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=29846"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=29846"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}