Se hai già messo le mani su XNA, conosci lo schema: una classe di gioco, un metodo che aggiorna la logica, un metodo che disegna, e tutto gira in C#. MonoGame riprende esattamente questa idea e la porta avanti dove Microsoft si era fermata. Il framework è open source, funziona su Windows, macOS e Linux e permette di esportare su mobile e console. È un punto di partenza onesto per creare un gioco 2D senza passare da un motore completo.
Che cos'è MonoGame, concretamente
MonoGame non è un motore con un editor, una scena e un inspector. È una libreria: gestisce la finestra, la grafica, l'audio e l'input di tastiera, gamepad e mouse, poi lascia a te tutto il resto. Non esiste il trascinamento di oggetti. Decidi tu come strutturare il codice, come caricare un livello, come gestire le collisioni. All'inizio richiede più lavoro rispetto a Unity o Godot, ed è anche per questo che si impara molto.
Il progetto è nato come reimplementazione di XNA 4, ed è per questo che i vecchi tutorial XNA funzionano quasi senza modifiche. Se vuoi vedere da dove arriva questa filosofia, la nostra guida Hello World con XNA 4.0 (in francese) ne spiega le basi.
Installare MonoGame e creare il primo progetto
Serve l'SDK di .NET installato, poi bastano due comandi in un terminale. Il primo installa i modelli di progetto, il secondo crea un gioco desktop multipiattaforma basato su OpenGL.
dotnet new install MonoGame.Templates.CSharp
dotnet new mgdesktopgl -n MioPrimoGioco
cd MioPrimoGioco
dotnet run
Si apre una finestra blu, che è il colore di sfondo predefinito e dimostra che tutto funziona. Lo stesso progetto si apre senza modifiche in Visual Studio, Visual Studio Code o Rider.
La struttura di un progetto MonoGame
Nella cartella appena creata il primo file da aprire è Game1.cs. Contiene quattro metodi che formano la spina dorsale di ogni gioco MonoGame. Initialize prepara le variabili, LoadContent carica immagini e suoni, Update fa avanzare la logica a ogni fotogramma e Draw mostra il risultato. Il framework chiama Update e poi Draw circa sessanta volte al secondo, e riempire questi due metodi spetta a te.
Ecco un esempio breve che mostra uno sprite e lo muove con le frecce della tastiera.
private Texture2D _giocatore;
private Vector2 _posizione = new Vector2(100, 100);
protected override void LoadContent()
{
_spriteBatch = new SpriteBatch(GraphicsDevice);
_giocatore = Content.Load<Texture2D>("giocatore");
}
protected override void Update(GameTime gameTime)
{
var tastiera = Keyboard.GetState();
float velocita = 200f * (float)gameTime.ElapsedGameTime.TotalSeconds;
if (tastiera.IsKeyDown(Keys.Right)) _posizione.X += velocita;
if (tastiera.IsKeyDown(Keys.Left)) _posizione.X -= velocita;
if (tastiera.IsKeyDown(Keys.Down)) _posizione.Y += velocita;
if (tastiera.IsKeyDown(Keys.Up)) _posizione.Y -= velocita;
base.Update(gameTime);
}
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
_spriteBatch.Begin();
_spriteBatch.Draw(_giocatore, _posizione, Color.White);
_spriteBatch.End();
base.Draw(gameTime);
}
Il dettaglio importante è la moltiplicazione per ElapsedGameTime, che rende il movimento indipendente dalla velocità del computer. Senza di essa il personaggio andrebbe il doppio più veloce su una macchina che produce il doppio dei fotogrammi.
La Content Pipeline per immagini e suoni
Le risorse passano da uno strumento chiamato Content Pipeline. Apri il file Content.mgcb nell'editor MGCB, aggiungi l'immagine giocatore.png e viene convertita in un formato ottimizzato che Content.Load sa leggere. Il nome usato nel codice è quello del file senza estensione. Se il caricamento fallisce all'avvio, la causa è quasi sempre un file dimenticato in quell'elenco.
Per quali progetti MonoGame è una buona scelta
Il framework va bene per giochi 2D, prototipi veloci, platform, giochi di ruolo con vista dall'alto e tutti i progetti in cui vuoi controllare ogni riga di codice. Diversi giochi indipendenti noti sono costruiti con MonoGame. Se invece ti servono un editor visuale, un sistema di particelle già pronto o una 3D avanzata, un motore completo ti fa risparmiare tempo. Il nostro confronto Unreal Engine, Unity o Godot e l'articolo su Godot 4 o Unity per un primo gioco aiutano a scegliere in base al progetto.
Come continuare
Un buon secondo esercizio consiste nell'aggiungere un nemico, rilevare la collisione tra due rettangoli con Rectangle.Intersects e mostrare un punteggio con una SpriteFont. Con questi tre elementi hai i meccanismi di un piccolo gioco completo. Il resto è organizzazione del codice e idee di game design.







0 Commenti