E Questo Codice? – Inizio e Preparazione – XNA Tutorials
Proprio adesso stavo scrivendo il primo articolo della sezione Grafica e stavo pensando: “cavolo, non ho scritto niente di generale riguardo alla struttura del codice?”. Certo, su internet si trovano tonnellate di documentazioni a riguardo, e sullo stesso progetto generato automaticamente troviamo un sacco di commenti utili, se si mastica un pò d’inglese.
Ma vogliamo fare le cose per bene (e io vorrei anche iniziare ad usare sto plugin wordpress per il codice XD) per cui ecco cosa ci ritroviamo davanti all’avvio, nella scheda “Esplora Soluzione”:

Si, il gioco si chiama “GiocoDiProva”. Non saltatemi addosso per l’eccessiva originalità.
Comunque sia, prima di tutto apriamo il file “Program.cs”:
using System;
namespace GiocoDiProva
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
static void Main(string[] args)
{
using (Game1 game = new Game1())
{
game.Run();
}
}
}
}
Questo che vedete è il punto d’ingresso del programma: essendo totalmente ad oggetti il nostro approccio, creiamo un oggetto di tipo Game1 (che rappresenta il nostro gioco) e lo avviamo con il metodo Run(). Niente di più semplice, ma considerate che questo file almeno adesso non lo toccheremo minimamente.
Le cose cambiano per il file Game1.cs, che contiene la definizione della nostra classe principale:
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;
namespace GiocoDiProva
{
/// <summary>
/// This is the main type for your game
/// </summary>
public class Game1 : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
}
/// <summary>
/// Allows the game to perform any initialization it needs to before starting to run.
/// This is where it can query for any required services and load any non-graphic
/// related content. Calling base.Initialize will enumerate through any components
/// and initialize them as well.
/// </summary>
protected override void Initialize()
{
// TODO: Add your initialization logic here
base.Initialize();
}
/// <summary>
/// LoadContent will be called once per game and is the place to load
/// all of your content.
/// </summary>
protected override void LoadContent()
{
// Create a new SpriteBatch, which can be used to draw textures.
spriteBatch = new SpriteBatch(GraphicsDevice);
// TODO: use this.Content to load your game content here
}
/// <summary>
/// UnloadContent will be called once per game and is the place to unload
/// all content.
/// </summary>
protected override void UnloadContent()
{
// TODO: Unload any non ContentManager content here
}
/// <summary>
/// Allows the game to run logic such as updating the world,
/// checking for collisions, gathering input, and playing audio.
/// </summary>
/// <param name="gameTime">Provides a snapshot of timing values.</param>
protected override void Update(GameTime gameTime)
{
// Allows the game to exit
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
// TODO: Add your update logic here
base.Update(gameTime);
}
/// <summary>
/// This is called when the game should draw itself.
/// </summary>
/// <param name="gameTime">Provides a snapshot of timing values.</param>
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
// TODO: Add your drawing code here
base.Draw(gameTime);
}
}
}
Non andate in stallo subito, in realtà le cose sono molto semplici! Come prima cosa, dovete comprendere che l’evolversi del nostro gioco, concettualmente, si può riassumere in due “parti”, escludendo il momento in cui carichiamo le risorse.
Per prima cosa, la logica del gioco deve essere aggiornata. Per logica del gioco si intende tutto quell’insieme di variabili ed in generale operazioni da fare che possono tradursi, in parole povere, al capire se un pulsante sulla tastiera è premuto (facendo per esempio muovere il nostro alter-ego virtuale), oppure eseguire dei calcoli (per una battaglia nel nostro gioco di ruolo) e così via.
Dopo la fase di aggiornamento della logica, che chiameremo Update, tutto questo groviglio di dati deve essere disegnato a schermo per rendere il tutto percepibile dal giocatore. Tutto l’insieme delle operazioni legate al disegno le possiamo raggruppare in quella che è la parte, appunto, di disegno, o Draw in inglese.
E che metodi abbiamo appena visto?
Il metodo Update:
protected override void Update(GameTime gameTime)
{
// Allows the game to exit
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
// TODO: Add your update logic here
base.Update(gameTime);
}
All’avvio del progetto, ovviamente, il metodo sarà quasi vuoto, in quanto non abbiamo ancora definito nulla. Ed ecco che compare anche il metodo Draw:
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
// TODO: Add your drawing code here
base.Draw(gameTime);
}
concettualmente ci siamo, vero? L’istruzione che vedete in Draw, invece, serve a colorare la nostra schermata con un colore a scelta dell’utente. Se cambierete colore, scegliendone un’altro da passare come parametro, cambierà quindi quello della schermata.
(Click per Ingrandire)
Lo so, come inizio non è molto eccitante, ma non vi aspettate che il gioco si faccia da solo




