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.
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:
ok , fin ora chiaro come il sole, ottima spiegazione. facendo un debug si può verificare il loop^^
bene! ... se dovessero esserci passi un pò dispersivi fatemelo sapere... :D grazie per la visita
Molto bene, continua così!
Sei un grande!!!
Grazie mille per tutte queste guide!
Posta un commento