giovedì 26 febbraio 2009

2) Cos'è XNA e come funziona

XNA è un insieme di tool sviluppati da Microsoft con lo scopo di semplificare il processo di creazione di Videogame (o applicazioni interattive). E' basato su .NET e per tanto sfrutta uno dei linguaggi compatibili (consigliato c#) e si appoggia a DirectX per la gestione della grafica. Ad oggi siamo arrivati alla versione 3.0 ed olte a varie migliorie rispetto alla versione 2.0, ha un gran vantaggio, ovvero la possibilità di utilizzare Visual studio 2008 (fino alla versione 2.0 avreste dovuto utilizzare la 2005). XNA implenta un framework molto completo, che consente di interagire facilmente con Audio, Input e Device grafico. Uno dei punti di forza di questo sistema è l'utilizzo di una content pipeline utilizzata per caricare con facilità materiali come modelli 3d e texture, e renderli raggiungibili all'interno del nostro programma senza doversi preoccupare di inventare layer o modelli di importazione complessi (cosa che programmando sfruttando openGL o DirectX sarebbe altrimenti necessaria).
Un altro elemento molto interessante è l'utilizzo dei gameComponents che vi descriverò meglio tra qualche articolo, per ora diciamo che sono un ottimo modo per incapsulare informazioni implementando un'interfaccia software comune a tutti i componenti.
Da quello che ho potuto capire, il workflow di xna è basato su un loop continuo (che vi mostro in un'immagine riassuntiva) che si differenzia dalla normale logica cosidetta di pooling , dove a seguito di una richiesta (esempio pressione di un pulsante) viene attivato un evento.
In generale il workflow presentato da XNA è comunque "standard" per quello che concerne il game development. Ricordo di aver visto qualcosa di molto simile leggendo questo libro su directx, libro che naturalmente non ho mai realmente approfondito :P , ma che si è comunque dimostrato parecchio utile per capire le basi del game development e avere qualche nozione matematica in più.



e qui sotto .......tadaaaan il primo semplice esempio in C# dove vedete tutti gli step descritti nell'immagine.

using System;
using
System.Collections.Generic;
using
Microsoft.Xna.Framework;
using
Microsoft.Xna.Framework.Content;
using
Microsoft.Xna.Framework.GamerServices;
using
Microsoft.Xna.Framework.Graphics;
using
Microsoft.Xna.Framework.Input;

namespace
xwingGame
{


public class
Game1 : Microsoft.Xna.Framework.Game
{

GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
Texture2D xwing;//Qui caricheremo un'immagine
Vector2 pos;//e questa sarà la sua posizione

public
Game1()
{

graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
}



protected
override void Initialize()
{

spriteBatch = new SpriteBatch(GraphicsDevice);
pos = new Vector2(0f, 0f);
base.Initialize();
}


protected
override void LoadContent()
{

xwing = Content.Load("images/xwing.png");
}


protected override void UnLoadContent()
{


}



protected
override void Update(GameTime gameTime)
{

base.Update(gameTime);
}


protected
override void Draw(GameTime gameTime)
{


graphics.GraphicsDevice.Clear(Color.CornflowerBlue);

spriteBatch.Begin();
spriteBatch.Draw(xwing, pos, Color.White);
spriteBatch.End();

base.Draw(gameTime);
}

}//fine class game1
}//fine namespace


Non entro nei particolari di questo codice ma vi descriverò tutte le funzioni che sono presenti nel woorkflow visto nell'immagine:

Initialize()
In questo punto vengono instanziate le variabili e le classi principali che andremo a riutilizzare in molto altre funzioni.

LoadContent()
Questa funzione è dedicata al caricamento di tutti gli elementi che sfrutteranno la content pipeline. Quindi qui caricheremo suoni, texture e modelli 3d per esempio.

UnloadContent()
Richiamata quando sarà necessario eliminare tutti i contenuti caricati tramite la LoadContent().


Update(gameTime)
Qui entriamo nel game loop, questa funzione verrà chiamata ripetutamente per tutta la durata del programma ed è il punto dedicato alle operazioni cosidette di business, o meglio dove verranno inserite le modifiche ai dati del nostro programma.
Un semplice esempio: se volete che la vostra astronave alla pressione del tasto "freccia sinistra" si sposti a sinistra, è proprio nell'update() che adnremoa verificare che il tasto sinistro sia premuto... e in tal caso incrementeremo pos.x dove è salvata la posizione dell'astronave.
Come potete notare a questa funzione viene passata una variabile di tipo gameTime, che servirà per eventuali operazioni basate sulla quantità di tempo trascorso...e sopratutto come parametro da passare alla funzione Update della class padre
:
base.Update(gameTime)
Che al momento sinceramente non so dirvi come utilizzi tale variabile.... :P
uno degli utlizzi, immagino potrebbe essere quello di gestire il framerate.
Draw(gameTime)
Siamo sempre all'interno del loop... questa funzione si occuperà di gestire l'output a monitor. E sarà il punto dove andremo a definire tutti gli elementi inerenti quindi la parte grafica. Tornando all'esempio di prima, attraverso la funzione Draw() viene effettivamente disegnata l'astronave nella posizione che abbiamo modificato nell'update... o nella posizione del ciclo precedente nel caso in cui non ci siano state modifiche.

Chiudo qui questo primo articolo di introduzione che penso possa essere utile sopratutto a chi è alle primissime armi, per capire almeno i primi concetti di base. Nel prossimo articolo partiremo con lo sviluppo vero e proprio iniziando a gettare le basi per un semplice (ma non troppo:P) gioco in 2d. Nello specifico vi mostrerò come si gestisce il caricamento di immagini nella finestra di gioco e vi mostrerò l'importanza dei GameComponents sopra citati.
Vi ricordo che lo scopo di questo blog è di mostrare un pò per volta quello che sto imparando. Quindi nel caso in cui ci fosserò dei punti che non vi tornano o nel caso in cui io avessi scritto qualcosa di sbagliato :P non abbiate pietà!

Ciao!! alla prossima



4 commenti:

Anonimo ha detto...

ok , fin ora chiaro come il sole, ottima spiegazione. facendo un debug si può verificare il loop^^

Yari ( ImparandoXNA ) ha detto...

bene! ... se dovessero esserci passi un pò dispersivi fatemelo sapere... :D grazie per la visita

Anonimo ha detto...

Molto bene, continua così!

Anonimo ha detto...

Sei un grande!!!
Grazie mille per tutte queste guide!

Posta un commento