A1. Introduzione
Cos'è XNA?
XNA è uno strano acronimo ricorsivo che sta per "Xna's Not Acronym" (ossia "Xna non è un acronimo"). È un framework sviluppato in
C# che permette di facilitare notevolmente la scrittura di applicazioni grafiche, in particolar modo videogiochi. Questo framework viene
usato anche per sviluppare giochi per Xbox 360. Dato che si tratta di un insieme di librerie .Net, è possibile utilizzarlo in uno
qualsiasi dei linguaggi .Net, anche se praticamente la totalità dei tutorial online prendono in considerazione solo C#. Dato che
questo sito è dedicato al Vb.Net, ovviamente, tutti i sorgenti saranno scritti in questo linguaggio, a costo di inventermi
acrobazie informatiche per emulare ciò che con Visual C# è automatico.Download del software
Per iniziare a lavorare servono queste cose:
- XNA Framework 2.0 : librerie del framework xna
- XNA Game Studio 2.0 : contiene tutto il framework xna e i template di progetto, oltre a starter kit di esempio e alcuni pezzi di codice già scritti
- Visual C# 2005 : non perchè abbia cambiato idea, ma perchè l'installer di XNA Game Studio richiede obbligatoriamente Visual C# 2005 installato
- Service Pack 1 per Visual C# 2005 : anche questo viene richiesto dall'installer di XNA Game Studio
Nuovo progetto: Breakout
Una volta installato tutto il necessario non aprite Visual C# 2005: ci serviva solo per procedere nell'installazione. Invece, aprite il caro
Visual Basic 2005 Express e... cosa fare? Non sono stati aggiunti componenti di nessun genere al compilatore Visual Basic, quindi? Quindi
ci ho già pensato io. Scaricate questo pacchetto zip e copiatelo in:
Documenti\Visual Studio 2005\Templates\ProjectTemplatesOra riavviate il compilatore, andate su New Project e vedrete:
Ecco il nuovo template
Questo è un template che ho (tra)scritto io, per poter iniziare subito a scrivere il codice senza preoccuparsi di ridichiarare sempre tutto: per C#, i template vengono automaticamente installati, ma per VB no, quindi questa ne è una mia versione. Si tratta di una Windows Application senza finestra, che inizia esattamente come una Console Application, nella Sub Main(): in questo modo non c'è la console a dar fastidio e neanche le finestre, poiché l'unica form di cui avremo bisogno verrà automaticamente creata in un momento successivo. Il progetto dovrebbe averli già importanti, ma, se non fosse così, ricordatevi di aggiungere i riferimenti alla nuova libreria Microsof.Xna.Framework e ai suoi sotto-namespace.
La classe principale: Game
Una volta aperto il progetto, si notano tre file sorgenti: Module1.vb, Game.vb e GameObjects.vb. Limitiamoci ai primi due per ora. Nel primo
c'è scritto:
Sono pochissime linee di codice, che inizializzano un nuovo oggetto Game di tipo Game (sì, hanno lo stesso nome) e lo fa correre. Il costrutto Using, come ricorderete dalla mia guida, si preoccupa prima di inizializzare l'oggetto e, alla fine, di distruggerlo, rilasciando le risorse ad esso associate. Notate che non c'è nessun Console.ReadKey(), perchè non serve: Game.Run non è un metodo asincrono, e il codice a cui appartiene non procede finché non ha terminato la propria esecuzione. Dato che Run termina quando lo decidiamo noi, ossia quando il gioco finisce, Main resta attiva per tutta la durata del videogame. Avrete inoltre notato - spero - che non c'è nessuna direttiva Imports all'inizio del codice, eppure Game non è una classe che rientra nei normali namespace e dovrebbe dare errore. Sbagliato. Infatti è dichiarata nel secondo file sorgente presente nel progetto, come segue:Module ProgramSub Main()Using GameAs New Game Game.Run()End Using End Sub End Module
Game è dunque una nuova classe, derivata da Microsoft.Xna.Framework.Game, che rappresenta tutto il videogioco. Ecco una lista dei membri dichiarati, con le relative descrizioni:Imports Microsoft.Xna.FrameworkImports Microsoft.Xna.Framework.InputImports Microsoft.Xna.Framework.GraphicsPublic Class GameInherits Microsoft.Xna.Framework.GamePrivate GraphicsAs GraphicsDeviceManagerPrivate BatchAs SpriteBatchSub New ()Me .Graphics =New GraphicsDeviceManager(Me )Me .Content.RootDirectory = "content"End Sub ''' <summary> ''' Inizializza gli oggetti della classe. ''' </summary> Protected Overrides Sub Initialize() Batch =New SpriteBatch(Me .Graphics.GraphicsDevice)My Base.Initialize()End Sub ''' <summary> ''' Carica tutte le risorse che occorrono (texture, modelli 3D, ''' suoni, ecc...). ''' </summary> Protected Overrides Sub LoadContent()My Base.LoadContent()End Sub ''' <summary> ''' Rilascia tutte le risorse che non servono più. ''' </summary> Protected Overrides Sub UnloadContent()My Base.UnloadContent()End Sub ''' <summary> ''' Aggiorna la situazione di gioco (tutti gli oggetti ''' vengono aggiornati). ''' </summary> Protected Overrides Sub Update(ByVal GameTimeAs GameTime)If GamePad.GetState(PlayerIndex.One).Buttons.Back = _ ButtonState.PressedThen Me .Exit()End If My Base.Update(GameTime)End Sub ''' <summary> ''' Disegna tutti gli oggetti visibili sullo schermo. ''' </summary> Protected Overrides Sub Draw(ByVal gameTimeAs GameTime)Me .Graphics.GraphicsDevice.Clear(Color.CornflowerBlue)My Base.Draw(gameTime)End Sub End Class
- Graphics As GraphicsDeviceManager : Graphics è l'oggetto deputato alla gestione di tutta la grafica usata
- Batch As SpriteBatch : Batch, invece, serve per disegnare qualsiasi cosa sullo schermo
- Initialize() : Inizializza gli oggetti della classe. Qui vanno inizializzati solamente gli oggetti che non rappresentano entità nel gioco
- LoadContent() : Carica tutte le risorse che occorrono (texture, modelli 3D, suoni, ecc...). Al contrario, ogni oggetto visibile nel piano di gioco (mazza, palla, blocchi, sfondo, eccetera...) viene inizializzato qui
- UnloadContent() : Rilascia tutte le risorse che non servono più. Viene automaticamente chiamato da Dispose alla fine del gioco
- Update(GameTime As GameTime) : Aggiorna la situazione di gioco (tutti gli oggetti vengono aggiornati). In questo metodo viene controllata la pressione dei tasti sulla tastiera (o sul joypad) e vengono eseguite le azioni ad essi associati; inoltre, se ci sono oggetti che si muovono, la loro posizione viene aggiornata sempre qui; in generale, tutti i controlli sullo stato di gioco sono posti nel corpo di questa procedura
- Sub Draw(ByVal gameTime As GameTime) : Disegna tutti gli oggetti visibili sullo schermo
The Totem's Lair - Copyright (C) 2009
È vietata la riproduzione sia totale che parziale del sito.



