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;
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);
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: }
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);
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();
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 :)
Continua a leggere!