The Xna-Way: Tutorial 15: Utente collegato ed X-Box Live pt2 L'Avatar

Questa volta vi voglio parlare un poco degli Avatar degli utenti.
Come sapete è possibile creare e personalizzare il proprio Avatar, sia attraverso la console, sia attraverso il sito di X-Box live.
Voglio farvi vedere come si può, con poche righe di codice, renderizzare il proprio Avatar :)

NOTA: il codice per la gestione degli Avatar può essere fatto girare anche sotto Windows 7 (e mi pare che per i Phone, ma non avendo un tale dispositivo non ne sono sicuro), solo che in tal caso i valori ritornati dalle varie funzioni non saranno validi, e quindi non verrà renderizzato nulla.
In parole povere, GLI AVATAR SONO ESCULISA DELLA CONSOLE!

In parte riutilizzerò il codice scritto nel precedente articolo.
Nella classe del gioco aggiungiamo questi 3 campi:
   1:          AvatarDescription avatarDescription;
   2:          AvatarRenderer avatarRenderer;        
   3:          AvatarAnimation avatarAnimation;
   4:          AvatarRenderer avatarRenderer2;
   5:          AvatarDescription avatarDescription2;
che rappresentano la descrizione di come è fatto il nostro Avatar (in parole povere la descrizione fisica), l'oggetto che utilizzeremo per renderizzare il nostro Avatar, l'animazione corrente che stiamo riproducendo, ed infine l'enumeratore che indica quale delle animazioni preimpostate vogliamo usare.
Gli ultimi due oggetti, avatarRender2 ed avatarDescription2, serviranno per renderizzare e contenere un Avatar creato in modo random, in modo che alla fine del nostro esempio avremo a schermo il proprio Avatar ed un altro Avatar in più.
Avremo naturalmente bisogno di mantenere i dati del giocatore attualmente loggato (rivedere articolo precedente).

Nel LoadContent del game aggiungiamo questo:
   1:              avatarDescription2 = AvatarDescription.CreateRandom(AvatarBodyType.Female);
   2:              avatarRenderer2 = new AvatarRenderer(avatarDescription2);
   3:   
   4:              avatarAnimation = new AvatarAnimation(preset);
Le prime due righe creano un avatar casuale (femminile) ed un renderer basato sulla descrizione dell'Avatar appena creata.
La terza riga imposta l'animazione con il preset definito come campo della classe.

Ci servirà poi un metodo per il recupero in modo asincrono dei dati dell'Avatar, che può essere il seguente:
   1:          void LoadMyAvatar(IAsyncResult result)
   2:          {
   3:              avatarDescription = AvatarDescription.EndGetFromGamer(result);
   4:   
   5:              if (avatarDescription.IsValid)
   6:                  avatarRenderer = new AvatarRenderer(avatarDescription);
   7:          }
Questo perchè per caricare la descrizione dell'Avatar dobbiamo chiamare il metodo AvatarDescription.BeginGetFromGamer, il quale lavora in metodo asincrono (quindi la sua esecuzione non si blocca in attesa del suo completamento) e può richiedere diverso tempo per essere completato. Quando il metodo avrò completato la sua esecuzione chiamerà il metodo da noi definito per completare le operazioni.
Per mettere tutto assieme aggiungiamo alla fine del metoto LoadContent questo:
   1:              gamer = SignedInGamer.SignedInGamers[0];
   2:              if (gamer != null)
   3:                  AvatarDescription.BeginGetFromGamer(gamer, LoadMyAvatar, null);
che non fa altro che provare a recuperare i dati del giocatore loggato, ed avvia il recupero dei dati dell'Avatar.

Nel metodo update le uniche cose da mettere sono queste:

Ci manca solo il Draw:
GraphicsDevice.Clear(Color.CornflowerBlue);
 
//creo la matrix per la view
Matrix view = Matrix.CreateLookAt(new Vector3(0, 0.3f, -3), new Vector3(0, 0, 0), new Vector3(0, 1, 0));
//creo la matrix per la projection
Matrix projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, GraphicsDevice.Viewport.AspectRatio, .01f, 40.0f);
 
if (avatarRenderer != null && gamer != null)
{
avatarRenderer.View = view;
avatarRenderer.Projection = projection;
avatarRenderer.World = Matrix.CreateTranslation(-1, -1, 0);
avatarRenderer.Draw(avatarAnimation.BoneTransforms, avatarAnimation.Expression);
}
 
if (avatarRenderer2 != null && avatarDescription2.IsValid)
{
avatarRenderer2.View = view;
avatarRenderer2.Projection = projection;
avatarRenderer2.World = Matrix.CreateTranslation(1, -1, 0);
avatarRenderer2.Draw(avatarAnimation.BoneTransforms, avatarAnimation.Expression);
}
 
spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend);
if (gamer != null)
{
spriteBatch.DrawString(myFont, gamer.Gamertag, Vector2.Zero, Color.Black);
spriteBatch.Draw(image, new Vector2(0, 30), Color.White);
spriteBatch.DrawString(myFont, String.Format("Current Animation: {0}", preset.ToString()), new Vector2(0, 100),
Color.Black);
}
spriteBatch.End();
Prima creiamo la view e la projection per il render, controlliamo che il giocatore loggato, il renderer e l'animazione siano validi, e poi renderiziamo il tutto.
Poi ripetiamo anche per l'Avatar random.
Alla fine, come nel precedente articolo, si visualizza il nome della nostra gamer tag, la nostra immagine e poi si stampa il nome dell'animazione che stiamo riproducendo.

Ecco il codice completo sorgente del Game in questione:

Show∇


Sinceramente pensavo che sarebbe stato molto più difficile fare una cosa del genere, invece ho trovato tutto molto ben strutturato e semplificato.
Certo non ho ancora provato ad utilizzare le animazioni personalizzate per gli Avatart, o a fare il blend tra due animazioni... Ma quelle le vedrò in futuro!

Intanto ecco a voi uno screen di quello che vedo utilizzando il mio profilo: l'Avatar sulla destra è il mio, quello sulla sinistra è quello generato casualmente!



Alla prossima :)

0 commenti:

Donazioni

My Menu'