{"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\/de\/blog\/igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki","title":{"rendered":"Rust-Spiel in 24 Stunden: pers\u00f6nliche Entwicklungsreise","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Rust-Spiel in 24 Stunden: pers\u00f6nliche Entwicklungsreise\" src=\"\/wp-content\/uploads\/2019\/03\/ea25406c43ac90ce2e33e290168d1083.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIn diesem Artikel teile ich meine pers\u00f6nlichen Erfahrungen bei der Entwicklung eines kleinen Spiels in Rust. Die Erstellung einer funktionierenden Version hat etwa 24 Stunden in Anspruch genommen (haupts\u00e4chlich arbeitete ich abends oder am Wochenende). Das Spiel ist noch lange nicht abgeschlossen, aber ich denke, die Erfahrung wird n\u00fctzlich sein. Ich werde erl\u00e4utern, was ich gelernt habe, und einige Beobachtungen beim Spielaufbau von Grund auf schildern.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<blockquote><p><b>Skillbox empfiehlt:<\/b> Zweij\u00e4hriger praktischer 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\">Ich bin PRO-Webentwickler<\/a><\/noindex>.<\/p>\n<p><b>Wir erinnern daran:<\/b> <i>alle Leser von \u201eHabr\u201c erhalten einen Rabatt von 10.000 Rubel bei der Anmeldung zu einem beliebigen Kurs von Skillbox mit dem Aktionscode \u201eHabr\u201c.<\/i><\/p><\/blockquote>\n<p><\/p>\n<h3>Warum Rust?<\/h3>\n<p>\nIch habe diese Sprache gew\u00e4hlt, weil ich viel Positives dar\u00fcber geh\u00f6rt habe und sehe, dass sie in der Spieleentwicklung immer beliebter wird. Vor der Entwicklung des Spiels hatte ich ein wenig Erfahrung in der Erstellung einfacher Anwendungen mit Rust. Das war genau genug, um ein gewisses Ma\u00df an Freiheit beim Programmieren des Spiels zu sp\u00fcren.<\/p>\n<h3>Warum gerade ein Spiel und welches Spiel?<\/h3>\n<p>\nDas Spielen von Videospielen macht Spa\u00df! Ich w\u00fcnschte, es g\u00e4be mehr Gr\u00fcnde, aber f\u00fcr \"Hausprojekte\" w\u00e4hle ich Themen, die nicht zu eng mit meiner gewohnten Arbeit verbunden sind. Um welches Spiel handelt es sich? Ich wollte etwas wie einen Tennissimulator machen, der Elemente aus Cities Skylines, Zoo Tycoon, Prison Architect und nat\u00fcrlich Tennis kombiniert. Letztendlich entstand ein Spiel \u00fcber eine Tennisakademie, in der Menschen zum Spielen kommen.<\/p>\n<h3>Technische Vorbereitung<\/h3>\n<p>\nIch wollte Rust verwenden, wusste aber nicht genau, wie \"von Grund auf\" ich anfangen sollte. Ich wollte keine Pixel-Shader schreiben und Drag-and-Drop verwenden, also suchte ich nach den flexibelsten L\u00f6sungen.<\/p>\n<p>Ich habe n\u00fctzliche Ressourcen gefunden, die ich mit Ihnen teile:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/arewegameyet.com\/\">Sind wir schon im Spiel?<\/a><\/noindex> \u2014 eine Liste der notwendigen Elemente f\u00fcr die Spieleentwicklung in Rust;<\/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\">Kostenlose Pixelkunst.<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nIch habe einige Spiel-Engines f\u00fcr Rust untersucht und letztendlich Piston und ggez ausgew\u00e4hlt. Ich hatte bereits in einem fr\u00fcheren Projekt mit ihnen zu tun. Schlie\u00dflich entschied ich mich f\u00fcr ggez, da es sich besser f\u00fcr die Umsetzung eines kleinen 2D-Spiels eignete. Die modulare Struktur von Piston ist f\u00fcr einen Anf\u00e4nger (oder jemanden, der zum ersten Mal mit Rust arbeitet) zu komplex.<\/p>\n<h3>Spielestruktur<\/h3>\n<p>\nIch habe etwas Zeit damit verbracht, \u00fcber die Architektur des Projekts nachzudenken. Der erste Schritt besteht darin, die \"Umgebung\", die Personen und die Tennispl\u00e4tze zu schaffen. Die Personen sollten sich auf den Pl\u00e4tzen bewegen und warten. Die Spieler sollten F\u00e4higkeiten haben, die sich im Laufe der Zeit verbessern. Au\u00dferdem sollte es einen Editor geben, der es erm\u00f6glicht, neue Personen und Pl\u00e4tze hinzuzuf\u00fcgen, aber das kostenfrei ist nicht m\u00f6glich.<\/p>\n<p>Nachdem ich alles durchdacht habe, begann ich mit der Arbeit. <\/p>\n<h3>Spielerstellung<\/h3>\n<p>\n<b>Anfang: Kreise und Abstraktionen<\/b><\/p>\n<p>Ich habe mir ein Beispiel aus ggez genommen und einen Kreis auf dem Bildschirm erzeugt. Erstaunlich! Jetzt ein wenig Abstraktionen. Ich dachte, es w\u00e4re gut, sich von der Idee des Spielobjekts zu abstrahieren. Jedes Objekt sollte gerendert und aktualisiert werden, wie hier angegeben:<\/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>\nDieser Codeabschnitt erm\u00f6glichte es mir, eine gro\u00dfartige Liste von Objekten zu erhalten, die ich in einem ebenso hervorragenden Zyklus aktualisieren und rendern kann.<\/p>\n<pre><code class=\"rust\">mpl event::EventHandler f\u00fcr MainState {\n    fn update(&amp;mut self, context: &amp;mut Context) -&gt; GameResult {\n        \/\/ Aktualisieren Sie alle 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        \/\/ Zeichnen Sie alle 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 ist notwendig, da es alle Codezeilen enth\u00e4lt. Ich habe etwas Zeit investiert, um die Dateien zu trennen und die Verzeichnisstruktur zu optimieren. So sieht es jetzt aus:<br \/>\n<i>resources -&gt; Hier sind alle Assets (Bilder)<br \/>\nsrc<br \/>\n \u2014 entities<br \/>\n \u2014 game_object.rs<br \/>\n \u2014 circle.rs<br \/>\n \u2014 main.rs -&gt; Hauptschleife<\/i><\/p>\n<p><b>Menschen, Ebenen und Bilder<\/b><\/p>\n<p>Der n\u00e4chste Schritt besteht darin, das Spielobjekt Person zu erstellen und Bilder zu laden. Alles sollte auf 32*32 Fliesen basieren.<\/p>\n<p><img decoding=\"async\" alt=\"Rust-Spiel in 24 Stunden: pers\u00f6nliche Entwicklungsreise\" src=\"\/wp-content\/uploads\/2019\/03\/265ed79e6784ef0180cfdc5aa8d96a4c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>Tennispl\u00e4tze<\/b><\/p>\n<p>Nachdem ich mir angeschaut habe, wie Tennispl\u00e4tze aussehen, habe ich beschlossen, sie aus 4*2 Fliesen zu erstellen. Zun\u00e4chst konnte ich entweder ein Bild dieser Gr\u00f6\u00dfe erstellen oder 8 separate Fliesen zusammensetzen. Sp\u00e4ter wurde mir klar, dass nur zwei einzigartige Fliesen notwendig sind, und das ist der Grund daf\u00fcr.<\/p>\n<p>Insgesamt haben wir zwei solcher Fliesen: 1 und 2.<\/p>\n<p>Jede Sektion des Courts besteht aus Fliese 1 oder Fliese 2. Diese k\u00f6nnen entweder in der \u00fcblichen Ausrichtung oder um 180 Grad gedreht angeordnet werden.<\/p>\n<p><img decoding=\"async\" alt=\"Rust-Spiel in 24 Stunden: pers\u00f6nliche Entwicklungsreise\" src=\"\/wp-content\/uploads\/2019\/03\/90d07caea0dee8673ada5d44963ab347.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>Hauptmodus der Konstruktion (Zusammenstellung)<\/b><\/p>\n<p>Nachdem es gelungen ist, die Renderings der Pl\u00e4tze, Menschen und Karten zu erstellen, wurde mir klar, dass auch ein Grundmodus der Zusammenstellung notwendig ist. Dies habe ich so umgesetzt: Wenn die Taste gedr\u00fcckt wird, wird das Objekt ausgew\u00e4hlt und ein Klick platziert es an der gew\u00fcnschten Stelle. So erm\u00f6glicht die Taste 1, den Court auszuw\u00e4hlen, w\u00e4hrend die Taste 2 es erm\u00f6glicht, den Spieler auszuw\u00e4hlen.<\/p>\n<p>Es ist jedoch auch erforderlich, sich zu merken, was 1 und 2 bedeuten, deshalb habe ich einen Wireframe hinzugef\u00fcgt, um zu zeigen, welches Objekt ausgew\u00e4hlt ist. So sieht das aus.<\/p>\n<p><img decoding=\"async\" alt=\"Rust-Spiel in 24 Stunden: pers\u00f6nliche Entwicklungsreise\" src=\"\/wp-content\/uploads\/2019\/03\/09b92828fb9b8d4bfa5d5178ca99613c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>Fragen zur Architektur und Refaktorisierung<\/b><\/p>\n<p>Jetzt habe ich mehrere Spielobjekte: Menschen, Courts und Etagen. Um die Wireframes zu aktivieren, muss jedoch jeder Entit\u00e4t des Objekts mitgeteilt werden, ob sich die Objekte im Demomodus befinden oder ob einfach nur ein Rahmen gezeichnet wurde. Das ist nicht sehr praktisch.<\/p>\n<p>Mir schien, dass ich die Architektur neu \u00fcberdenken sollte, um bestimmte Einschr\u00e4nkungen zu erkennen:<\/p>\n<ul>\n<li>Das Vorhandensein einer Entit\u00e4t, die sich selbst darstellt und aktualisiert, ist ein Problem, da diese Entit\u00e4t nicht \u201eerkennen\u201c kann, was sie rendern soll \u2013 entweder ein Bild oder ein Wireframe.<\/li>\n<li>Das Fehlen eines Tools zum Austausch von Eigenschaften und Verhalten zwischen einzelnen Entit\u00e4ten (zum Beispiel die Eigenschaft is_build_mode oder das Rendering von Verhalten). Man k\u00f6nnte Vererbung verwenden, obwohl es in Rust keine ordentliche M\u00f6glichkeit gibt, dies umzusetzen. Was ich wirklich ben\u00f6tigte, war Komposition.<\/li>\n<li>Ein Tool, um die Interaktion zwischen Entit\u00e4ten zu erm\u00f6glichen, war erforderlich, um Personen den Pl\u00e4tzen zuzuweisen.<\/li>\n<li>Die Entit\u00e4ten selbst waren eine Mischung aus Daten und Logik, was sehr schnell au\u00dfer Kontrolle geriet.<\/li>\n<\/ul>\n<p><\/p>\n<blockquote><p><i>Ich habe zus\u00e4tzliche Recherchen durchgef\u00fchrt und die Architektur entdeckt, <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Entity_component_system\">ECS \u2013 Entity Component System<\/a><\/noindex>, die normalerweise in Spielen verwendet wird. Hier sind die Vorteile von ECS:<\/p>\n<ul>\n<li>Daten sind von der Logik getrennt;<\/li>\n<li>Komposition statt Vererbung;<\/li>\n<li>Eine datenzentrierte Architektur.<\/li>\n<\/ul>\n<p><\/i><\/p><\/blockquote>\n<p>\nECS zeichnet sich durch drei grundlegende Konzepte aus:<\/p>\n<ul>\n<li>Entit\u00e4ten \u2013 ein Objekttyp, auf den sich ein Identifikator bezieht (das kann ein Spieler, ein Ball oder etwas anderes sein);<\/li>\n<li>Komponenten \u2013 aus denen Entit\u00e4ten bestehen. Ein Beispiel \u2013 Rendering-, Positions- und andere Komponenten. Dies sind Datenspeicher;<\/li>\n<li>Systeme \u2013 sie nutzen sowohl Objekte als auch Komponenten und enthalten zus\u00e4tzlich Verhalten und Logik, die auf diesen Daten basieren. Ein Beispiel \u2013 ein Rendering-System, das alle Entit\u00e4ten mit Komponenten zum Rendern durchl\u00e4uft und f\u00fcr das Zeichnen verantwortlich ist.<\/li>\n<\/ul>\n<p>\nNach der Analyse wurde klar, dass ECS folgende Probleme l\u00f6st:<\/p>\n<ul>\n<li>Verwendung von Komposition anstelle von Vererbung zur systematischen Organisation von Entit\u00e4ten; <\/li>\n<li>Beseitigung von Code-Mischung durch Verwaltungssysteme; <\/li>\n<li>Verwendung von Methoden wie is_build_mode, um die Logik des Wireframes am selben Ort zu speichern \u2013 im Rendering-System.<\/li>\n<\/ul>\n<p>\nHier ist das Ergebnis nach der Implementierung von ECS.<\/p>\n<p><i>resources -&gt; Hier sind alle Assets (Bilder)<br \/>\nsrc<br \/>\n \u2013 Komponenten<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 Ressourcen<br \/>\n \u2013 mouse.rs<br \/>\n \u2013 Systeme<br \/>\n \u2013 rendering.rs<br \/>\n \u2013 constants.rs<br \/>\n \u2013 utils.rs<br \/>\n \u2013 world_factory.rs -&gt; Funktionen zur Weltfabrik<br \/>\n \u2014 main.rs -&gt; Hauptschleife<\/i><\/p>\n<h3>Wir weisen Personen den Pl\u00e4tzen zu<\/h3>\n<p>\nECS hat das Leben erleichtert. Jetzt hatte ich einen systematischen Weg, Daten zu Entit\u00e4ten hinzuzuf\u00fcgen und Logik basierend auf diesen Daten zu integrieren. Das erm\u00f6glichte es mir, die Verteilung von Personen auf den Pl\u00e4tzen zu organisieren.<\/p>\n<p>Was ich getan habe:<\/p>\n<ul>\n<li>Ich habe Daten zu den zugewiesenen Pl\u00e4tzen in Person hinzugef\u00fcgt;<\/li>\n<li>Ich habe Daten zu den verteilten Personen im TennisCourt hinzugef\u00fcgt;<\/li>\n<li>Ich habe das CourtChoosingSystem hinzugef\u00fcgt, das es erm\u00f6glicht, Personen und Pl\u00e4tze zu analysieren, verf\u00fcgbare Pl\u00e4tze zu entdecken und Spieler darauf zuzuweisen;<\/li>\n<li>Ich habe das System PersonMovementSystem hinzugef\u00fcgt, das nach den auf den Pl\u00e4tzen zugewiesenen Personen sucht und, falls sie dort nicht sind, die Personen dorthin sendet, wo sie ben\u00f6tigt werden.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Rust-Spiel in 24 Stunden: pers\u00f6nliche Entwicklungsreise\" src=\"\/wp-content\/uploads\/2019\/03\/f2e4632de2cb9d1c3ec7c9d9310b8170.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <\/p>\n<h3>Zusammenfassung<\/h3>\n<p>\nEs hat mir sehr gefallen, an diesem einfachen Spiel zu arbeiten. Dar\u00fcber hinaus bin ich froh, dass ich f\u00fcr die Entwicklung Rust verwendet habe, da:<\/p>\n<ul>\n<li>Rust liefert, was man braucht;<\/li>\n<li>es hat eine hervorragende Dokumentation und ist sehr elegant;<\/li>\n<li>Konsistenz ist gro\u00dfartig;<\/li>\n<li>man muss nicht auf Klonen, Kopieren oder \u00e4hnliche Aktionen zur\u00fcckgreifen, die ich oft in C++ gemacht habe;<\/li>\n<li>Options sind sehr praktisch, sie behandeln auch Fehler hervorragend;<\/li>\n<li>Wenn das Projekt kompiliert wird, funktioniert es zu 99%, genau so, wie es sollte. Die Fehlermeldungen des Compilers sind meiner Meinung nach die besten, die ich je gesehen habe.<\/li>\n<\/ul>\n<p>\nDie Entwicklung von Spielen in Rust befindet sich noch am Anfang. Es gibt jedoch bereits eine stabile und recht gro\u00dfe Community, die daran arbeitet, Rust f\u00fcr alle zug\u00e4nglich zu machen. Daher blicke ich optimistisch in die Zukunft der Sprache und freue mich auf die Ergebnisse unserer gemeinsamen Anstrengungen.<\/p>\n<blockquote><p><b>Skillbox empfiehlt:<\/b><\/p>\n<ul>\n<li>Online-Kurs <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\">\u201eBeruf Frontend-Entwickler\u201c<\/a><\/noindex>.<\/li>\n<li>Praktischer 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\">\u201eMobile Entwickler PRO\u201c<\/a><\/noindex>.<\/li>\n<li>Praktischer Jahreskurs <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\">PHP-Entwickler \u2013 von 0 zu PRO<\/a><\/noindex>.<\/li>\n<\/ul>\n<p>\n<\/p><\/blockquote>\n<p>Quelle: <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 4.9.10 - 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 \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.\" \/>\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\/de\/blog\/igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\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 \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.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/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\udd47 Programmierung in Rust innerhalb von 24 Stunden: pers\u00f6nliche Erfahrungen in der Entwicklung | ProHoster","description":"In diesem Artikel teile ich meine pers\u00f6nlichen Erfahrungen bei der Entwicklung eines kleinen Spiels in Rust. Die Erstellung einer funktionierenden Version hat etwa 24 Stunden in Anspruch genommen (haupts\u00e4chlich arbeitete ich abends oder am Wochenende). Das Spiel ist noch lange nicht abgeschlossen, aber ich denke, die Erfahrung wird n\u00fctzlich sein. Ich werde erl\u00e4utern, was ich gelernt habe, und einige Beobachtungen beim Spielaufbau von Grund auf schildern.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","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 \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.","og:url":"https:\/\/prohoster.info\/de\/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"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/29846","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=29846"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/29846\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=29846"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=29846"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=29846"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}