{"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\/it\/blog\/igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki","title":{"rendered":"Gioco su Rust in 24 ore: esperienza personale di sviluppo","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Gioco su Rust in 24 ore: esperienza personale di sviluppo\" src=\"\/wp-content\/uploads\/2019\/03\/ea25406c43ac90ce2e33e290168d1083.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIn questo articolo condivider\u00f2 la mia esperienza nello sviluppo di un piccolo gioco su Rust. La creazione della versione funzionante ha richiesto circa 24 ore (principalmente lavoravo di sera o nei fine settimana). Il gioco \u00e8 ancora lontano dal completamento, ma penso che l'esperienza sar\u00e0 utile. Racconter\u00f2 ci\u00f2 che ho imparato e alcune osservazioni fatte durante la costruzione del gioco da zero.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<blockquote><p><b>Skillbox consiglia:<\/b> Corso pratico di due anni <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\">\u00abIo sono un sviluppatore web PRO\u00bb<\/a><\/noindex>.<\/p>\n<p><b>Ricordiamo:<\/b> <i>per tutti i lettori di \u00abHabr\u00bb \u2014 sconto di 10.000 rubli per l'iscrizione a qualsiasi corso Skillbox con il codice promozionale \u00abHabr\u00bb.<\/i><\/p><\/blockquote>\n<p><\/p>\n<h3>Perch\u00e9 Rust?<\/h3>\n<p>\nHo scelto questo linguaggio perch\u00e9 ne ho sentito parlare molto bene e vedo che sta diventando sempre pi\u00f9 popolare nel campo dello sviluppo di giochi. Prima di scrivere il gioco, avevo un'esperienza limitata nello sviluppo di semplici applicazioni su Rust. Questo \u00e8 stato sufficiente per sentire una certa libert\u00e0 durante la scrittura del gioco.<\/p>\n<h3>Perch\u00e9 un gioco e che tipo di gioco?<\/h3>\n<p>\nCreare giochi \u00e8 divertente! Vorrei avere pi\u00f9 motivi per farlo, ma per i progetti \"casalinghi\" scelgo temi che non sono troppo legati al mio lavoro consueto. Che gioco \u00e8? Volevo realizzare qualcosa come un simulatore di tennis, dove si fondono Cities Skylines, Zoo Tycoon, Prison Architect e, ovviamente, il tennis. In breve, \u00e8 venuto fuori un gioco su un'accademia di tennis, dove le persone vengono a giocare.<\/p>\n<h3>Formazione tecnica<\/h3>\n<p>\nVolevo utilizzare Rust, ma non sapevo esattamente quanto fosse necessario partire da zero. Non volevo scrivere shader pixel e usare drag-and-drop, quindi cercavo le soluzioni pi\u00f9 flessibili.<\/p>\n<p>Ho trovato risorse utili che voglio condividere con voi:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/arewegameyet.com\/\">Are we game yet<\/a><\/noindex> \u2014 un elenco degli elementi necessari per lo sviluppo di giochi in Rust;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.reddit.com\/r\/rust_gamedev\">Subreddit sullo sviluppo di giochi in Rust;<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/kenney.nl\">Pixel art gratuita.<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nHo esaminato alcuni motori di gioco in Rust, scegliendo infine Piston e ggez. Li avevo gi\u00e0 incontrati lavorando al progetto precedente. Alla fine, ho scelto ggez, poich\u00e9 mi \u00e8 sembrato il pi\u00f9 adatto per realizzare un piccolo gioco 2D. La struttura modulare di Piston \u00e8 troppo complessa per un sviluppatore alle prime armi (o per chi lavora per la prima volta con Rust).<\/p>\n<h3>Struttura del gioco<\/h3>\n<p>\nHo dedicato un po' di tempo a riflettere sull'architettura del progetto. Il primo passo \u00e8 creare il 'terreno', le persone e i campi da tennis. Le persone devono muoversi sui campi e aspettare. I giocatori devono avere abilit\u00e0 che si affinano nel tempo. Inoltre, deve esserci un editor che consenta di aggiungere nuove persone e campi, ma questo non sar\u00e0 gratuito.<\/p>\n<p>Dopo aver riflettuto su tutto, ho iniziato a lavorare. <\/p>\n<h3>Creazione di un gioco<\/h3>\n<p>\n<b>Inizio: cerchi e astrazioni<\/b><\/p>\n<p>Ho preso spunto da ggez e ho visualizzato un cerchio sullo schermo. Straordinario! Ora un po' di astrazioni. Ho pensato che fosse una buona idea astrarre il concetto di oggetto di gioco. Ogni oggetto deve essere reso e aggiornato come indicato qui:<\/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>\nQuesto frammento di codice mi ha permesso di ottenere un ottimo elenco di oggetti che posso aggiornare e rendere in un ciclo altrettanto valido.<\/p>\n<pre><code class=\"rust\">mpl event::EventHandler for MainState {\n    fn update(&amp;mut self, context: &amp;mut Context) -&gt; GameResult {\n        \/\/ Aggiorna tutti gli oggetti\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        \/\/ Disegna tutti gli oggetti\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 \u00e8 necessario perch\u00e9 contiene tutte le righe di codice. Ho impiegato un po' di tempo a suddividere i file e ottimizzare la struttura delle directory. Ecco come \u00e8 apparso tutto dopo questo:<br \/>\n<i>resources -&gt; qui si trovano tutte le risorse (immagini)<br \/>\nsrc<br \/>\n \u2014 entit\u00e0<br \/>\n \u2014 game_object.rs<br \/>\n \u2014 circle.rs<br \/>\n \u2014 main.rs -&gt; ciclo principale<\/i><\/p>\n<p><b>Persone, piani e immagini<\/b><\/p>\n<p>La fase successiva consiste nella creazione dell'oggetto di gioco Person e nel caricamento delle immagini. Tutto deve basarsi su tasselli delle dimensioni 32*32.<\/p>\n<p><img decoding=\"async\" alt=\"Gioco su Rust in 24 ore: esperienza personale di sviluppo\" src=\"\/wp-content\/uploads\/2019\/03\/265ed79e6784ef0180cfdc5aa8d96a4c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>Campi da tennis<\/b><\/p>\n<p>Dopo aver studiato l'aspetto dei campi da tennis, ho deciso di realizzarli utilizzando tasselli di 4*2. Inizialmente avrei potuto creare un'immagine di tale dimensione o comporre insieme 8 tasselli separati. Ma poi ho capito che erano necessarie solo due tessere uniche, ecco perch\u00e9.<\/p>\n<p>In totale abbiamo due di queste tessere: 1 e 2.<\/p>\n<p>Ogni sezione del campo \u00e8 composta da tessera 1 o tessera 2. Possono essere disposte normalmente o capovolte di 180 gradi.<\/p>\n<p><img decoding=\"async\" alt=\"Gioco su Rust in 24 ore: esperienza personale di sviluppo\" src=\"\/wp-content\/uploads\/2019\/03\/90d07caea0dee8673ada5d44963ab347.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>Modalit\u00e0 di costruzione principale<\/b><\/p>\n<p>Dopo aver ottenuto il rendering delle aree, delle persone e delle mappe, ho capito che era necessario implementare anche una modalit\u00e0 di costruzione di base. L'ho realizzata in questo modo: quando si preme un pulsante, l'oggetto viene selezionato e un clic lo posiziona nel punto desiderato. Cos\u00ec, il pulsante 1 consente di scegliere il campo, mentre il pulsante 2 permette di selezionare il giocatore.<\/p>\n<p>Ma dobbiamo anche ricordare cosa significano 1 e 2, quindi ho aggiunto un wireframe per rendere chiaro quale oggetto \u00e8 selezionato. Ecco come appare.<\/p>\n<p><img decoding=\"async\" alt=\"Gioco su Rust in 24 ore: esperienza personale di sviluppo\" src=\"\/wp-content\/uploads\/2019\/03\/09b92828fb9b8d4bfa5d5178ca99613c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<b>Domande sull'architettura e sul refactoring<\/b><\/p>\n<p>Ora ho diversi oggetti di gioco: persone, campi e piani. Tuttavia, affinch\u00e9 i wireframe funzionino, ogni entit\u00e0 dell'oggetto deve informare se gli oggetti stessi sono in modalit\u00e0 di dimostrazione o se \u00e8 semplicemente disegnata una cornice. Questo non \u00e8 molto conveniente.<\/p>\n<p>Mi \u00e8 sembrato necessario ripensare l'architettura in modo da evidenziare alcune limitazioni:<\/p>\n<ul>\n<li>la presenza di un'entit\u00e0 che si mostra e si aggiorna da sola \u00e8 un problema, poich\u00e9 tale entit\u00e0 non sar\u00e0 in grado di 'sapere' cosa deve rendere: immagine e wireframe;<\/li>\n<li>l'assenza di uno strumento per scambiare propriet\u00e0 e comportamenti tra entit\u00e0 separate (ad esempio, la propriet\u00e0 is_build_mode o il rendering del comportamento). Si potrebbe utilizzare l'ereditariet\u00e0, anche se in Rust non c'\u00e8 un modo corretto per implementarla. Quello di cui avevo realmente bisogno era la composizione;<\/li>\n<li>uno strumento per far interagire le entit\u00e0 tra loro era necessario per assegnare persone ai campi;<\/li>\n<li>le entit\u00e0 stesse erano una miscela di dati e logica, il che rapidamente sfuggiva al controllo.<\/li>\n<\/ul>\n<p><\/p>\n<blockquote><p><i>Ho condotto ulteriori ricerche e ho scoperto l'architettura <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Entity_component_system\">ECS \u2014 Entity Component System<\/a><\/noindex>, che viene comunemente utilizzata nei giochi. Ecco i vantaggi dell'ECS:<\/p>\n<ul>\n<li>i dati sono separati dalla logica;<\/li>\n<li>composizione invece di ereditariet\u00e0;<\/li>\n<li>un'architettura orientata ai dati.<\/li>\n<\/ul>\n<p><\/i><\/p><\/blockquote>\n<p>\nPer l'ECS ci sono tre concetti di base:<\/p>\n<ul>\n<li>entit\u00e0 \u2014 un tipo di oggetto a cui fa riferimento un identificatore (pu\u00f2 essere un giocatore, una palla o altro);<\/li>\n<li>componenti \u2014 di cui sono composte le entit\u00e0. Esempio \u2014 componente di rendering, posizione e altri. Questi sono archivi di dati;<\/li>\n<li>I sistemi utilizzano sia oggetti che componenti, e contengono comportamenti e logiche basati su questi dati. Un esempio \u00e8 un sistema di rendering che esamina tutte le entit\u00e0 con componenti per il rendering e si occupa della visualizzazione.<\/li>\n<\/ul>\n<p>\nDopo aver approfondito, \u00e8 diventato chiaro che l'ECS risolve problemi come:<\/p>\n<ul>\n<li>l'uso della composizione invece dell'ereditariet\u00e0 per organizzare sistematicamente le entit\u00e0; <\/li>\n<li>la semplificazione del codice tramite sistemi di gestione; <\/li>\n<li>l'uso di metodi come is_build_mode, per mantenere la logica del wireframe nello stesso luogo: nel sistema di rendering.<\/li>\n<\/ul>\n<p>\nEcco il risultato dopo l'introduzione dell'ECS.<\/p>\n<p><i>resources -&gt; qui si trovano tutte le risorse (immagini)<br \/>\nsrc<br \/>\n \u2014 components<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 resources<br \/>\n \u2014 mouse.rs<br \/>\n \u2014 systems<br \/>\n \u2014 rendering.rs<br \/>\n \u2014 constants.rs<br \/>\n \u2014 utils.rs<br \/>\n \u2014 world_factory.rs -&gt; funzioni del world factory<br \/>\n \u2014 main.rs -&gt; ciclo principale<\/i><\/p>\n<h3>Assegniamo le persone ai campi<\/h3>\n<p>\nL'ECS ha semplificato la vita. Ora avevo un modo sistematico per aggiungere dati alle entit\u00e0 e per aggiungere logica basata su questi dati. Questo, a sua volta, ha consentito di organizzare la distribuzione delle persone sui campi.<\/p>\n<p>Cosa ho fatto:<\/p>\n<ul>\n<li>ho aggiunto dati sui campi assegnati in Person;<\/li>\n<li>ho aggiunto dati sulle persone assegnate in TennisCourt;<\/li>\n<li>ho aggiunto il CourtChoosingSystem, che consente di analizzare persone e strutture, scoprire i campi disponibili e assegnare i giocatori a essi;<\/li>\n<li>ho integrato il sistema PersonMovementSystem, che cerca le persone assegnate ai campi e, se non ci sono, le invia dove necessario.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Gioco su Rust in 24 ore: esperienza personale di sviluppo\" src=\"\/wp-content\/uploads\/2019\/03\/f2e4632de2cb9d1c3ec7c9d9310b8170.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <\/p>\n<h3>Tiriamo le somme<\/h3>\n<p>\nMi \u00e8 piaciuto molto lavorare su questo semplice gioco. Inoltre, sono soddisfatta di aver utilizzato Rust per scriverlo, poich\u00e9:<\/p>\n<ul>\n<li>Rust ti fornisce ci\u00f2 di cui hai bisogno;<\/li>\n<li>ha una documentazione eccellente e Rust \u00e8 molto elegante;<\/li>\n<li>la costanza \u00e8 fantastica;<\/li>\n<li>non devo ricorrere a clonazione, copia o altre azioni simili, cosa che spesso facevo in C++;<\/li>\n<li>Options sono molto pratiche da usare e gestiscono anche bene gli errori;<\/li>\n<li>se il progetto riesce a compilarsi, nel 99% dei casi funziona esattamente come dovrebbe. I messaggi di errore del compilatore sono, a mio avviso, i migliori che abbia mai visto.<\/li>\n<\/ul>\n<p>\nLo sviluppo di giochi in Rust \u00e8 appena iniziato. Ma c'\u00e8 gi\u00e0 una comunit\u00e0 stabile e piuttosto ampia che lavora per rendere Rust accessibile a tutti. Pertanto, guardo al futuro del linguaggio con ottimismo, aspettandomi con impazienza i risultati del nostro lavoro comune.<\/p>\n<blockquote><p><b>Skillbox consiglia:<\/b><\/p>\n<ul>\n<li>Corso 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\">\u00abProfessione frontend developer\u00bb<\/a><\/noindex>.<\/li>\n<li>Corso pratico <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\">\u00abSviluppatore mobile PRO\u00bb<\/a><\/noindex>.<\/li>\n<li>Corso pratico annuale <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\">\u00abSviluppatore PHP da 0 a PRO\u00bb<\/a><\/noindex>.<\/li>\n<\/ul>\n<p>\n<\/p><\/blockquote>\n<p>Fonte: <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.0.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\/it\/blog\/igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\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\/it\/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\udd47Giocare a Rust in 24 ore: esperienza personale di sviluppo | ProHoster","description":"In questo articolo condivider\u00f2 la mia esperienza personale.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/igra-na-rust-za-24-chasa-lichnyj-opyt-razrabotki","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","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\/it\/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\/it\/wp-json\/wp\/v2\/posts\/29846","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=29846"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/29846\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=29846"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=29846"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=29846"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}