{"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":"Spielentwicklung in Rust innerhalb von 24 Stunden: pers\u00f6nliche Erfahrungen","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Spielentwicklung in Rust innerhalb von 24 Stunden: pers\u00f6nliche Erfahrungen\" src=\"\/wp-content\/uploads\/2019\/03\/ea25406c43ac90ce2e33e290168d1083.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIn diesem Artikel berichte ich von meinen pers\u00f6nlichen Erfahrungen bei der Entwicklung eines kleinen Spiels in Rust. Die Erstellung einer funktionierenden Version hat etwa 24 Stunden in Anspruch genommen (\u00fcberwiegend habe ich abends oder am Wochenende gearbeitet). Das Spiel ist noch lange nicht fertig, aber ich denke, dass die Erfahrung n\u00fctzlich sein wird. Ich werde erz\u00e4hlen, was ich gelernt habe, und einige Beobachtungen teilen, die ich beim Aufbau des Spiels von Grund auf gemacht habe.<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\">\u201eIch bin PRO-Webentwickler\u201c<\/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 Gutes dar\u00fcber geh\u00f6rt habe und sehe, dass sie in der Spieleentwicklung immer popul\u00e4rer wird. Vor der Spieleentwicklung hatte ich ein wenig Erfahrung in der Erstellung einfacher Anwendungen in Rust. Das war gerade genug, um ein gewisses Ma\u00df an Freiheit beim Schreiben des Spiels zu erleben.<\/p>\n<h3>Warum ein Spiel und welches Spiel?<\/h3>\n<p>\nSpiele zu entwickeln macht Spa\u00df! Ich w\u00fcnschte, es g\u00e4be mehr Gr\u00fcnde, aber f\u00fcr \u201eh\u00e4usliche\u201c Projekte w\u00e4hle ich Themen, die nicht zu eng mit meiner regul\u00e4ren Arbeit verbunden sind. Welches Spiel? Ich wollte etwas in der Art eines Tennissimulators schaffen, der Cities Skylines, Zoo Tycoon, Prison Architect und eben Tennis vereint. Insgesamt handelt es sich um ein Spiel \u00fcber eine Tennisschule, zu der Leute zum Spielen kommen.<\/p>\n<h3>Technische Vorbereitung<\/h3>\n<p>\nIch wollte Rust verwenden, wusste aber nicht genau, wie sehr ich bei Null anfangen m\u00fcsste. Ich wollte keine Pixel-Shader schreiben und Drag-and-Drop verwenden, also suchte ich nach den flexibelsten L\u00f6sungen.<\/p>\n<p>Ich fand n\u00fctzliche Ressourcen, 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 f\u00fcr die Spieleentwicklung ben\u00f6tigten Rust-Elemente;<\/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 mir mehrere Rust-Spiel-Engines angesehen und mich schlie\u00dflich f\u00fcr Piston und ggez entschieden. Mit diesen hatte ich bereits bei einem vorherigen Projekt gearbeitet. Letztendlich w\u00e4hlte ich ggez, da es sich als passender f\u00fcr die Umsetzung eines kleinen 2D-Spiels anbot. 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>Die Struktur des Spiels<\/h3>\n<p>\nIch habe etwas Zeit damit verbracht, \u00fcber die Architektur des Projekts nachzudenken. Der erste Schritt ist, \u201eLand\u201c, Menschen und Tennispl\u00e4tze zu schaffen. Die Menschen sollen sich \u00fcber die Pl\u00e4tze 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 Menschen und Pl\u00e4tze hinzuzuf\u00fcgen, aber das ist nicht kostenlos.<\/p>\n<p>Nachdem ich alles durchdacht hatte, begann ich mit der Arbeit. <\/p>\n<h3>Spielerstellung<\/h3>\n<p>\n<b>Beginn: Kreise und Abstraktionen<\/b><\/p>\n<p>Ich habe ein Beispiel aus ggez genommen und einen Kreis auf dem Bildschirm erhalten. Unglaublich! Jetzt ein wenig Abstraktionen. Ich dachte, es w\u00e4re gut, von der Idee eines Spielobjekts abzusehen. 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 hat es mir erm\u00f6glicht, eine tolle Liste von Objekten zu erhalten, die ich in einem nicht weniger gro\u00dfartigen 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        \/\/ Aktualisiere 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        \/\/ Zeichne 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 dort alle Codezeilen enthalten sind. Ich habe etwas Zeit damit verbracht, die Dateien zu trennen und die Verzeichnisstruktur zu optimieren. So sieht es danach 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, Pl\u00e4tze und Bilder<\/b><\/p>\n<p>Der n\u00e4chste Schritt ist die Erstellung des Spielobjekts Person und das Laden der Bilder. Alles sollte auf 32*32 Kacheln basieren.<\/p>\n<p><img decoding=\"async\" alt=\"Spielentwicklung in Rust innerhalb von 24 Stunden: pers\u00f6nliche Erfahrungen\" 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 untersucht hatte, wie Tennispl\u00e4tze aussehen, entschied ich mich, sie aus 4*2 Kacheln zu erstellen. Zun\u00e4chst h\u00e4tte man ein Bild in dieser Gr\u00f6\u00dfe erstellen oder 8 separate Kacheln zusammenstellen k\u00f6nnen. Aber dann erkannte ich, dass nur zwei einzigartige Kacheln ben\u00f6tigt werden, und hier ist der Grund.<\/p>\n<p>Insgesamt haben wir zwei solche Kacheln: 1 und 2.<\/p>\n<p>Jeder Abschnitt des Platzes besteht aus Kachel 1 oder Kachel 2. Sie k\u00f6nnen normal angeordnet oder um 180 Grad gedreht sein.<\/p>\n<p><img decoding=\"async\" alt=\"Spielentwicklung in Rust innerhalb von 24 Stunden: pers\u00f6nliche Erfahrungen\" src=\"\/wp-content\/uploads\/2019\/03\/90d07caea0dee8673ada5d44963ab347.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>Hauptmodus des Bauens (Zusammenbau)<\/b><\/p>\n<p>Nachdem ich die Anzeige der Pl\u00e4tze, Menschen und Karten erreicht hatte, wurde mir klar, dass auch ein grundlegender Zusammenbaubereich erforderlich ist. Ich habe ihn so implementiert: 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 die Auswahl des Platzes, w\u00e4hrend die Taste 2 die Auswahl des Spielers erlaubt.<\/p>\n<p>Aber ich muss auch im Ged\u00e4chtnis behalten, was 1 und 2 bedeutet, also habe ich ein Wireframe hinzugef\u00fcgt, um deutlich zu machen, welches Objekt ausgew\u00e4hlt ist. So sieht es aus.<\/p>\n<p><img decoding=\"async\" alt=\"Spielentwicklung in Rust innerhalb von 24 Stunden: pers\u00f6nliche Erfahrungen\" src=\"\/wp-content\/uploads\/2019\/03\/09b92828fb9b8d4bfa5d5178ca99613c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>Fragen zur Architektur und zum Refactoring<\/b><\/p>\n<p>Jetzt habe ich mehrere Spielobjekte: Menschen, Pl\u00e4tze und Etagen. Aber damit die Wireframes funktionieren, muss jeder Entit\u00e4t des Objekts mitgeteilt werden, ob die Objekte im Demomodus oder nur mit einem Rahmen dargestellt werden. Das ist nicht ganz praktisch.<\/p>\n<p>Mir schien, dass die Architektur so neu durchdacht werden muss, dass einige Einschr\u00e4nkungen deutlich werden:<\/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 Bild oder Wireframe;<\/li>\n<li>Das Fehlen eines Werkzeugs zum Austausch von Eigenschaften und Verhalten zwischen einzelnen Entit\u00e4ten (z. B. die Eigenschaft is_build_mode oder das Rendern von Verhalten). Man k\u00f6nnte Vererbung verwenden, obwohl es in Rust keinen normalen Weg zur Implementierung gibt. Was ich wirklich brauchte, war Komposition;<\/li>\n<li>Ein Werkzeug zur Interaktion der Entit\u00e4ten miteinander war n\u00f6tig, um Personen den Pl\u00e4tzen zuzuweisen;<\/li>\n<li>Die Entit\u00e4ten selbst stellten eine Mischung aus Daten und Logik dar, was sehr schnell au\u00dfer Kontrolle geriet.<\/li>\n<\/ul>\n<p><\/p>\n<blockquote><p><i>Ich habe eine zus\u00e4tzliche Untersuchung 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 Logik getrennt;<\/li>\n<li>Komposition statt Vererbung;<\/li>\n<li>Datenzentrierte Architektur.<\/li>\n<\/ul>\n<p><\/i><\/p><\/blockquote>\n<p>\nF\u00fcr ECS sind drei grundlegende Konzepte charakteristisch:<\/p>\n<ul>\n<li>Entit\u00e4ten \u2013 eine Art Objekt, auf das sich die Identifikation bezieht (das kann ein Spieler, ein Ball oder etwas anderes sein);<\/li>\n<li>Komponenten \u2013 aus denen die Entit\u00e4ten bestehen. Beispiel \u2013 Rendering-, Positions- und andere Komponenten. Dies sind Datenspeicher;<\/li>\n<li>Systeme \u2013 sie verwenden sowohl Objekte als auch Komponenten und enthalten Verhalten und Logik, die auf diesen Daten basieren. Beispiel \u2013 ein Rendering-System, das alle Entit\u00e4ten mit Rendering-Komponenten durchl\u00e4uft und sich um das Rendern k\u00fcmmert.<\/li>\n<\/ul>\n<p>\nNach dem Studium wurde klar, dass ECS folgende Probleme l\u00f6st:<\/p>\n<ul>\n<li>Verwendung von Komposition statt Vererbung f\u00fcr die systematische Organisation von Entit\u00e4ten; <\/li>\n<li>Beseitigung von Codemischung 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>\nSo sieht es nach der Implementierung von ECS aus.<\/p>\n<p><i>resources -&gt; hier sind alle Assets (Bilder)<br \/>\nsrc<br \/>\n \u2014 Komponenten<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 Ressourcen<br \/>\n \u2014 mouse.rs<br \/>\n \u2014 Systeme<br \/>\n \u2014 rendering.rs<br \/>\n \u2014 constants.rs<br \/>\n \u2014 utils.rs<br \/>\n \u2014 world_factory.rs -&gt; Funktionen der 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 einfacher gemacht. Jetzt hatte ich einen systematischen Weg, um Daten zu Entit\u00e4ten hinzuzuf\u00fcgen und Logik basierend auf diesen Daten zu integrieren. Das erm\u00f6glicht es wiederum, die Verteilung der Personen auf den Pl\u00e4tzen zu organisieren.<\/p>\n<p>Was ich gemacht habe:<\/p>\n<ul>\n<li>Ich habe Daten \u00fcber die zugewiesenen Pl\u00e4tze in Person hinzugef\u00fcgt;<\/li>\n<li>Ich habe Daten \u00fcber die verteilten Personen im TennisCourt hinzugef\u00fcgt;<\/li>\n<li>Ich habe das CourtChoosingSystem hinzugef\u00fcgt, das es erm\u00f6glicht, die Personen und Pl\u00e4tze zu analysieren, verf\u00fcgbare Pl\u00e4tze zu finden und die Spieler darauf zu verteilen;<\/li>\n<li>Ich habe das PersonMovementSystem hinzugef\u00fcgt, das die Personen, die den Pl\u00e4tzen zugewiesen sind, sucht und sie, falls sie nicht dort sind, dorthin sendet, wo sie ben\u00f6tigt werden.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Spielentwicklung in Rust innerhalb von 24 Stunden: pers\u00f6nliche Erfahrungen\" src=\"\/wp-content\/uploads\/2019\/03\/f2e4632de2cb9d1c3ec7c9d9310b8170.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <\/p>\n<h3>Zusammenfassung<\/h3>\n<p>\nIch habe es sehr genossen, an diesem einfachen Spiel zu arbeiten. Dar\u00fcber hinaus bin ich froh, dass ich zur Erstellung Rust verwendet habe, da:<\/p>\n<ul>\n<li>Rust gibt Ihnen, was Sie ben\u00f6tigen;<\/li>\n<li>es hat eine ausgezeichnete Dokumentation, Rust ist sehr elegant;<\/li>\n<li>Konstanz ist gro\u00dfartig;<\/li>\n<li>es ist nicht n\u00f6tig, Klonierung, Kopieren oder \u00e4hnliche Aktionen durchzuf\u00fchren, was ich oft in C++ gemacht habe;<\/li>\n<li>Options sind sehr praktisch in der Handhabung, sie verarbeiten auch Fehler hervorragend;<\/li>\n<li>wenn das Projekt kompiliert werden kann, dann funktioniert es in 99 % der F\u00e4lle so, wie es sollte. Ich denke, die Fehlermeldungen des Compilers sind die besten, die ich je gesehen habe.<\/li>\n<\/ul>\n<p>\nDie Spieleentwicklung mit Rust beginnt gerade erst. Aber es gibt bereits eine stabile und ziemlich gro\u00dfe Community, die daran arbeitet, Rust f\u00fcr alle zug\u00e4nglich zu machen. Deshalb blicke ich optimistisch in die Zukunft der Sprache und freue mich auf die Ergebnisse unserer gemeinsamen Arbeit.<\/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\">\u201eMobiler 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\">\u201ePHP-Entwickler von 0 bis PRO\u201c<\/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 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\/de\/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=\"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.\" \/>\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\udd47Ein Spiel in Rust innerhalb von 24 Stunden: pers\u00f6nliche Erfahrung in der Entwicklung | ProHoster","description":"In diesem Artikel werde ich \u00fcber pers\u00f6nliche Erfahrungen berichten.","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.","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","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"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}]}}