{"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\/pl\/blog\/igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki","title":{"rendered":"Gra na Rust w 24 godziny: osobiste do\u015bwiadczenie w tworzeniu","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Gra na Rust w 24 godziny: osobiste do\u015bwiadczenie w tworzeniu\" src=\"\/wp-content\/uploads\/2019\/03\/ea25406c43ac90ce2e33e290168d1083.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nW tym artykule opowiem o moim osobistym do\u015bwiadczeniu w tworzeniu ma\u0142ej gry w Rust. Stworzenie dzia\u0142aj\u0105cej wersji zaj\u0119\u0142o mi oko\u0142o 24 godzin (g\u0142\u00f3wnie pracowa\u0142am wieczorami lub w weekendy). Gra jest jeszcze daleka od uko\u0144czenia, ale my\u015bl\u0119, \u017ce to do\u015bwiadczenie b\u0119dzie przydatne. Opowiem, czego si\u0119 nauczy\u0142am, oraz o kilku spostrze\u017ceniach, kt\u00f3re mia\u0142am podczas budowania gry od podstaw.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<blockquote><p><b>Skillbox poleca:<\/b> Dwuletni praktyczny kurs <noindex><a rel=\"nofollow\" href=\"https:\/\/iamwebdev.skillbox.ru\/?utm_source=skillbox.media&amp;utm_medium=habr.com&amp;utm_campaign=WEBDEVPRO&amp;utm_content=articles&amp;utm_term=rust24\">\u201eJestem programist\u0105 webowym PRO\u201d<\/a><\/noindex>.<\/p>\n<p><b>Przypominamy:<\/b> <i>dla wszystkich czytelnik\u00f3w \u201eHabra\u201d \u2014 zni\u017cka 10 000 rubli przy zapisie na dowolny kurs Skillbox z kodem promocyjnym \u201eHabra\u201d.<\/i><\/p><\/blockquote>\n<p><\/p>\n<h3>Dlaczego Rust?<\/h3>\n<p>\nWybra\u0142am ten j\u0119zyk, poniewa\u017c s\u0142ysza\u0142am o nim wiele dobrego i widz\u0119, \u017ce staje si\u0119 coraz bardziej popularny w dziedzinie tworzenia gier. Przed napisaniem gry mia\u0142am niewielkie do\u015bwiadczenie w tworzeniu prostych aplikacji w Rust. Tego by\u0142o wystarczaj\u0105co, by poczu\u0107 pewn\u0105 swobod\u0119 w trakcie pisania gry.<\/p>\n<h3>Dlaczego akurat gra i co to za gra?<\/h3>\n<p>\nTworzenie gier to zabawa! Chcia\u0142abym, aby by\u0142o wi\u0119cej powod\u00f3w, ale do \u201edomowych\u201d projekt\u00f3w wybieram tematy, kt\u00f3re nie s\u0105 zbyt \u015bci\u015ble zwi\u0105zane z moj\u0105 codzienn\u0105 prac\u0105. Co to za gra? Chcia\u0142am stworzy\u0107 co\u015b w stylu symulatora tenisa, gdzie \u0142\u0105cz\u0105 si\u0119 Cities Skylines, Zoo Tycoon, Prison Architect i sam tenis. W skr\u00f3cie, powsta\u0142a gra o akademii tenisa, gdzie ludzie przychodz\u0105, aby gra\u0107.<\/p>\n<h3>Przygotowanie techniczne<\/h3>\n<p>\nChcia\u0142am u\u017cy\u0107 Rust, ale nie wiedzia\u0142am dok\u0142adnie, od czego nale\u017cy zacz\u0105\u0107 prac\u0119 \u201eod zera\u201d. Nie chcia\u0142am pisa\u0107 pikselowych shader\u00f3w ani korzysta\u0107 z drag-and-drop, dlatego szuka\u0142am najbardziej elastycznych rozwi\u0105za\u0144.<\/p>\n<p>Znalaz\u0142am przydatne zasoby, kt\u00f3rymi dziel\u0119 si\u0119 z wami:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/arewegameyet.com\/\">Are we game yet<\/a><\/noindex> \u2014 lista potrzebnych element\u00f3w Rust do tworzenia gier;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.reddit.com\/r\/rust_gamedev\">subreddit po\u015bwi\u0119cony deweloperom gier w Rust;<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/kenney.nl\">Darmowy pixel art.<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nZbada\u0142am kilka silnik\u00f3w gier w Rust, ostatecznie wybieraj\u0105c Piston i ggez. Spotka\u0142am si\u0119 z nimi przy pracy nad wcze\u015bniejszym projektem. Ostatecznie wybra\u0142am ggez, poniewa\u017c wydawa\u0142 si\u0119 bardziej odpowiedni do realizacji ma\u0142ej gry 2D. Modu\u0142owa struktura Piston jest zbyt skomplikowana dla pocz\u0105tkuj\u0105cego dewelopera (lub tego, kto pierwszy raz pracuje z Rust).<\/p>\n<h3>Struktura gry<\/h3>\n<p>\nPo\u015bwi\u0119ci\u0142am troch\u0119 czasu na my\u015blenie o architekturze projektu. Pierwszym krokiem jest stworzenie \u201eziemi\u201d, ludzi i kort\u00f3w tenisowych. Ludzie powinni porusza\u0107 si\u0119 po kortach i czeka\u0107. Gracze powinni mie\u0107 umiej\u0119tno\u015bci, kt\u00f3re doskonal\u0105 si\u0119 z up\u0142ywem czasu. Opr\u00f3cz tego powinien by\u0107 edytor, kt\u00f3ry pozwala na dodawanie nowych ludzi i kort\u00f3w, ale to ju\u017c nie jest darmowe.<\/p>\n<p>Rozmy\u015blaj\u0105c o wszystkim, przyst\u0105pi\u0142am do pracy. <\/p>\n<h3>Tworzenie gry<\/h3>\n<p>\n<b>Pocz\u0105tek: okr\u0119gi i abstrakcje<\/b><\/p>\n<p>Wzi\u0119\u0142am przyk\u0142ad z ggez i uzyska\u0142am okr\u0105g na ekranie. Niesamowite! Teraz troch\u0119 abstrakcji. Wydaje mi si\u0119, \u017ce dobrze by\u0142oby abstrahowa\u0107 od idei obiektu gry. Ka\u017cdy obiekt powinien by\u0107 renderowany i aktualizowany, jak pokazano tutaj:<\/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>\nTen fragment kodu pozwoli\u0142 mi uzyska\u0107 \u015bwietn\u0105 list\u0119 obiekt\u00f3w, kt\u00f3re mog\u0119 aktualizowa\u0107 i renderowa\u0107 w r\u00f3wnie \u015bwietnej p\u0119tli.<\/p>\n<pre><code class=\"rust\">mpl event::EventHandler for MainState {\n    fn update(&amp;mut self, context: &amp;mut Context) -&gt; GameResult {\n        \/\/ Aktualizuj wszystkie obiekty\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        \/\/ Rysuj wszystkie obiekty\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 jest potrzebny, poniewa\u017c zawiera wszystkie linie kodu. Po\u015bwi\u0119ci\u0142am troch\u0119 czasu na podzia\u0142 plik\u00f3w i optymalizacj\u0119 struktury katalog\u00f3w. Tak to wszystko wygl\u0105da po tym:<br \/>\n<i>resources -&gt; to tutaj znajduj\u0105 si\u0119 wszystkie zasoby (obrazy)<br \/>\nsrc<br \/>\n \u2014 entities<br \/>\n \u2014 game_object.rs<br \/>\n \u2014 circle.rs<br \/>\n \u2014 main.rs -&gt; g\u0142\u00f3wna p\u0119tla<\/i><\/p>\n<p><b>Ludzie, boiska i obrazy<\/b><\/p>\n<p>Nast\u0119pny etap to stworzenie obiektu gry Person i za\u0142adowanie obraz\u00f3w. Wszystko musi by\u0107 zbudowane na podstawie kafelk\u00f3w 32*32.<\/p>\n<p><img decoding=\"async\" alt=\"Gra na Rust w 24 godziny: osobiste do\u015bwiadczenie w tworzeniu\" src=\"\/wp-content\/uploads\/2019\/03\/265ed79e6784ef0180cfdc5aa8d96a4c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>Boiska tenisowe<\/b><\/p>\n<p>Badaj\u0105c, jak wygl\u0105daj\u0105 boiska tenisowe, postanowi\u0142am zrobi\u0107 je z kafelk\u00f3w 4*2. Pocz\u0105tkowo mo\u017cna by\u0142o utworzy\u0107 obraz tego rozmiaru lub po\u0142\u0105czy\u0107 8 oddzielnych kafelk\u00f3w. Ale potem zrozumia\u0142am, \u017ce potrzebne s\u0105 tylko dwie unikalne kafelki i oto dlaczego.<\/p>\n<p>Mamy tylko dwie takie kafelki: 1 i 2.<\/p>\n<p>Ka\u017cda sekcja boiska sk\u0142ada si\u0119 z kafelki 1 lub kafelki 2. Mog\u0105 by\u0107 umieszczone w zwyk\u0142y spos\u00f3b lub obr\u00f3cone o 180 stopni.<\/p>\n<p><img decoding=\"async\" alt=\"Gra na Rust w 24 godziny: osobiste do\u015bwiadczenie w tworzeniu\" src=\"\/wp-content\/uploads\/2019\/03\/90d07caea0dee8673ada5d44963ab347.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>G\u0142\u00f3wny tryb budowy (kompletacji)<\/b><\/p>\n<p>Po osi\u0105gni\u0119ciu renderowania boisk, ludzi i map, zrozumia\u0142am, \u017ce tak\u017ce potrzebny jest podstawowy tryb budowy. Zrealizowa\u0142am go tak: kiedy przycisk jest wci\u015bni\u0119ty \u2014 obiekt jest wybierany, a klikni\u0119cie umieszcza go w odpowiednim miejscu. Tak, przycisk 1 pozwala wybra\u0107 boisko, a przycisk 2 pozwala wybra\u0107 gracza.<\/p>\n<p>Ale musimy te\u017c zapami\u0119ta\u0107, co oznaczaj\u0105 1 i 2, dlatego doda\u0142am wireframe, aby by\u0142o jasne, kt\u00f3ry obiekt jest wybrany. Tak to wygl\u0105da.<\/p>\n<p><img decoding=\"async\" alt=\"Gra na Rust w 24 godziny: osobiste do\u015bwiadczenie w tworzeniu\" src=\"\/wp-content\/uploads\/2019\/03\/09b92828fb9b8d4bfa5d5178ca99613c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>Pytania dotycz\u0105ce architektury i refaktoryzacji<\/b><\/p>\n<p>Teraz mam kilka obiekt\u00f3w gry: ludzi, korty i pi\u0119tra. Jednak aby makiety dzia\u0142a\u0142y, ka\u017cdemu obiektowi trzeba powiedzie\u0107, czy same obiekty s\u0105 w trybie demonstracyjnym, czy po prostu narysowano ramk\u0119. To nie jest zbyt wygodne.<\/p>\n<p>Wydaje mi si\u0119, \u017ce trzeba przemy\u015ble\u0107 architektur\u0119, aby pojawi\u0142y si\u0119 pewne ograniczenia:<\/p>\n<ul>\n<li>posiadanie encji, kt\u00f3ra reprezentuje i aktualizuje siebie sam\u0105, jest problemem, poniewa\u017c ta encja nie b\u0119dzie mog\u0142a \"dowiedzie\u0107 si\u0119\", co powinna renderowa\u0107 \u2014 obraz lub makiet\u0119;<\/li>\n<li>brak narz\u0119dzia do wymiany w\u0142a\u015bciwo\u015bci i zachowa\u0144 mi\u0119dzy poszczeg\u00f3lnymi encjami (przyk\u0142ad \u2014 w\u0142a\u015bciwo\u015b\u0107 is_build_mode lub renderowanie zachowania). Mo\u017cna by u\u017cy\u0107 dziedziczenia, chocia\u017c w Rust nie ma sensownego sposobu jego realizacji. To, czego naprawd\u0119 potrzebowa\u0142em, to kompozycja;<\/li>\n<li>narz\u0119dzie do interakcji mi\u0119dzy encjami by\u0142o potrzebne, aby przypisywa\u0107 ludzi do kort\u00f3w;<\/li>\n<li>same encje by\u0142y mieszank\u0105 danych i logiki, co bardzo szybko wymyka\u0142o si\u0119 spod kontroli.<\/li>\n<\/ul>\n<p><\/p>\n<blockquote><p><i>Przeprowadzi\u0142em dodatkowe badania i odkry\u0142em architektur\u0119 <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Entity_component_system\">ECS \u2014 System Komponent\u00f3w Encji<\/a><\/noindex>, kt\u00f3ra jest zwykle stosowana w grach. Oto zalety ECS:<\/p>\n<ul>\n<li>dane s\u0105 oddzielone od logiki;<\/li>\n<li>kompozycja zamiast dziedziczenia;<\/li>\n<li>architektura skupiona na danych.<\/li>\n<\/ul>\n<p><\/i><\/p><\/blockquote>\n<p>\nDla ECS charakterystyczne s\u0105 trzy podstawowe koncepcje:<\/p>\n<ul>\n<li>encje \u2014 typ obiektu, na kt\u00f3ry odnosi si\u0119 identyfikator (mo\u017ce to by\u0107 gracz, pi\u0142ka lub co\u015b innego);<\/li>\n<li>komponenty \u2014 z czego sk\u0142adaj\u0105 si\u0119 encje. Przyk\u0142ad \u2014 komponent renderowania, po\u0142o\u017cenia i inne. To magazyny danych;<\/li>\n<li>systemy \u2014 korzystaj\u0105 zar\u00f3wno z obiekt\u00f3w, jak i komponent\u00f3w, a tak\u017ce zawieraj\u0105 zachowania i logik\u0119, kt\u00f3re opieraj\u0105 si\u0119 na tych danych. Przyk\u0142ad \u2014 system renderowania, kt\u00f3ry iteruje przez wszystkie encje z komponentami do renderowania i zajmuje si\u0119 ich rysowaniem.<\/li>\n<\/ul>\n<p>\nPo badaniach sta\u0142o si\u0119 jasne, \u017ce ECS rozwi\u0105zuje takie problemy:<\/p>\n<ul>\n<li>zastosowanie kompozycji zamiast dziedziczenia dla systemowej organizacji encji; <\/li>\n<li>pozbycie si\u0119 ba\u0142aganu w kodzie dzi\u0119ki systemom zarz\u0105dzania; <\/li>\n<li>u\u017cycie metod takich jak is_build_mode, aby przechowywa\u0107 logik\u0119 makiety w tym samym miejscu \u2014 w systemie renderowania.<\/li>\n<\/ul>\n<p>\nOto co wysz\u0142o po wprowadzeniu ECS.<\/p>\n<p><i>resources -&gt; to tutaj znajduj\u0105 si\u0119 wszystkie zasoby (obrazy)<br \/>\nsrc<br \/>\n \u2014 komponenty<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 zasoby<br \/>\n \u2014 mouse.rs<br \/>\n \u2014 systemy<br \/>\n \u2014 rendering.rs<br \/>\n \u2014 constants.rs<br \/>\n \u2014 utils.rs<br \/>\n \u2014 world_factory.rs -&gt; funkcje fabryki \u015bwiata<br \/>\n \u2014 main.rs -&gt; g\u0142\u00f3wna p\u0119tla<\/i><\/p>\n<h3>Przydzielanie ludzi na korty<\/h3>\n<p>\nECS upro\u015bci\u0142o \u017cycie. Teraz mia\u0142em systematyczny spos\u00f3b dodawania danych do encji oraz dodawania logiki opartej na tych danych. To z kolei umo\u017cliwi\u0142o zorganizowanie rozmieszczenia ludzi na kortach.<\/p>\n<p>Co zrobi\u0142em:<\/p>\n<ul>\n<li>doda\u0142em dane o przydzielonych kortach do Osoby;<\/li>\n<li>doda\u0142em dane o rozmieszczonych ludziach do Kortu;<\/li>\n<li>doda\u0142em SystemWybieraniaKort\u00f3w, kt\u00f3ry umo\u017cliwia analizowanie ludzi i obiekt\u00f3w, wykrywanie dost\u0119pnych kort\u00f3w i rozmieszczanie graczy na nich;<\/li>\n<li>doda\u0142em system RuchuOs\u00f3b, kt\u00f3ry wyszukuje ludzi przydzielonych na korty, a je\u015bli ich tam nie ma, to wysy\u0142a ich tam, gdzie s\u0105 potrzebni.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Gra na Rust w 24 godziny: osobiste do\u015bwiadczenie w tworzeniu\" src=\"\/wp-content\/uploads\/2019\/03\/f2e4632de2cb9d1c3ec7c9d9310b8170.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <\/p>\n<h3>Podsumowuj\u0105c<\/h3>\n<p>\nBardzo podoba\u0142o mi si\u0119 pracowa\u0107 nad t\u0105 prost\u0105 gr\u0105. Co wi\u0119cej, ciesz\u0119 si\u0119, \u017ce u\u017cy\u0142em do jej napisania Rust, poniewa\u017c:<\/p>\n<ul>\n<li>Rust daje to, co potrzebne;<\/li>\n<li>ma \u015bwietn\u0105 dokumentacj\u0119, Rust jest bardzo elegancki;<\/li>\n<li>konsekwencja to jest to;<\/li>\n<li>nie ma potrzeby si\u0119ga\u0107 po klonowanie, kopiowanie ani nic podobnego, co cz\u0119sto robi\u0142em w C++;<\/li>\n<li>Options s\u0105 bardzo wygodne w u\u017cyciu, doskonale radz\u0105 sobie z b\u0142\u0119dami;<\/li>\n<li>je\u015bli projekt uda\u0142o si\u0119 skompilowa\u0107, w 99% przypadk\u00f3w dzia\u0142a tak, jak powinien. Uwa\u017cam, \u017ce komunikaty b\u0142\u0119d\u00f3w kompilatora s\u0105 najlepsze, jakie widzia\u0142em.<\/li>\n<\/ul>\n<p>\nRozw\u00f3j gier w Rust dopiero si\u0119 zaczyna. Jednak ju\u017c istnieje stabilna i do\u015b\u0107 du\u017ca spo\u0142eczno\u015b\u0107, kt\u00f3re pracuje nad tym, by uczyni\u0107 Rust dost\u0119pnym dla wszystkich. Dlatego patrz\u0119 w przysz\u0142o\u015b\u0107 tego j\u0119zyka z optymizmem, z niecierpliwo\u015bci\u0105 oczekuj\u0105c wynik\u00f3w naszej wsp\u00f3lnej pracy.<\/p>\n<blockquote><p><b>Skillbox poleca:<\/b><\/p>\n<ul>\n<li>Kurs 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\">\u201eZaw\u00f3d frontend-developer\u201d<\/a><\/noindex>.<\/li>\n<li>Praktyczny kurs <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\">\u201eMobilny programista PRO\u201d<\/a><\/noindex>.<\/li>\n<li>Praktyczny roczny kurs <noindex><a rel=\"nofollow\" href=\"https:\/\/skillbox.ru\/php\/?utm_source=skillbox.media&amp;utm_medium=habr.com&amp;utm_campaign=PHPDEV&amp;utm_content=articles&amp;utm_term=rust24\">\u00abPHP programista od 0 do PRO\u00bb<\/a><\/noindex>.<\/li>\n<\/ul>\n<p>\n<\/p><\/blockquote>\n<p>\u0179r\u00f3d\u0142o: <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.1.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\/pl\/blog\/igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\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\/pl\/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\udd47Gra w Rust w 24 godziny: osobiste do\u015bwiadczenie w programowaniu | ProHoster","description":"W tym artykule opowiem o swoim osobistym do\u015bwiadczeniu.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","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\/pl\/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\/pl\/wp-json\/wp\/v2\/posts\/29846","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=29846"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/29846\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=29846"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=29846"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=29846"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}