<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6862936347949168466</id><updated>2011-11-28T02:39:42.882+01:00</updated><category term='Terrain Edito'/><category term='XSI'/><category term='Riflessioni strane'/><category term='Trash'/><category term='Pensieri'/><category term='Armi Final Fantasy'/><category term='Tutorial XNA'/><category term='Problemi Eclipse'/><category term='Lavori'/><category term='NetBeans'/><category term='Java'/><category term='The Xna-Way'/><category term='SoftImage'/><category term='XNA'/><category term='ZBrush'/><category term='Fast Modelling'/><category term='Lightwave'/><category term='Rendering'/><category term='comunicazioni'/><category term='Guida XNA'/><category term='3D'/><category term='XNA Component'/><category term='Libri'/><category term='Lamentazioni'/><category term='Gunblade'/><category term='Cavolate'/><category term='Free'/><category term='Riflessioni'/><category term='WIP'/><category term='saluti'/><category term='Final Fantasy'/><category term='X-RPG Builder'/><category term='Windows 7'/><title type='text'>Alessio Ausilio</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>81</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-734272647077617338</id><published>2011-10-11T08:00:00.000+02:00</published><updated>2011-10-11T08:00:10.655+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='The Xna-Way'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA Component'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Guida XNA'/><title type='text'>The Xna-Way: Tutorial 15: Utente collegato ed X-Box Live pt2 L'Avatar</title><content type='html'>Questa volta vi voglio parlare un poco degli Avatar degli utenti.&lt;br /&gt;Come sapete è possibile creare e personalizzare il proprio Avatar, sia attraverso la console, sia attraverso il sito di X-Box live.&lt;br /&gt;Voglio farvi vedere come si può, con poche righe di codice, renderizzare il proprio Avatar :)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;NOTA:&lt;/b&gt; 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.&lt;br /&gt;In parole povere, &lt;i&gt;&lt;b&gt;GLI AVATAR SONO ESCULISA DELLA CONSOLE!&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;In parte riutilizzerò il codice scritto nel precedente articolo.&lt;br /&gt;Nella classe del gioco aggiungiamo questi 3 campi:&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="fullpost"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;        AvatarDescription avatarDescription;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="fullpost"&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;        AvatarRenderer avatarRenderer;        &lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="fullpost"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;        AvatarAnimation avatarAnimation;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="fullpost"&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;        AvatarRenderer avatarRenderer2;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="fullpost"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        AvatarDescription avatarDescription2;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;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.&lt;br /&gt;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ù.&lt;br /&gt;Avremo naturalmente bisogno di mantenere i dati del giocatore attualmente loggato (rivedere articolo precedente).&lt;br /&gt;&lt;br /&gt;Nel LoadContent del game aggiungiamo questo:&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;            avatarDescription2 = AvatarDescription.CreateRandom(AvatarBodyType.Female);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;            avatarRenderer2 = &lt;span class="kwrd"&gt;new&lt;/span&gt; AvatarRenderer(avatarDescription2);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;            avatarAnimation = &lt;span class="kwrd"&gt;new&lt;/span&gt; AvatarAnimation(preset);&lt;/pre&gt;&lt;/div&gt;Le prime due righe creano un avatar casuale (femminile) ed un renderer basato sulla descrizione dell'Avatar appena creata.&lt;br /&gt;La terza riga imposta l'animazione con il preset definito come campo della classe.&lt;br /&gt;&lt;br /&gt;Ci servirà poi un metodo per il recupero in modo asincrono dei dati dell'Avatar, che può essere il seguente:&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;        &lt;span class="kwrd"&gt;void&lt;/span&gt; LoadMyAvatar(IAsyncResult result)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;            avatarDescription = AvatarDescription.EndGetFromGamer(result);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (avatarDescription.IsValid)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;                avatarRenderer = &lt;span class="kwrd"&gt;new&lt;/span&gt; AvatarRenderer(avatarDescription);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        }&lt;/pre&gt;&lt;/div&gt;Questo perchè per caricare la descrizione dell'Avatar dobbiamo chiamare il metodo &lt;b&gt;AvatarDescription.BeginGetFromGamer&lt;/b&gt;, 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.&lt;br /&gt;Per mettere tutto assieme aggiungiamo alla fine del metoto LoadContent questo:&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;            gamer = SignedInGamer.SignedInGamers[0];&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (gamer != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;                AvatarDescription.BeginGetFromGamer(gamer, LoadMyAvatar, &lt;span class="kwrd"&gt;null&lt;/span&gt;);&lt;/pre&gt;&lt;/div&gt;che non fa altro che provare a recuperare i dati del giocatore loggato, ed avvia il recupero dei dati dell'Avatar.&lt;br /&gt;&lt;br /&gt;Nel metodo update le uniche cose da mettere sono queste:&lt;br /&gt;&lt;br /&gt;Ci manca solo il Draw:&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;GraphicsDevice.Clear(Color.CornflowerBlue);&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;//creo la matrix per la view&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;Matrix view = Matrix.CreateLookAt(&lt;span class="kwrd"&gt;new&lt;/span&gt; Vector3(0, 0.3f, -3), &lt;span class="kwrd"&gt;new&lt;/span&gt; Vector3(0, 0, 0), &lt;span class="kwrd"&gt;new&lt;/span&gt; Vector3(0, 1, 0));&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;//creo la matrix per la projection&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;Matrix projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, GraphicsDevice.Viewport.AspectRatio, .01f, 40.0f);&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (avatarRenderer != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; gamer != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;{&lt;/pre&gt;&lt;pre&gt;avatarRenderer.View = view;&lt;/pre&gt;&lt;pre class="alt"&gt;avatarRenderer.Projection = projection;&lt;/pre&gt;&lt;pre&gt;avatarRenderer.World = Matrix.CreateTranslation(-1, -1, 0);&lt;/pre&gt;&lt;pre class="alt"&gt;avatarRenderer.Draw(avatarAnimation.BoneTransforms, avatarAnimation.Expression);&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (avatarRenderer2 != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; avatarDescription2.IsValid)&lt;/pre&gt;&lt;pre class="alt"&gt;{&lt;/pre&gt;&lt;pre&gt;avatarRenderer2.View = view;&lt;/pre&gt;&lt;pre class="alt"&gt;avatarRenderer2.Projection = projection;&lt;/pre&gt;&lt;pre&gt;avatarRenderer2.World = Matrix.CreateTranslation(1, -1, 0);&lt;/pre&gt;&lt;pre class="alt"&gt;avatarRenderer2.Draw(avatarAnimation.BoneTransforms, avatarAnimation.Expression);&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (gamer != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;spriteBatch.DrawString(myFont, gamer.Gamertag, Vector2.Zero, Color.Black);&lt;/pre&gt;&lt;pre&gt;spriteBatch.Draw(image, &lt;span class="kwrd"&gt;new&lt;/span&gt; Vector2(0, 30), Color.White);&lt;/pre&gt;&lt;pre class="alt"&gt;spriteBatch.DrawString(myFont, String.Format(&lt;span class="str"&gt;"Current Animation: {0}"&lt;/span&gt;, preset.ToString()), &lt;span class="kwrd"&gt;new&lt;/span&gt; Vector2(0, 100),&lt;/pre&gt;&lt;pre&gt;Color.Black);&lt;/pre&gt;&lt;pre class="alt"&gt;}&lt;/pre&gt;&lt;pre&gt;spriteBatch.End();&lt;/pre&gt;&lt;/div&gt;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.&lt;br /&gt;Poi ripetiamo anche per l'Avatar random.&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;Ecco il codice completo sorgente del Game in questione:&lt;br /&gt;&lt;h2 onclick="openclose(&amp;quot;src15&amp;quot;);" style="cursor: pointer;"&gt;Show∇&lt;/h2&gt;&lt;div id="src15" style='display:none;'&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;GraphicsDeviceManager graphics;&lt;/pre&gt;&lt;pre&gt;SpriteBatch spriteBatch;&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;SpriteFont myFont;&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;GamerServicesComponent gamerC;&lt;/pre&gt;&lt;pre class="alt"&gt;SignedInGamer gamer;&lt;/pre&gt;&lt;pre&gt;Texture2D image;&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;InputDevice input;&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;AvatarDescription avatarDescription;&lt;/pre&gt;&lt;pre class="alt"&gt;AvatarRenderer avatarRenderer;        &lt;/pre&gt;&lt;pre&gt;AvatarAnimation avatarAnimation;&lt;/pre&gt;&lt;pre class="alt"&gt;AvatarRenderer avatarRenderer2;&lt;/pre&gt;&lt;pre&gt;AvatarDescription avatarDescription2;&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;AvatarAnimationPreset preset = AvatarAnimationPreset.Celebrate;&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; Game1()&lt;/pre&gt;&lt;pre class="alt"&gt;{&lt;/pre&gt;&lt;pre&gt;graphics = &lt;span class="kwrd"&gt;new&lt;/span&gt; GraphicsDeviceManager(&lt;span class="kwrd"&gt;this&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt;Content.RootDirectory = &lt;span class="str"&gt;"Content"&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;IsMouseVisible = &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;Components.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; BasicLibrary.Components.FPSCounter(&lt;span class="kwrd"&gt;this&lt;/span&gt;, &lt;span class="kwrd"&gt;false&lt;/span&gt;));&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;Components.Add((input = &lt;span class="kwrd"&gt;new&lt;/span&gt; InputDevice(&lt;span class="kwrd"&gt;this&lt;/span&gt;)));&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;//necessario per utilizzare la Guide&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;Components.Add((gamerC = &lt;span class="kwrd"&gt;new&lt;/span&gt; GamerServicesComponent(&lt;span class="kwrd"&gt;this&lt;/span&gt;)));&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;SignedInGamer.SignedIn += &lt;span class="kwrd"&gt;new&lt;/span&gt; EventHandler&amp;lt;SignedInEventArgs&amp;gt;(LoadGamer);&lt;/pre&gt;&lt;pre class="alt"&gt;}&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;void&lt;/span&gt; LoadGamer(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, SignedInEventArgs e)&lt;/pre&gt;&lt;pre&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;gamer = e.Gamer;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;//recupero lo stream per l'immagine&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;System.IO.Stream imgIO = gamer.GetProfile().GetGamerPicture();&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;//creo la texture2D a partire dallo stream&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;image = Texture2D.FromStream(GraphicsDevice, imgIO);&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;AvatarDescription.BeginGetFromGamer(e.Gamer, LoadMyAvatar, &lt;span class="kwrd"&gt;null&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;void&lt;/span&gt; LoadMyAvatar(IAsyncResult result)&lt;/pre&gt;&lt;pre class="alt"&gt;{&lt;/pre&gt;&lt;pre&gt;avatarDescription = AvatarDescription.EndGetFromGamer(result);&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (avatarDescription.IsValid)&lt;/pre&gt;&lt;pre class="alt"&gt;avatarRenderer = &lt;span class="kwrd"&gt;new&lt;/span&gt; AvatarRenderer(avatarDescription);&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Initialize()&lt;/pre&gt;&lt;pre class="alt"&gt;{&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;base&lt;/span&gt;.Initialize();&lt;/pre&gt;&lt;pre class="alt"&gt;}&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; LoadContent()&lt;/pre&gt;&lt;pre&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;PresentationParameters pp = GraphicsDevice.PresentationParameters;&lt;/pre&gt;&lt;pre&gt;pp.BackBufferWidth = GraphicsDevice.DisplayMode.Width;&lt;/pre&gt;&lt;pre class="alt"&gt;pp.BackBufferHeight = GraphicsDevice.DisplayMode.Height;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;avatarDescription2 = AvatarDescription.CreateRandom(AvatarBodyType.Female);&lt;/pre&gt;&lt;pre&gt;avatarRenderer2 = &lt;span class="kwrd"&gt;new&lt;/span&gt; AvatarRenderer(avatarDescription2);&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;spriteBatch = &lt;span class="kwrd"&gt;new&lt;/span&gt; SpriteBatch(GraphicsDevice);&lt;/pre&gt;&lt;pre class="alt"&gt;myFont = Content.Load&amp;lt;SpriteFont&amp;gt;(&lt;span class="str"&gt;"font"&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;avatarAnimation = &lt;span class="kwrd"&gt;new&lt;/span&gt; AvatarAnimation(preset);&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Update(GameTime gameTime)&lt;/pre&gt;&lt;pre class="alt"&gt;{&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (input.wasPressed(Buttons.Y))&lt;/pre&gt;&lt;pre class="alt"&gt;Guide.ShowSignIn(1, &lt;span class="kwrd"&gt;false&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (gamer != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; avatarRenderer != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; avatarAnimation != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;{&lt;/pre&gt;&lt;pre&gt;avatarAnimation.Update(gameTime.ElapsedGameTime, &lt;span class="kwrd"&gt;false&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (avatarAnimation.CurrentPosition == avatarAnimation.Length)&lt;/pre&gt;&lt;pre&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; ((&lt;span class="kwrd"&gt;int&lt;/span&gt;)preset &amp;gt;= 30)&lt;/pre&gt;&lt;pre&gt;preset = 0;&lt;/pre&gt;&lt;pre class="alt"&gt;avatarAnimation = &lt;span class="kwrd"&gt;new&lt;/span&gt; AvatarAnimation(++preset);&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;pre class="alt"&gt;}&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;base&lt;/span&gt;.Update(gameTime);&lt;/pre&gt;&lt;pre class="alt"&gt;}&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Draw(GameTime gameTime)&lt;/pre&gt;&lt;pre&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;GraphicsDevice.Clear(Color.CornflowerBlue);&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;//creo la matrix per la view&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;Matrix view = Matrix.CreateLookAt(&lt;span class="kwrd"&gt;new&lt;/span&gt; Vector3(0, 0.3f, -3), &lt;span class="kwrd"&gt;new&lt;/span&gt; Vector3(0, 0, 0), &lt;span class="kwrd"&gt;new&lt;/span&gt; Vector3(0, 1, 0));&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;//creo la matrix per la projection&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;Matrix projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, GraphicsDevice.Viewport.AspectRatio, .01f, 40.0f);&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (avatarRenderer != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; gamer != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;{&lt;/pre&gt;&lt;pre&gt;avatarRenderer.View = view;&lt;/pre&gt;&lt;pre class="alt"&gt;avatarRenderer.Projection = projection;&lt;/pre&gt;&lt;pre&gt;avatarRenderer.World = Matrix.CreateTranslation(-1, -1, 0);&lt;/pre&gt;&lt;pre class="alt"&gt;avatarRenderer.Draw(avatarAnimation.BoneTransforms, avatarAnimation.Expression);&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (avatarRenderer2 != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; avatarDescription2.IsValid)&lt;/pre&gt;&lt;pre class="alt"&gt;{&lt;/pre&gt;&lt;pre&gt;avatarRenderer2.View = view;&lt;/pre&gt;&lt;pre class="alt"&gt;avatarRenderer2.Projection = projection;&lt;/pre&gt;&lt;pre&gt;avatarRenderer2.World = Matrix.CreateTranslation(1, -1, 0);&lt;/pre&gt;&lt;pre class="alt"&gt;avatarRenderer2.Draw(avatarAnimation.BoneTransforms, avatarAnimation.Expression);&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (gamer != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;spriteBatch.DrawString(myFont, gamer.Gamertag, Vector2.Zero, Color.Black);&lt;/pre&gt;&lt;pre&gt;spriteBatch.Draw(image, &lt;span class="kwrd"&gt;new&lt;/span&gt; Vector2(0, 30), Color.White);&lt;/pre&gt;&lt;pre class="alt"&gt;spriteBatch.DrawString(myFont, String.Format(&lt;span class="str"&gt;"Current Animation: {0}"&lt;/span&gt;, preset.ToString()), &lt;span class="kwrd"&gt;new&lt;/span&gt; Vector2(0, 100),&lt;/pre&gt;&lt;pre&gt;Color.Black);&lt;/pre&gt;&lt;pre class="alt"&gt;}&lt;/pre&gt;&lt;pre&gt;spriteBatch.End();&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;base&lt;/span&gt;.Draw(gameTime);&lt;/pre&gt;&lt;pre class="alt"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;h2 onclick="openclose(&amp;quot;src15&amp;quot;);" style="cursor: pointer;"&gt;HideΔ&lt;/h2&gt;&lt;/div&gt;&lt;br /&gt;Sinceramente pensavo che sarebbe stato molto più difficile fare una cosa del genere, invece ho trovato tutto molto ben strutturato e semplificato.&lt;br /&gt;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!&lt;br /&gt;&lt;br /&gt;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!&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://farm7.static.flickr.com/6118/6227839998_f2520fe7f8_b.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="300" width="500" src="http://farm7.static.flickr.com/6118/6227839998_f2520fe7f8.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Alla prossima :)&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-734272647077617338?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/734272647077617338/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=734272647077617338' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/734272647077617338'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/734272647077617338'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2011/10/xna-way-tutorial-15-utente-collegato-ed.html' title='The Xna-Way: Tutorial 15: Utente collegato ed X-Box Live pt2 L&apos;Avatar'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm7.static.flickr.com/6118/6227839998_f2520fe7f8_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-2873138196041013541</id><published>2011-10-10T08:00:00.000+02:00</published><updated>2011-10-10T08:00:03.720+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='The Xna-Way'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA Component'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Guida XNA'/><title type='text'>The Xna-Way: Tutorial 14: Utente collegato ed X-Box Live pt1 Dati di base</title><content type='html'>Oggi voglio condividere alcune cose che ho provato riguardo alla gestione degli utenti XBox Live, come riconoscere se un utente ha fatto login, se ha fatto logout, chi è attualmente loggato, e le sue informazioni.&lt;br /&gt;&lt;br /&gt;Questa sarà la prima parte di considerazioni, dovuto al fatto che alcune funzionalità sono esclusive per X-Box 360, come al gestione degli Avatar.&lt;br /&gt;Riporto quindi qua solo quanto provato sotto piattaforma Windows.&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;Il metodo più semplice per recuperare le informazioni sull'untente attualmente collegato è tramite il seguente codice:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="fullpost"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;SignedInGamer gamer1 = Gamer.SignedInGamers[PlayerIndex.One];&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;span class="fullpost"&gt;Scrivendo questo, chiediamo di recuperare l'oggetto &lt;b&gt;&lt;a href="http://msdn.microsoft.com/it-it/library/microsoft.xna.framework.gamerservices.signedingamer.aspx"&gt;SignedInGamer&lt;/a&gt;&lt;/b&gt; relativo al giocatore che sta utilizzando il gamepad numero 1 (cosa simile si può fare con gli altri gamepad, fino all'indice 4).&lt;br /&gt;Questa classe ci fornisce tutti metodi necessari per recuperare le informazioni del nostro giocatore.&lt;br /&gt;Il problema però sorge quando non c'è nessuno giocatore che ha fatto log-in. In questo caso il codice precedente ci fornirà un null.&lt;br /&gt;Sulla console questo si verifica quando lanciamo un gioco in modalità "anonima" possiamo dire, senza aver selezionato cioè il profilo che vogliamo usare.&lt;br /&gt;&lt;br /&gt;Ma come possiamo fare, su pc, ad poter fare una cosa simile?&lt;br /&gt;NOTA: per poter far funzionare correttamente il codice che segue, il LiveID che utilizzerete per fare log-in deve avere a disposizione un account Studente o superiore su App Hub, altrimenti andrete contro a delle spiacevoli eccezioni.&lt;br /&gt;&lt;br /&gt;La prima cosa da fare è di aggiungere un &lt;a href="http://msdn.microsoft.com/en-us/library/bb975583.aspx"&gt;&lt;b&gt;GamerServicesComponent&lt;/b&gt;&lt;/a&gt; al nostro gioco. Possiamo farlo all'interno del costruttore del nostro Game:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="fullpost"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;Components.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; GamerServicesComponent(&lt;span class="kwrd"&gt;this&lt;/span&gt;));&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Il primo passo è fatto. Ora dobbiamo far si che quando si effettua il login di un account si deve recuperare i dati, tra cui per ora ci occuperemo del nome della GamerTag e dell'immagine associata.&lt;br /&gt;Aggiungiamo i seguenti campi alla nostra classe:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="fullpost"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;SignedInGamer gamer;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="fullpost"&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;Texture2D image;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;span class="fullpost"&gt; così facendo abbiamo definito dove andremo a memorizzare i dati recuperati.&lt;br /&gt;&lt;br /&gt;Abbiamo bisogno di registrare un EventHandler per recuperare i dati del profilo quando viene completata la fase di login. Ecco un esempio di come può essere fatto:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="fullpost"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;        &lt;span class="kwrd"&gt;void&lt;/span&gt; LoadGamer(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, SignedInEventArgs e)&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="fullpost"&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;        {&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="fullpost"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;            gamer = e.Gamer;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="fullpost"&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;            &lt;span class="rem"&gt;//recupero lo stream per l'immagine&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="fullpost"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;            System.IO.Stream imgIO = gamer.GetProfile().GetGamerPicture();&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="fullpost"&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;            &lt;span class="rem"&gt;//creo la texture2D a partire dallo stream&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="fullpost"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;            image = Texture2D.FromStream(GraphicsDevice, imgIO);&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="fullpost"&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        }&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;span class="fullpost"&gt; mentre nel costruttore, dopo la creazione del GamerServicesComponent, andiamo a registrare il nostro handler come segue:&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;SignedInGamer.SignedIn += &lt;span class="kwrd"&gt;new&lt;/span&gt; EventHandler&amp;lt;SignedInEventArgs&amp;gt;(LoadGamer); &lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Il nostro metodo Draw sarà semplicissimo!&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Draw(GameTime gameTime)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;            GraphicsDevice.Clear(Color.CornflowerBlue);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;            spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (gamer != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;            {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;                spriteBatch.DrawString(myFont, gamer.Gamertag, Vector2.Zero, Color.Black);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;                spriteBatch.Draw(image, &lt;span class="kwrd"&gt;new&lt;/span&gt; Vector2(0,30), Color.White);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;            }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;            spriteBatch.End();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;            &lt;span class="kwrd"&gt;base&lt;/span&gt;.Draw(gameTime);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;        }&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Ok vediamo di riassumere: creiamo il nostro EventHandler, il quale serve a recuperare i dati del Gamer che fa login (quindi la GamerTag, la sua immagine, i suoi Ack, la lista dei suoi amici, etc). Questo Handler viene chiamato quando il login viene completato con successo. E dopo di questo verrano visualizzate dal metodo Draw il nome della GamerTag e la sua immagine.&lt;br /&gt;&lt;br /&gt;Ecco ora a voi alcuni screenshot! (sono relativi alla versione che ho fatto girare sotto Windows 7, quindi sulla console potrebbero essere "leggermente" differenti)&lt;br /&gt;Una volta fatto partire il gioco premete il tastone centrale del vostro pad (o il tasto Home sulla tastiera). E quello che vedrete sarà più o meno questo:&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://farm7.static.flickr.com/6218/6214407993_742f8e8de3_b.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="188" src="http://farm7.static.flickr.com/6218/6214407993_742f8e8de3_m.jpg" width="240" /&gt;&lt;/a&gt;&lt;/div&gt;Dopo che avrete accettato le condizioni d'uso, andate su "Accedi", dove avrete una schermata come la seguente:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://farm7.static.flickr.com/6239/6214923586_b4179820fc_b.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="188" src="http://farm7.static.flickr.com/6239/6214923586_b4179820fc_m.jpg" width="240" /&gt;&lt;/a&gt;&lt;/div&gt;Inserite i dati del vostro LiveID (che vi ricordo deve disporre di un account Studente o superiore su Abb Hup per essere provato con successo da chi scrive il codice), e avrete che inizierà la procedura di login (io ho anche spuntato l'opzione per fare in modo che ogni volta effettui l'accesso in automatico).&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://farm7.static.flickr.com/6177/6214923752_93a2635400_b.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="188" src="http://farm7.static.flickr.com/6177/6214923752_93a2635400_m.jpg" width="240" /&gt;&lt;/a&gt;&lt;/div&gt;Quando il login sarà completo vi verrà notificato con un messaggio!&lt;br /&gt;Se fate come me, e avete messo il login automatico dell'account (in modo da non dover rifare la procedura a mano ogni volta), se riavviate l'applicazione ed aspettate qualche secondo, ecco cosa vedrete (salvo GamerTag diversa XD):&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://farm7.static.flickr.com/6234/6214408191_bcc73fd114_b.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="187" src="http://farm7.static.flickr.com/6234/6214408191_bcc73fd114_m.jpg" width="240" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Ora le basi ci sono! Potete sbizzarrirvi!&lt;br /&gt;&lt;br /&gt;Spero di esservi stato utile!&lt;br /&gt;A presto :)&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-2873138196041013541?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/2873138196041013541/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=2873138196041013541' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/2873138196041013541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/2873138196041013541'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2011/10/xna-way-tutorial-14-utente-collegato-ed.html' title='The Xna-Way: Tutorial 14: Utente collegato ed X-Box Live pt1 Dati di base'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm7.static.flickr.com/6218/6214407993_742f8e8de3_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-1359471910038838184</id><published>2011-09-30T14:40:00.001+02:00</published><updated>2011-09-30T14:40:21.906+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='The Xna-Way'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA Component'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Guida XNA'/><title type='text'>The Xna-Way: Tutorial 13: Semplice gestore audio</title><content type='html'>Oggi voglio proporvi una componente per gestire gli effetti sonori e le musiche del nostro gioco.&lt;br /&gt;Perchè diciamocelo, un gioco muto non ha proprio un bell'aspetto ed è anche poco accattivamente.&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;Quello che mi propongo è di mostrarvi un componente che si occupi di caricare gli effetti sonori e le canzoni che vogliamo utilizzare nel nostro progetto, per poi poterle richiamare ed utilizzare a nostro piacimento da qualsiasi punto del nostro progetto (a patto di poter accedere e riferire l'interfaccia definita per interagire con il nostro componente).&lt;br /&gt;&lt;br /&gt;Come prima cosa definiamoci l'interfaccia da utilizzare con il nostro audioManager:&lt;br /&gt;&lt;h2 style='cursor:pointer;' onclick='openclose("myElm");'&gt;Show&amp;nabla;&lt;/h2&gt;&lt;div id="myElm" style='display:none;'&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; AudioManagerI&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;        ContentManager ContentManager { get; }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;        &lt;span class="kwrd"&gt;float&lt;/span&gt; MusicVolume { get; set; }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        &lt;span class="kwrd"&gt;float&lt;/span&gt; SoundVolume { get; set; }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        &lt;span class="kwrd"&gt;void&lt;/span&gt; LoadSong(&lt;span class="kwrd"&gt;long&lt;/span&gt; songID, &lt;span class="kwrd"&gt;string&lt;/span&gt; songName);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        &lt;span class="kwrd"&gt;void&lt;/span&gt; LoadSound(&lt;span class="kwrd"&gt;long&lt;/span&gt;  soundID, &lt;span class="kwrd"&gt;string&lt;/span&gt; soundName);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        &lt;span class="kwrd"&gt;void&lt;/span&gt; PlaySong(&lt;span class="kwrd"&gt;long&lt;/span&gt; idSong);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;        &lt;span class="kwrd"&gt;void&lt;/span&gt; PauseSong();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        &lt;span class="kwrd"&gt;void&lt;/span&gt; ResumeSong();&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        &lt;span class="kwrd"&gt;void&lt;/span&gt; StopSong();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;        &lt;span class="kwrd"&gt;void&lt;/span&gt; PlaySound(&lt;span class="kwrd"&gt;long&lt;/span&gt; soundId);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;        &lt;span class="kwrd"&gt;void&lt;/span&gt; StopAllSounds();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;    }&lt;/pre&gt;&lt;/div&gt;&lt;h2 style='cursor:pointer;' onclick='openclose("myElm");'&gt;Hide&amp;Delta;&lt;/h2&gt;&lt;/div&gt;Molto intuitivamente diamo così la possibilità di agire sul volume dei suoni e delle musiche, permettiamo di caricare un singolo suono/canzone specificando anche l'ID da assegnargli, e che sarà utilizzato per recuperarlo e riprodurlo. Definiamo poi quei metodi che serviranno per riprodurre/fermare/riprendere una cazone e per riprodurre e fermare i suoni.&lt;br /&gt;Qualcuno mi potrà criticare il fatto che utilizzo degli anonimi e diffcili ID di tipo long per identifcare i suoni e le canzoni e non un nome. Io ragiono sul fatto che molto probabilmente la lista dei file audio da gestire mi arriverà da un qualche editor, che avrò usato per definire la lista di tutti i miei asset. Tali asset saranno riferiti da ogni luogo tramite i loro identificativi numeri, questo perchè il nome può essere cambiato per varie ragioni (preferenze, cambio di idee, diversa classificazione, etc) mentre un ID numerico rimarrà presumibilmente (a meno di persone poco sagge che vanno a mettere le manine nutellose dove non dovrebbero) lo stesso per tutto il tempo.&lt;br /&gt;Oltre al fatto che un numero occupa molto meno spazio di un stringa ^__^&lt;br /&gt;&lt;br /&gt;Continuiamo però nella nostra esposizione: dobbiamo ora implementare il tutto.&lt;br /&gt;&lt;br /&gt;&lt;h2 style='cursor:pointer;' onclick='openclose("codeElm");'&gt;Show&amp;nabla;&lt;/h2&gt;&lt;br /&gt;&lt;div id="codeElm" style='display:none;'&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="rem"&gt;/// Gestisce la musica di sottofondo ed i suoni che vengono riprodotti&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; AudioManager : GameComponent, AudioManagerI&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;{&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    &lt;span class="preproc"&gt;#region&lt;/span&gt; Private fields&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; ContentManager content;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; ContentManager ContentManager { get { &lt;span class="kwrd"&gt;return&lt;/span&gt; content; } }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;    &lt;span class="rem"&gt;//lista delle canzoni che vogliamo gestire&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; Dictionary&amp;lt;&lt;span class="kwrd"&gt;long&lt;/span&gt;, Song&amp;gt; songs = &lt;span class="kwrd"&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span class="kwrd"&gt;long&lt;/span&gt;, Song&amp;gt;();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;    &lt;span class="rem"&gt;//lista dei suoni che vogliamo gestire&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; Dictionary&amp;lt;&lt;span class="kwrd"&gt;long&lt;/span&gt;, SoundEffect&amp;gt; sounds = &lt;span class="kwrd"&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span class="kwrd"&gt;long&lt;/span&gt;, SoundEffect&amp;gt;();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;    &lt;span class="rem"&gt;//canzone corrente che stiamo riproducendo&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; Song currentSong = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;    &lt;span class="rem"&gt;//lista dei suoni che stiamo correntemente riproducendo&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; List&amp;lt;SoundEffectInstance&amp;gt; playingSounds;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;    &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;    &lt;span class="rem"&gt;//sono in pausa?&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; isMusicPaused = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;    &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;    &lt;span class="rem"&gt;/// ID della canzone correntemente riprodotta&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;long&lt;/span&gt; Current_IDSong { get; &lt;span class="kwrd"&gt;private&lt;/span&gt; set; }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;    &lt;span class="rem"&gt;/// Volume delle canzoni&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;float&lt;/span&gt; MusicVolume&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  34:  &lt;/span&gt;        get { &lt;span class="kwrd"&gt;return&lt;/span&gt; MediaPlayer.Volume; }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  35:  &lt;/span&gt;        set { MediaPlayer.Volume = &lt;span class="kwrd"&gt;value&lt;/span&gt;; }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  36:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  37:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  38:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  39:  &lt;/span&gt;    &lt;span class="rem"&gt;/// Volume per i suoni&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  40:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  41:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;float&lt;/span&gt; SoundVolume&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  42:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  43:  &lt;/span&gt;        get { &lt;span class="kwrd"&gt;return&lt;/span&gt; SoundEffect.MasterVolume; }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  44:  &lt;/span&gt;        set { SoundEffect.MasterVolume = &lt;span class="kwrd"&gt;value&lt;/span&gt;; }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  45:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  46:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  47:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  48:  &lt;/span&gt;    &lt;span class="rem"&gt;/// True se la canzone corrente è in esecuzione o in pausa (!= stopped)&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  49:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  50:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; IsSongActive { get { &lt;span class="kwrd"&gt;return&lt;/span&gt; currentSong != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; MediaPlayer.State != MediaState.Stopped; } }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  51:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  52:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  53:  &lt;/span&gt;    &lt;span class="rem"&gt;/// True se la canzone corrente è in pausa&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  54:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  55:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; IsSongPaused { get { &lt;span class="kwrd"&gt;return&lt;/span&gt; currentSong != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; isMusicPaused; } }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  56:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  57:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; AudioManager(Game game)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  58:  &lt;/span&gt;        : &lt;span class="kwrd"&gt;this&lt;/span&gt;(game, &lt;span class="str"&gt;"Content"&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  59:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  60:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  61:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  62:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; AudioManager(Game game, &lt;span class="kwrd"&gt;string&lt;/span&gt; contentFolder)&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  63:  &lt;/span&gt;        : &lt;span class="kwrd"&gt;base&lt;/span&gt;(game)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  64:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  65:  &lt;/span&gt;        Game.Services.AddService(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(AudioManagerI), &lt;span class="kwrd"&gt;this&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  66:  &lt;/span&gt;        Current_IDSong = -1;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  67:  &lt;/span&gt;        content = &lt;span class="kwrd"&gt;new&lt;/span&gt; ContentManager(game.Content.ServiceProvider, contentFolder);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  68:  &lt;/span&gt;        playingSounds = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;SoundEffectInstance&amp;gt;();&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  69:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  70:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  71:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  72:  &lt;/span&gt;    &lt;span class="rem"&gt;/// Carica una canzone.&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  73:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  74:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;param name="songID"&amp;gt;Id da assegnare alla canzone da caricare&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  75:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;param name="songName"&amp;gt;Nome della canzone da caricare&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  76:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; LoadSong(&lt;span class="kwrd"&gt;long&lt;/span&gt; songID, &lt;span class="kwrd"&gt;string&lt;/span&gt; songName)&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  77:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  78:  &lt;/span&gt;        songs.Add(songID, content.Load&amp;lt;Song&amp;gt;(songName));&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  79:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  80:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  81:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  82:  &lt;/span&gt;    &lt;span class="rem"&gt;/// Carica un suono.&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  83:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  84:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;param name="sounID"&amp;gt;Id da assegare al suono da caricare&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  85:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;param name="soundName"&amp;gt;Nome del suono da caricare&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  86:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; LoadSound(&lt;span class="kwrd"&gt;long&lt;/span&gt; soundID, &lt;span class="kwrd"&gt;string&lt;/span&gt; soundName)&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  87:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  88:  &lt;/span&gt;        sounds.Add(soundID, content.Load&amp;lt;SoundEffect&amp;gt;(soundName));&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  89:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  90:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  91:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  92:  &lt;/span&gt;    &lt;span class="rem"&gt;/// Libera la memoria da tutte le canzoni e suoni caricati&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  93:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  94:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; UnloadContent()&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  95:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  96:  &lt;/span&gt;        content.Unload();&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  97:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  98:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  99:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 100:  &lt;/span&gt;    &lt;span class="rem"&gt;/// Riproduce la canzone con id passato&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 101:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 102:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;param name="idSong"&amp;gt;Id della canzone da riprodurre&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 103:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; PlaySong(&lt;span class="kwrd"&gt;long&lt;/span&gt; idSong)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 104:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 105:  &lt;/span&gt;        &lt;span class="rem"&gt;//controllo che la canzone che voglio riprodurre non sia quella che sto correntemente riproducendo&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 106:  &lt;/span&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (Current_IDSong != idSong) &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 107:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 108:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (currentSong != &lt;span class="kwrd"&gt;null&lt;/span&gt;) &lt;span class="rem"&gt;//fermo quella attuale&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 109:  &lt;/span&gt;            {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 110:  &lt;/span&gt;                MediaPlayer.Stop();&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 111:  &lt;/span&gt;            }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 112:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 113:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (songs.TryGetValue(idSong, &lt;span class="kwrd"&gt;out&lt;/span&gt; currentSong))&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 114:  &lt;/span&gt;            {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 115:  &lt;/span&gt;                Current_IDSong = idSong; &lt;span class="rem"&gt;//aggiorno&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 116:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 117:  &lt;/span&gt;                isMusicPaused = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 118:  &lt;/span&gt;                MediaPlayer.IsRepeating = &lt;span class="kwrd"&gt;true&lt;/span&gt;; &lt;span class="rem"&gt;//metto in loop&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 119:  &lt;/span&gt;                MediaPlayer.Play(currentSong); &lt;span class="rem"&gt;//riproduco&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 120:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 121:  &lt;/span&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt; (!Enabled)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 122:  &lt;/span&gt;                {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 123:  &lt;/span&gt;                    MediaPlayer.Pause();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 124:  &lt;/span&gt;                }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 125:  &lt;/span&gt;            }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 126:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 127:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 128:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 129:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 130:  &lt;/span&gt;    &lt;span class="rem"&gt;/// Mette in pausa la canzone corrente&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 131:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 132:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; PauseSong()&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 133:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 134:  &lt;/span&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (currentSong != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; !isMusicPaused)&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 135:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 136:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (Enabled) MediaPlayer.Pause();&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 137:  &lt;/span&gt;            isMusicPaused = &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 138:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 139:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 140:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 141:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 142:  &lt;/span&gt;    &lt;span class="rem"&gt;/// Fa ripartire la canzone corrente&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 143:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 144:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; ResumeSong()&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 145:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 146:  &lt;/span&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (currentSong != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; isMusicPaused)&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 147:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 148:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (Enabled) MediaPlayer.Resume();&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 149:  &lt;/span&gt;            isMusicPaused = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 150:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 151:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 152:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 153:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 154:  &lt;/span&gt;    &lt;span class="rem"&gt;/// Ferma la cazone corrente&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 155:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 156:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; StopSong()&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 157:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 158:  &lt;/span&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (currentSong != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; MediaPlayer.State != MediaState.Stopped)&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 159:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 160:  &lt;/span&gt;            MediaPlayer.Stop();&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 161:  &lt;/span&gt;            isMusicPaused = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 162:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 163:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 164:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 165:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 166:  &lt;/span&gt;    &lt;span class="rem"&gt;/// Riproduce il suono con id passato&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 167:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 168:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;param name="soundId"&amp;gt;Id del suono da riprodurre&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 169:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; PlaySound(&lt;span class="kwrd"&gt;long&lt;/span&gt; soundId)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 170:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 171:  &lt;/span&gt;        SoundEffect sound;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 172:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 173:  &lt;/span&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (!sounds.TryGetValue(soundId, &lt;span class="kwrd"&gt;out&lt;/span&gt; sound))&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 174:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 175:  &lt;/span&gt;            &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ArgumentException(&lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;"Sound '{0}' not found"&lt;/span&gt;, soundId));&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 176:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 177:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 178:  &lt;/span&gt;        playingSounds.Add(sound.CreateInstance());&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 179:  &lt;/span&gt;        &lt;span class="kwrd"&gt;int&lt;/span&gt; index = playingSounds.Count - 1;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 180:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 181:  &lt;/span&gt;        playingSounds[index].Volume = SoundVolume;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 182:  &lt;/span&gt;        playingSounds[index].Pitch = 0.0f;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 183:  &lt;/span&gt;        playingSounds[index].Pan = 0.0f;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 184:  &lt;/span&gt;        playingSounds[index].Play();&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 185:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 186:  &lt;/span&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (!Enabled)&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 187:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 188:  &lt;/span&gt;            playingSounds[index].Pause();&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 189:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 190:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 191:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 192:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 193:  &lt;/span&gt;    &lt;span class="rem"&gt;/// Fermat tutti i suoni correntemente riprodotti&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 194:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 195:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; StopAllSounds()&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 196:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 197:  &lt;/span&gt;        &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; playingSounds.Count; ++i)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 198:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 199:  &lt;/span&gt;            playingSounds[i].Stop();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 200:  &lt;/span&gt;            playingSounds[i].Dispose();&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 201:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 202:  &lt;/span&gt;        playingSounds.Clear();&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 203:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 204:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 205:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Update(GameTime gameTime)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 206:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 207:  &lt;/span&gt;        &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = playingSounds.Count - 1; i &amp;gt;= 0; i--)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 208:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 209:  &lt;/span&gt;            &lt;span class="rem"&gt;//rimuove i suoni che sono stati completati&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 210:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (playingSounds[i] != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; playingSounds[i].State == SoundState.Stopped)&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 211:  &lt;/span&gt;            {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 212:  &lt;/span&gt;                playingSounds[i].Dispose(); &lt;span class="rem"&gt;//libero la memoria&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 213:  &lt;/span&gt;                playingSounds.RemoveAt(i);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 214:  &lt;/span&gt;            }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 215:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 216:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 217:  &lt;/span&gt;        &lt;span class="rem"&gt;//se ho finito di riprodurre la canzone corrente stop&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 218:  &lt;/span&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (currentSong != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; MediaPlayer.State == MediaState.Stopped)&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 219:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 220:  &lt;/span&gt;            currentSong = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 221:  &lt;/span&gt;            Current_IDSong = -1;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 222:  &lt;/span&gt;            isMusicPaused = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 223:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 224:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 225:  &lt;/span&gt;        &lt;span class="kwrd"&gt;base&lt;/span&gt;.Update(gameTime);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 226:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 227:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 228:  &lt;/span&gt;    &lt;span class="rem"&gt;// Mette in pausa tutto se sospeso, altrimenti riprende tutto&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 229:  &lt;/span&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnEnabledChanged(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs args)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 230:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 231:  &lt;/span&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (Enabled)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 232:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 233:  &lt;/span&gt;            &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; playingSounds.Count; i++)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 234:  &lt;/span&gt;            {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 235:  &lt;/span&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt; (playingSounds[i] != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; playingSounds[i].State == SoundState.Paused)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 236:  &lt;/span&gt;                {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 237:  &lt;/span&gt;                    playingSounds[i].Resume();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 238:  &lt;/span&gt;                }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 239:  &lt;/span&gt;            }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 240:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 241:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (!isMusicPaused)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 242:  &lt;/span&gt;            {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 243:  &lt;/span&gt;                MediaPlayer.Resume();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 244:  &lt;/span&gt;            }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 245:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 246:  &lt;/span&gt;        &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 247:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 248:  &lt;/span&gt;            &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; playingSounds.Count; i++)&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 249:  &lt;/span&gt;            {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 250:  &lt;/span&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt; (playingSounds[i] != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; playingSounds[i].State == SoundState.Playing)&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 251:  &lt;/span&gt;                {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 252:  &lt;/span&gt;                    playingSounds[i].Pause();&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 253:  &lt;/span&gt;                }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 254:  &lt;/span&gt;            }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 255:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 256:  &lt;/span&gt;            MediaPlayer.Pause();&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 257:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 258:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 259:  &lt;/span&gt;        &lt;span class="kwrd"&gt;base&lt;/span&gt;.OnEnabledChanged(sender, args);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 260:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 261:  &lt;/span&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;h2 style='cursor:pointer;' onclick='openclose("codeElm");'&gt;Hide&amp;Delta;&lt;/h2&gt;&lt;/div&gt;Il codice mi pare che sia abbastanza autoesplicativo, se necessita di commenti non esitate a chiedermeli per email o nei commenti.&lt;br /&gt;Solo una minima spiegazione: un &lt;b&gt;SoundEffect&lt;/b&gt; rappresenta una singola risorsa sonora caricata, ed è possibile riprodurla utilizzando il metodo play fornito da tale classe.&lt;br /&gt;Abbiamo invece che la &lt;b&gt;SoundEffectInstance&lt;/b&gt; rappresenta una singola istanza di una risorsa sonora in fase di riproduzione (o sospesa o fermata). Questo vuol dire che con le SoundEffectInstance possiamo riprodurre più copie del nostro suono tranquillamente. Da fare attenzione al fatto che possiamo creare molte instance da un singolo SoundEffect, e nel caso liberiamo la memoria di quest'ultimo per poi provare a riprodurre una istanza ottenuta da questo... bè gli effetti saranno non piacevoli! Eccezioni su eccezioni!&lt;br /&gt;&lt;br /&gt;Forse c'è un punto che può essere in dubbio: come faccio a sapere che tutti i suoni che riproduco verrano riprodotti?&lt;br /&gt;Oppure possiamo mettere la questione nel senso di "quale è il numero massimo di suoni che posso riprodurre sulla mia console?"&lt;br /&gt;Come potete leggere a questa pagine di &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.audio.soundeffectinstance.aspx"&gt;MSDN&lt;/a&gt; abbiamo che&lt;br /&gt;&lt;blockquote&gt;On Zune, a game can have a maximum of 16 total playing SoundEffectInstance instances at one time, combined across all loaded SoundEffect objects. The only limit to the total number of loaded SoundEffectInstance and SoundEffect objects is available memory. However, the user can play only 16 sound effects at one time. Attempts to play a SoundEffectInstance beyond this limit will fail. On Windows, there is no hard limit. Playing too many instances can lead to performance degradation. On Xbox 360, the limit is 300 sound effect instances loaded or playing. Dispose of old instances if you need more. &lt;/blockquote&gt;quindi credo che 300 suoni contemporaneamente siano sufficienti per i nostri scopi.&lt;br /&gt;&lt;br /&gt;Spero di esservi stato un minimo utile.&lt;br /&gt;&lt;br /&gt;Se volete vedere un esempio più complesso di gestore audio, con una personalizzazione migliore di quello che potete fare, vi rimando alla &lt;a href="http://www.xnawiki.com/index.php?title=Advanced_Sound_Manager_For_XNA_GS_3.1"&gt;XnaWiki&lt;/a&gt;. Il loro esempio è quello a cui mi sono ispirato per creare il mio personale AudioManager, solo che come ho detto, non mi piacevano alcune cose riguardo all'identificazione degli asset, oltre al fatto che il numero dei suoni riproducibili tutti assieme era limitato a livello di codice.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A presto!&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-1359471910038838184?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/1359471910038838184/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=1359471910038838184' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/1359471910038838184'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/1359471910038838184'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2011/09/xna-way-tutorial-13-semplice-gestore.html' title='The Xna-Way: Tutorial 13: Semplice gestore audio'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-2498511589284510049</id><published>2011-07-31T17:33:00.001+02:00</published><updated>2011-10-07T14:39:24.937+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='The Xna-Way'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA Component'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Guida XNA'/><title type='text'>The Xna-Way: Tutorial 12: Performance &amp; Ottimizzazioni pt1</title><content type='html'>Vediamod i fare il punto su qualche considerazione che ho fatto relativamente allo sviluppo e deploy su PC vs quello su Xbox 360.&lt;br /&gt;&lt;br /&gt;Da quello che ricordo, nonostante si possa far girare i progetti XNA sia su pc che su console, i frameword utilizzati per far girare gli applicativi sono simili ma diversi sotto alcuni aspetti fondamentali. Primo tra tutti la gestione del garbage collector.&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;Su PC viene fatto girare il .NET framework completo, mentre sulla console viene utilizzato quello che si chiama .NET Compact Framework (che dovrebbe essere tra l'altro utilizzato anche per alcuni dispositivi portatili sempre di proprietà della Microsoft).&lt;br /&gt;&lt;br /&gt;Tale Compact Framework è alla fin fine un sottoinsieme di quello che gira su PC, ma questo implica che le funzioni che mette a disposizione sono minori.&lt;br /&gt;Per quanto riguarda il Garbage Collector, il compact framework ha una versione che possiamo vedere come meno potente.&lt;br /&gt;Con il Compact Framework si è costretti a controllare ogni oggetto presente in memoria per vedere se è ancora necessario o meno. Quindi attenzione all'allocazione di tanti oggetti e di oggeti di grosse dimenzioni.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Altro problema è il filtraggio degli oggetti di una collezione secondo una certa condizione.&lt;br /&gt;Per un esempio: in una prova dovevo renderizzare gli oggetti che rientravano nella zona della vista del livello, e per fare questo nella versione WINDOWS del gioco avevo utilizzato il metodo &lt;span style="font-weight: bold;"&gt;Where&lt;/span&gt; di Enumerator, defidendomi delle lambda expression per definire il filtro. Sotto Windows funzionava tutto abbastanza bene.&lt;br /&gt;Ma non appena ho eseguito il tutto sulla console le prestazioni sono precipitate vertiginosamente.&lt;br /&gt;A quanto pare i metodi offerti da Enumerator, che accettano delle lambda expression, creano delle nuove liste/oggetti ogni volta che vengono invocati, e questo porta via tante risorse all'esecuzione.&lt;br /&gt;Come risolvere e quindi ottimizzare il codice XNA?&lt;br /&gt;Per risolvere il calo di prestazioni ho provato con il un classico for/foreach con un semplice if-then per l'esecuzione del codice. Ed il guadagno in frame per secondo è stato notevole (per farvi un esempio numerico: dai 26 fps che ottenevo inizialmente sono arrivato a 170 circa!).&lt;br /&gt;Un'altra prova che ho fatto è stata con le query definite tramite LinQ. Il vantaggio di queste query è che permettono di esprimere in modo facile e naturale espressioni di filtraggio come se si scrivesse una query per un database relazionale.&lt;br /&gt;La lettura di tale query è decisamente più semplice di un if-then-else che occupa diverse righe.&lt;br /&gt;E per le prestazioni direte voi?&lt;br /&gt;Da quello che ho visto (sempre con i dati numerici che ho riportato prima) da 170 fps sulla console sono sceso a circa 165.&lt;br /&gt;5 fps per una maggiore leggibilità e manutenzione del codice... Accettabile secondo voi? Per ora secondo me si. Ma in caso si abbia bisogno di prestazioni estreme, e dove anche un solo fps guadagnato è un successo armatevi di calma e scrivetevi le vostre belle condizioni a manina!&lt;br /&gt;&lt;br /&gt;Da considerare perè che fino a quando il vostro progetto gira oltre i 60 fps potete stare tranquilli e occuparvi poco delle ottimizzazioni in generale. Il problema è quando scendete sotto i 60... &lt;span style="font-weight: bold;"&gt;60 fps è la vostra line della morte.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ok...&lt;br /&gt;queste sono solo delle mie considerazioni, dovute a prove che ho fatto e a qualche pagina di libro che ho letto.&lt;br /&gt;In caso abbia sbagliato qualcosa siete pregati di farmelo notare.&lt;br /&gt;&lt;br /&gt;A presto.&lt;br /&gt;Odino&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-2498511589284510049?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/2498511589284510049/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=2498511589284510049' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/2498511589284510049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/2498511589284510049'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2011/07/xna-way-tutorial-12-ottimizzazioni-pt1.html' title='The Xna-Way: Tutorial 12: Performance &amp; Ottimizzazioni pt1'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-1142202603733049321</id><published>2011-07-23T10:10:00.000+02:00</published><updated>2011-07-23T10:12:18.400+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='The Xna-Way'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA Component'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Guida XNA'/><title type='text'>The Xna-Way: Special Tutorial: DreamSpark! Develop and deploy on the xBox 360</title><content type='html'>Finalmente in questi giorni sono riuscito a decidermi a comprare una xBox 360. &lt;br /&gt;Si sono stanto tanto stronzo che per tutti questi anni ho sviluppato con XNA solo su pc.&lt;br /&gt;&lt;br /&gt;Ma ora adesso che avevo la mia adorata console (piccolo momento di gloria: la slim è una cosa fantastica ^__^) dovevo trovare il modo di svilupparci sopra in modo appropriato.&lt;br /&gt;&lt;br /&gt;Il problema principale stava nel fatto che non avevo ora come ora la possibilithttp://www.blogger.com/img/blank.gifà di pagare l'abbonamento annuale di 75€ per l'XNA creator club. E sul sito MSDNAA della mia università non c'era nemmeno più la possibilità di richiedere l'abbonamento studenti.&lt;br /&gt;&lt;br /&gt;Ma per fortuna il WEB ci viene in aiuto. Può darsi che queste info siano ugualmente recuperabili da altre parti sul web, ma ho deciso lo stesso di condividerle tramite questo blog.&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;La Microsoft ha messo a disposizione di tutti gli studenti DEL MONDO (o perlomeno di moltissimi paesi) la possiblità di usufruire di molti http://www.blogger.com/img/blank.gifsuoi prodotti (certificati) in modo gratuito o scontato.&lt;br /&gt;Il segreto di tutto questo è il progetto DreamSpark, a cui potete accedere tramite &lt;a href="www.dreamspark.com"&gt;www.dreamspark.com&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Non voglio stare a farla tanto lunga: in parole povere questo permette a tutti gli stundenti universitari di qualsiasi facoltà (basta che sia registrata negli elenchi della Microsoft) di accedere ai loro prodotti.&lt;br /&gt;&lt;br /&gt;Ma vediamo come utilizzare tutto ciò per ottenere un account studente di 12 mesi per Xna creator Club (oramai di dovrebbe dire App Hub O_O).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Come presequisito è necessario essere studenti iscritti ad una qualche facoltà italiana!&lt;/span&gt;&lt;br /&gt;La prima cosa da fare è accedere con il vostro LiveID (MI RACCOMANDO! DOVETE ACCEDERE CON IL LiveID A CUI E' COLLEGATA LA GAMERTAG CHE UTILIZZATE SULLA VOSTRA CONSOLE!) ed andare qua &lt;a href="https://users.create.msdn.com/Register/"&gt;https://users.create.msdn.com/Register/&lt;/a&gt; e selezionare la voce &lt;span style="font-weight:bold;"&gt;Student&lt;/span&gt; quando vi verrà richiesto.&lt;br /&gt;Premendo next, al prossimo passo vi verrrà richiesta la certificazione tramite DreamSpark. Naturalmente si parte dal presesupposto che voi non l'abbiate, e quindi dovrete premere su &lt;span style="font-style:italic;"&gt;Visit DreamSpark now to get verified&lt;/span&gt;.&lt;br /&gt;Fatto ciò verrete reindirizzati al sito di DreamSpark, il quale vi chiederà di inserire alcuni dati fondamentali.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Step1&lt;/span&gt;&lt;br /&gt;Vi chiederà di inserire il paese in cui risiedete, poi selezionate &lt;span style="font-weight:bold;"&gt;Verify as a Student&lt;/span&gt;, e nell'ultima voce &lt;span style="font-weight:bold;"&gt;Get Verified through my School&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Step2&lt;/span&gt;&lt;br /&gt;Selezionate la vostra università nell'elenco di quelle disponibili per il vostro paese (se non è presente allora è un bel problema... ma non credo che ci dovrebbero essere atenei italiani mancanti).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Step3&lt;/span&gt;&lt;br /&gt;Adesso dovete inserire la vostra mail da studente, quella data dal vostro dipartimento per intenderci. A questa mail sarà inviata una mail con il codice per poter completare la verifica su DreamSpark.&lt;br /&gt;Voi potreste chiedere "Chi mi vieta di inserire una mail diversa?". Io non ho provato... ma non credo che sia molto complicato verificare al volo se la mail che inserite viene gestita dei server dell'università che avete scelto.&lt;br /&gt;Quindi è bene inserire il vostro vero indirizzo e-mail di dipartimento.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Step4&lt;/span&gt;&lt;br /&gt;Andate a leggere la mail che vi è arrivata. All'interno troverete il codice ed il link da visitare (dove appunto vi verrà richiesto di inserire il codice) per completare la registrazione.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Step5&lt;/span&gt;&lt;br /&gt;Ok ora siete verificati su DreamSpark!&lt;br /&gt;Tornate alla registrazione su App Hub, ripetere la procedura vista prima, selezionando sempre Student. Solo che questa volta mamma Microsoft si http://www.blogger.com/img/blank.gifaccorgerà della registrazione a DreamSpark e vi farà procedere.&lt;br /&gt;Ora non dovete far altro che seguire tutti i passi, riempire tutti i campi (NOTA: le info che inserite du App Hub devono essere coerenti con quelle inserite sulla vostra gamerTag, se no il sistema si altera e vi chiede di modificare i dati), ed alla fine avrete il vostro account!&lt;br /&gt;&lt;br /&gt;Nota: per chi vuole anche delle immagini sono riuscito a trovare proprio ora questo topic!&lt;br /&gt;&lt;a href="http://forum.studentidia.org/index.php?showtopic=22821"&gt;Guida alla verifica su DreamSpark&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Ora non dovete far altro che accendere la vostra console, accedere con la gamerTag relativa all'indirizzo/LiveID con cui vi siete registrati su App Hub. &lt;br /&gt;Nel market place, sotto la lettera X, troverete l'XNA Game Studio Connect (NOTA: il programmino è scaricabile anche da chi non si è registrato ad App Hub, solo che se l'account non soddisfa il tipo di registrazione il programma non parte -.-).&lt;br /&gt;&lt;br /&gt;Ora non ci resta che collegare la nostra console al pc.&lt;br /&gt;Per fare questo dobbiamo fare alcuni altri passi.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Connect xBox Step1&lt;/span&gt;&lt;br /&gt;Dovete lanciare Xna Game Studio Connect. Quando sarà partito vedrete a schermo un codice. Segnatevelo da qualche parte perchè vi servirà.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Connect xBox Step2&lt;/span&gt;&lt;br /&gt;Dal vostro pc dovete andare nel menù Tutti i programmi/Microsoft Xna Game Studio 4.0/ e selezionare la voce &lt;span style="font-weight:bold;"&gt;XNA Game Studio Device Center&lt;/span&gt;.&lt;br /&gt;Qua dovrete selezionare la vostra console, dargli un nome, e quando richiesto inserire il codice che vi siete segnati prima.&lt;br /&gt;&lt;br /&gt;Ok tutto fatto!&lt;br /&gt;Pc e console sono collegati.&lt;br /&gt;Per provare qualcosa adesso dovete fare quando segue:&lt;br /&gt;con Xna Game Studio Connect attivo sulla console ed in attesa di connessione dal vostro pc, dovete aprire Visual Studio (o Visual C#), aprire un progetto Xna (di tipo xBox360) e lanciarlo.&lt;br /&gt;Il progetto verrà compilato e distribuito sulla console in automatico. E potrete provarlo direttamente li!&lt;br /&gt;&lt;br /&gt;Tanto per gradire: funziona anche il debug! Cioè potete mettere dei break point nel codice, e l'esecuzione del gioco sulla console si bloccherà al raggiungimento del break point. :))&lt;br /&gt;Certo non potrete modificare al volo il codice come si fa in locale, ma una cosa pur sempre utile.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Spero di essere stato il più possibile chiaro.&lt;br /&gt;In seguito pubblicherò altri articoli sulle prove e sulle performance ottenute eseguendo vari progetti sulla console.&lt;br /&gt;&lt;br /&gt;Per ogni chiarimento chiedete pure tramite mail o tramite commenti.&lt;br /&gt;Saluti a tutti!&lt;br /&gt;Odino&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-1142202603733049321?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/1142202603733049321/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=1142202603733049321' title='1 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/1142202603733049321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/1142202603733049321'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2011/07/xna-way-special-tutorial-dreamspark.html' title='The Xna-Way: Special Tutorial: DreamSpark! Develop and deploy on the xBox 360'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-8783971436530569810</id><published>2011-07-09T19:30:00.001+02:00</published><updated>2011-07-09T19:32:22.854+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='The Xna-Way'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA Component'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Guida XNA'/><title type='text'>The Xna-Way: Tutorial 11: Spippolando con il gamePad</title><content type='html'>Ho recentemenete acquistato tramite Amazon.it il gamepad della xbox 360 con cavo usb, in modo da poterlo utilizzare su pc, e da poter provare direttamente su di esso le funzionalità del pad, che altrimenti sarebbero disponibili solo sulla console.&lt;br /&gt;&lt;br /&gt;Ho cominciato a giocarci, e questo è quanto ne ho ricavato fino ad ora.&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;Il pad in se per se è un ottimo prodotto. Ma questo già si sapeva :)&lt;br /&gt;&lt;br /&gt;Xna mette a dispozizione il &lt;span style="font-weight:bold;"&gt;GamePadState &lt;/span&gt;per poter interrogare lo stato del nostro pad. Come per tastiera e mouse, possiamo recuperare lo stato corrente del nostro pad tramite il metodo &lt;span style="font-weight:bold;"&gt;GamePad.GetState(PlayerIndex)&lt;/span&gt;, dove PlayerIndex indica il numero del giocatore/pad di cui vogliamo lo stato (il giocatore è identificato sul pad dal let acceso attorno al pulsante centrale, ed il valore di PlayerIndex varia tra 1 e 4).&lt;br /&gt;&lt;br /&gt;Tra i valori ed i metodi messi a disposizione da tale oggetto possiamo mettere in evidenza:&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;ThumbStick&lt;/span&gt;: ha due proprietà, Left e Right, che permettono di sapere la posizione dei due stick analogici del pad.&lt;br /&gt;Left e Right sono dei Vector2, quindi a loro volta hanno i valori per X ed Y. I valori che possono assumere variano in [-1,+1] (estremi compresi), dove -1 significa che lo stick è completamente a sinistra/basso, 1 significa che lo stick è completamente a destra/alto. Lo 0 significa che lo stick non è stato mosso. Valori intermedi rappresentano posizione intermedie dello stick nelle varie direzioni.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Triggers&lt;/span&gt;: i due grilletti posteriori del pad, oltre che come dei semplici bottoni (LeftTrigger e RightTrigger) che hanno stato rilasciato/premuto, possono essere identificati tramite questa proprietà, che contiene a sua volta due valori Left e Right, di tipo float. Questi due valori, varianti tra [0,1], estremi compresi, mi dicono quanto il grilletto è premuto, con 0 = rilasciato, 1 = completamente premuto, e valori intermedi, come prima, identificano posizioni intermedie.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Dpad&lt;/span&gt;: identifica lo stato delle "frecce direzionali" del pad. Le direzioni possibili sono 4, ma possono essere combinate due a due. Tramite questo oggetto possiamo controllare quali delle direzioni sono premute.&lt;br /&gt;Notate che il Dpad è completamente diverso dallo stick sinistro, quindi quando muovete lo stick sinistro non cambiate in nessun modo lo stato del Dpad (come era stato portato a credere inizialmente -.-), e viceversa.&lt;br /&gt;&lt;br /&gt;Spero che queste poche e brevi considerazioni personali sull'uso del gamepad possano tornare utili a qualcuno. Se avrò altro da aggiungere aggiornerò il post.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A presto.&lt;br /&gt;Odino&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-8783971436530569810?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/8783971436530569810/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=8783971436530569810' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/8783971436530569810'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/8783971436530569810'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2011/07/xna-way-tutorial-11-spippolando-con-il.html' title='The Xna-Way: Tutorial 11: Spippolando con il gamePad'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-2115240064455437138</id><published>2011-04-16T22:37:00.006+02:00</published><updated>2011-04-17T12:59:24.601+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='The Xna-Way'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA Component'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Guida XNA'/><title type='text'>The Xna-Way: Tutorial 10: Sprite Sheet &amp; 2D Animation</title><content type='html'>Vi siete mai imbattuti, mentre ricercavate risorse grafiche per i vostri giochi, negli sprite sheet? Immagini contenenti frame delle animazioni di personaggi, effetti speciali o altro?&lt;br /&gt;(Nota: molto belli sono quelli rippati dai vecchi giochi per il SNES, che potete trovare su alcuni siti, i cui link metterò alla fine del post).&lt;br /&gt;&lt;br /&gt;Vediamo un piccolo esempio su come possono essere utilizzati.&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Il codice sarà allegato alla fine del post!&lt;/span&gt;&lt;br /&gt;La strutturazione del codice per come l'ho pensata io è la seguente:&lt;br /&gt;- TextureCollection: un catalogo contenente tutte le texture2D caricate nel gioco, accedibili tramite un id unico&lt;br /&gt;- SpriteSheetCollection: un catalogo contenente gli SpriteSheet definiti per il gioco, anche questi accedibili tramite un id unico&lt;br /&gt;- AnimationDescCollection: un catalogo contenente la descrizione delle animazioni definite per il gioco, anche queste accedibili trami un id unico&lt;br /&gt;&lt;br /&gt;Le collezioni sopra definite sono definite come statiche, in modo che possano essere accedibili da ogni parte del codice.&lt;br /&gt;&lt;br /&gt;VI sono poi altre classi:&lt;br /&gt;- SpriteSheet: rappresenta un'immagine divisa in frame. Contiene l'identificatore della texture all'interno della TextureCollection, il numero di frame sull'asse X e sull'asse Y, oltre che un metodo per calcolare il rettangolo relativo al frammento di immagine che si vuole utilizzare.&lt;br /&gt;&lt;br /&gt;-AnimationDesc: contiene una collezione di frame che specificano l'animazione, oltre a dire se l'animazione deve essere ripetuta all'infinito o meno.&lt;br /&gt;- Frame: speficifica quale SpriteSheet utilizzare e quale è l'id del frammento da utilizzare (NOTA: I frammenti contentuni all'interno di uno spriteSheet sono numerati da 0 al numero massimo -1, partendo dall'angolo in alto a sinistra e procedendo da destra verso sinistra, e dall'alto verso il basso).&lt;br /&gt;&lt;br /&gt;- Animation: è l'oggetto che implementa l'animazione vera e propria. Contiene l'id della descrizione dell'animazione che si sta utilizzando, il frame corrente (cioè dove siamo arrivati a riprodurre l'animazione), il tempo passato dall'ultimo aggiornamento (in modo da poter avanzare il frame corrente al momento giusto), e la posizione dell'animazione nella vista del gioco.&lt;br /&gt;&lt;br /&gt;Infine arriviamo al componente principale:&lt;br /&gt;- AnimationManager: è il gameComponent che si preoccupa di gestire ed animare gli oggetti Animation che gli vengono dati in pasto.&lt;br /&gt;&lt;br /&gt;Ecco il codice per le classi principali:&lt;br /&gt;&lt;h2 style='cursor:pointer;' onclick='openclose("myElm");'&gt;Show&amp;nabla;&lt;/h2&gt;&lt;br /&gt;&lt;div id="myElm"&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    &lt;span class="rem"&gt;/// rappresenta un singolo frame dell'animazione&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="rem"&gt;/// Si caratterizza per l'id dello spriteSheet e per il frammento di immagine utilizzato dal frame&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Frame&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    {&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        &lt;span class="rem"&gt;/// Id dello spriteSheet che deve essere presente nella spriteSheetCollection&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;long&lt;/span&gt; IdSpriteSheet { get; &lt;span class="kwrd"&gt;private&lt;/span&gt; set; }&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;        &lt;span class="rem"&gt;/// Id del frammento dell'immagine che si utilizza per il particolare frame&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; IdFragment { get; &lt;span class="kwrd"&gt;private&lt;/span&gt; set; }&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;        &lt;span class="rem"&gt;/// Costruisce un frame per l'animazione&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;param name="idSpriteSheet"&amp;gt;Id di riferimento per lo spriteSheet che deve essere presente nella spriteSheetCollection&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;param name="idFragment"&amp;gt;Id del frammento dell'immagine che si utilizza per il particolare frame&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; Frame(&lt;span class="kwrd"&gt;long&lt;/span&gt; idSpriteSheet, &lt;span class="kwrd"&gt;int&lt;/span&gt; idFragment)&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;        {&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;            &lt;span class="kwrd"&gt;this&lt;/span&gt;.IdSpriteSheet = idSpriteSheet;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;            &lt;span class="kwrd"&gt;this&lt;/span&gt;.IdFragment = idFragment;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;        }&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;    }&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;    &lt;span class="rem"&gt;/// Descrive come è fatta un'animazione&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; AnimationDesc&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;    {&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  34:  &lt;/span&gt;        &lt;span class="rem"&gt;/// Lista dei frame che compongono l'animazione&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  35:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  36:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; List&amp;lt;Frame&amp;gt; FrameList { get; set; }&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  37:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  38:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  39:  &lt;/span&gt;        &lt;span class="rem"&gt;/// Vale true se l'animazione deve ripetersi&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  40:  &lt;/span&gt;        &lt;span class="rem"&gt;/// False altrimenti&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  41:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  42:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; Loop { get; set; }&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  43:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  44:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  45:  &lt;/span&gt;        &lt;span class="rem"&gt;/// Crea la descrizione di un'animazione che non si ripete dopo la fine&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  46:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  47:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; AnimationDesc()&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  48:  &lt;/span&gt;            : &lt;span class="kwrd"&gt;this&lt;/span&gt;(&lt;span class="kwrd"&gt;false&lt;/span&gt;)&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  49:  &lt;/span&gt;        {&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  50:  &lt;/span&gt;        }&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  51:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  52:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  53:  &lt;/span&gt;        &lt;span class="rem"&gt;/// Crea la descrizione di un'animazione permettendo di configurare la ripetizione&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  54:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  55:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;param name="loop"&amp;gt;True se si vuol far ripetere l'animazione, false altrimenti&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  56:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; AnimationDesc(&lt;span class="kwrd"&gt;bool&lt;/span&gt; loop)&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  57:  &lt;/span&gt;        {&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  58:  &lt;/span&gt;            FrameList = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;Frame&amp;gt;();&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  59:  &lt;/span&gt;            Loop = loop;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  60:  &lt;/span&gt;        }&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  61:  &lt;/span&gt;    }&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  62:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  63:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  64:  &lt;/span&gt;    &lt;span class="rem"&gt;/// Definisce un'animazione da visualizzare a schermo dall'AnimationManager&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  65:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  66:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Animation&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  67:  &lt;/span&gt;    {&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  68:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  69:  &lt;/span&gt;        &lt;span class="rem"&gt;/// Posizione (nel range dello schermo) in cui viene visualizzata l'animazione&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  70:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  71:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; Vector2 Position { get; set; }&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  72:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  73:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  74:  &lt;/span&gt;        &lt;span class="rem"&gt;/// Frame corrente dell'animazione&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  75:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  76:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; CurrentFrame { get; set; }&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  77:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  78:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  79:  &lt;/span&gt;        &lt;span class="rem"&gt;/// Id dell'AnimationDesc utilizzata&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  80:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  81:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;long&lt;/span&gt; IdAnimationDesc { get; &lt;span class="kwrd"&gt;private&lt;/span&gt; set; }&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  82:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  83:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  84:  &lt;/span&gt;        &lt;span class="rem"&gt;/// Tempo passato dall'ultimo cambio di frame&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  85:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  86:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; ElapsedTime { get; set; }&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  87:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  88:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  89:  &lt;/span&gt;        &lt;span class="rem"&gt;/// Crea una nuova Animazione con riferimento all'AnimationDesc con id passato. Creata in posizione (0,0)&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  90:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  91:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;param name="idAnimation"&amp;gt;Id dell'AnimationDesc presente nella AnimationsDescCollection&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  92:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; Animation(&lt;span class="kwrd"&gt;long&lt;/span&gt; idAnimationDesc)&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  93:  &lt;/span&gt;            : &lt;span class="kwrd"&gt;this&lt;/span&gt;(idAnimationDesc, Vector2.Zero)&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  94:  &lt;/span&gt;        {&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  95:  &lt;/span&gt;        }&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  96:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  97:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  98:  &lt;/span&gt;        &lt;span class="rem"&gt;/// Crea una nuova Animazione con riferimento all'AnimationDesc con id passato.&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  99:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 100:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;param name="idAnimation"&amp;gt;Id dell'AnimationDesc presente nella AnimationsDescCollection&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 101:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;param name="position"&amp;gt;Posizione dell'Animazione&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 102:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; Animation(&lt;span class="kwrd"&gt;long&lt;/span&gt; idAnimationDesc, Vector2 position)&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 103:  &lt;/span&gt;        {&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 104:  &lt;/span&gt;            &lt;span class="kwrd"&gt;this&lt;/span&gt;.IdAnimationDesc = idAnimationDesc;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 105:  &lt;/span&gt;            &lt;span class="kwrd"&gt;this&lt;/span&gt;.Position = position;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 106:  &lt;/span&gt;            ElapsedTime = 0;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 107:  &lt;/span&gt;        }&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 108:  &lt;/span&gt;    }&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 109:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 110:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 111:  &lt;/span&gt;    &lt;span class="rem"&gt;/// Component per il rendering della Animation a schermo&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 112:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 113:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; AnimationManager : Microsoft.Xna.Framework.DrawableGameComponent&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 114:  &lt;/span&gt;    {&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 115:  &lt;/span&gt;        &lt;span class="rem"&gt;//spritebatch su cui disegnare&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 116:  &lt;/span&gt;        SpriteBatch spriteBatch = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 117:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 118:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 119:  &lt;/span&gt;        &lt;span class="rem"&gt;/// lista delle animazioni da eseguire. Un'animazione viene automaticamente rimossa al termine della sua animazione&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 120:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 121:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; List&amp;lt;Animation&amp;gt; AnimationList { get; set; }&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 122:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 123:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; AnimationManager(Game game)&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 124:  &lt;/span&gt;            : &lt;span class="kwrd"&gt;base&lt;/span&gt;(game)&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 125:  &lt;/span&gt;        {&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 126:  &lt;/span&gt;            AnimationList = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;Animation&amp;gt;();&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 127:  &lt;/span&gt;        }&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 128:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 129:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 130:  &lt;/span&gt;        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; LoadContent()&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 131:  &lt;/span&gt;        {&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 132:  &lt;/span&gt;            spriteBatch = &lt;span class="kwrd"&gt;new&lt;/span&gt; SpriteBatch(Game.GraphicsDevice);&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 133:  &lt;/span&gt;            &lt;span class="kwrd"&gt;base&lt;/span&gt;.LoadContent();&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 134:  &lt;/span&gt;        }&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 135:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 136:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Initialize()&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 137:  &lt;/span&gt;        {&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 138:  &lt;/span&gt;            &lt;span class="kwrd"&gt;base&lt;/span&gt;.Initialize();&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 139:  &lt;/span&gt;        }&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 140:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 141:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Update(GameTime gameTime)&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 142:  &lt;/span&gt;        {&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 143:  &lt;/span&gt;            &lt;span class="kwrd"&gt;int&lt;/span&gt; delta = gameTime.ElapsedGameTime.Milliseconds;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 144:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 145:  &lt;/span&gt;            AnimationDesc desc = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 146:  &lt;/span&gt;            &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = AnimationList.Count - 1; i &amp;gt;= 0; i--)&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 147:  &lt;/span&gt;            {&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 148:  &lt;/span&gt;                desc = AnimationsDescCollection.AnimationCollection[AnimationList[i].IdAnimationDesc];&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 149:  &lt;/span&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt; (!desc.Loop &amp;amp;&amp;amp; AnimationList[i].CurrentFrame == desc.FrameList.Count - 1)&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 150:  &lt;/span&gt;                    AnimationList.RemoveAt(i);&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 151:  &lt;/span&gt;                &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (desc.Loop &amp;amp;&amp;amp; AnimationList[i].CurrentFrame == desc.FrameList.Count - 1)&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 152:  &lt;/span&gt;                    AnimationList[i].CurrentFrame = 0;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 153:  &lt;/span&gt;            }&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 154:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 155:  &lt;/span&gt;            &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; AnimationList.Count; i++)&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 156:  &lt;/span&gt;            {&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 157:  &lt;/span&gt;                desc = AnimationsDescCollection.AnimationCollection[AnimationList[i].IdAnimationDesc];&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 158:  &lt;/span&gt;                AnimationList[i].ElapsedTime += delta;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 159:  &lt;/span&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt; (AnimationList[i].ElapsedTime &amp;gt;= 40)&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 160:  &lt;/span&gt;                {&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 161:  &lt;/span&gt;                    AnimationList[i].ElapsedTime -= 40;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 162:  &lt;/span&gt;                    AnimationList[i].CurrentFrame++;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 163:  &lt;/span&gt;                }&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 164:  &lt;/span&gt;            }&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 165:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 166:  &lt;/span&gt;            &lt;span class="kwrd"&gt;base&lt;/span&gt;.Update(gameTime);&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 167:  &lt;/span&gt;        }&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 168:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 169:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt;  Draw(GameTime gameTime)&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 170:  &lt;/span&gt;        {&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 171:  &lt;/span&gt;            spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend);&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 172:  &lt;/span&gt;            AnimationDesc desc = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 173:  &lt;/span&gt;            &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; AnimationList.Count; i++)&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 174:  &lt;/span&gt;            {&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 175:  &lt;/span&gt;                desc = AnimationsDescCollection.AnimationCollection[AnimationList[i].IdAnimationDesc];&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 176:  &lt;/span&gt;                Frame current = desc.FrameList[AnimationList[i].CurrentFrame];&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 177:  &lt;/span&gt;                SpriteSheet spriteSheet = SpriteSheetCollection.SpritesSheetCollection[current.IdSpriteSheet];&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 178:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 179:  &lt;/span&gt;                Texture2D img = TextColl.TextureCollection[spriteSheet.IdTexture];&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 180:  &lt;/span&gt;                Rectangle sRec = spriteSheet.GetRectangle(current.IdFragment);&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 181:  &lt;/span&gt;                spriteBatch.Draw(img, AnimationList[i].Position - &lt;span class="kwrd"&gt;new&lt;/span&gt; Vector2(sRec.Width / 2, sRec.Height / 2),&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 182:  &lt;/span&gt;                    sRec, Color.White);&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 183:  &lt;/span&gt;            }&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 184:  &lt;/span&gt;            spriteBatch.End();&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 185:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 186:  &lt;/span&gt;            &lt;span class="kwrd"&gt;base&lt;/span&gt;.Draw(gameTime);&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 187:  &lt;/span&gt;        }&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 188:  &lt;/span&gt;    }&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;h2 style='cursor:pointer;' onclick='openclose("myElm");'&gt;Hide&amp;Delta;&lt;/h2&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;E questo è il codice per il Game:&lt;br /&gt;&lt;h2 style='cursor:pointer;' onclick='openclose("myElm2");'&gt;Show&amp;nabla;&lt;/h2&gt;&lt;br /&gt;&lt;div id="myElm2"&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Game1 : Microsoft.Xna.Framework.Game&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    {&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;        GraphicsDeviceManager graphics;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;        SpriteBatch spriteBatch;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        SpriteFont font;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        AnimationManager animMng;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        &lt;span class="rem"&gt;//stato del mouse al ciclo precedente&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        MouseState lastMS;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; Game1()&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;        {&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;            graphics = &lt;span class="kwrd"&gt;new&lt;/span&gt; GraphicsDeviceManager(&lt;span class="kwrd"&gt;this&lt;/span&gt;);&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;            Content.RootDirectory = &lt;span class="str"&gt;"Content"&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;            graphics.PreferredBackBufferWidth = 800;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;            graphics.PreferredBackBufferHeight = 600;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;            TextColl.Initialize();&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;            SpriteSheetCollection.Initialize();&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;            AnimationsDescCollection.Initialize();&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;            Components.Add((animMng = &lt;span class="kwrd"&gt;new&lt;/span&gt; AnimationManager(&lt;span class="kwrd"&gt;this&lt;/span&gt;)));&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;            IsMouseVisible = &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;        }&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Initialize()&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;        {&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;            &lt;span class="kwrd"&gt;base&lt;/span&gt;.Initialize();&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt;        }&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  34:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  35:  &lt;/span&gt;        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; LoadContent()&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  36:  &lt;/span&gt;        {&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  37:  &lt;/span&gt;            spriteBatch = &lt;span class="kwrd"&gt;new&lt;/span&gt; SpriteBatch(GraphicsDevice);&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  38:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  39:  &lt;/span&gt;            font = Content.Load&amp;lt;SpriteFont&amp;gt;(&lt;span class="str"&gt;"font"&lt;/span&gt;);&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  40:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  41:  &lt;/span&gt;            TextColl.TextureCollection.Add(0, Content.Load&amp;lt;Texture2D&amp;gt;(&lt;span class="str"&gt;"prova"&lt;/span&gt;));&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  42:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  43:  &lt;/span&gt;            SpriteSheet ss = &lt;span class="kwrd"&gt;new&lt;/span&gt; SpriteSheet(0, 5, 2);&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  44:  &lt;/span&gt;            SpriteSheetCollection.SpritesSheetCollection.Add(0, ss);&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  45:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  46:  &lt;/span&gt;            AnimationDesc ad = &lt;span class="kwrd"&gt;new&lt;/span&gt; AnimationDesc();&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  47:  &lt;/span&gt;            ad.FrameList.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; Frame(0, 0));&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  48:  &lt;/span&gt;            ad.FrameList.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; Frame(0, 1));&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  49:  &lt;/span&gt;            ad.FrameList.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; Frame(0, 2));&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  50:  &lt;/span&gt;            ad.FrameList.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; Frame(0, 3));&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  51:  &lt;/span&gt;            ad.FrameList.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; Frame(0, 4));&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  52:  &lt;/span&gt;            AnimationsDescCollection.AnimationCollection.Add(0, ad);&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  53:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  54:  &lt;/span&gt;            lastMS = Mouse.GetState();&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  55:  &lt;/span&gt;        }&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  56:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  57:  &lt;/span&gt;        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; UnloadContent()&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  58:  &lt;/span&gt;        {&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  59:  &lt;/span&gt;        }&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  60:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  61:  &lt;/span&gt;        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Update(GameTime gameTime)&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  62:  &lt;/span&gt;        {&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  63:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (Keyboard.GetState().IsKeyDown(Keys.Escape))&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  64:  &lt;/span&gt;                &lt;span class="kwrd"&gt;this&lt;/span&gt;.Exit();&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  65:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  66:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (lastMS.LeftButton == ButtonState.Released &amp;amp;&amp;amp; Mouse.GetState().LeftButton == ButtonState.Pressed)&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  67:  &lt;/span&gt;            {&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  68:  &lt;/span&gt;                MouseState ms = Mouse.GetState();&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  69:  &lt;/span&gt;                Animation anim = &lt;span class="kwrd"&gt;new&lt;/span&gt; Animation(0, &lt;span class="kwrd"&gt;new&lt;/span&gt; Vector2(ms.X, ms.Y));&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  70:  &lt;/span&gt;                animMng.AnimationList.Add(anim);&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  71:  &lt;/span&gt;            }&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  72:  &lt;/span&gt;            lastMS = Mouse.GetState();&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  73:  &lt;/span&gt;            &lt;span class="kwrd"&gt;base&lt;/span&gt;.Update(gameTime);&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  74:  &lt;/span&gt;        }&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  75:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  76:  &lt;/span&gt;        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Draw(GameTime gameTime)&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  77:  &lt;/span&gt;        {&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  78:  &lt;/span&gt;            GraphicsDevice.Clear(Color.CornflowerBlue);&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  79:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  80:  &lt;/span&gt;            &lt;span class="kwrd"&gt;base&lt;/span&gt;.Draw(gameTime);&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  81:  &lt;/span&gt;        }&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  82:  &lt;/span&gt;    }&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;h2 style='cursor:pointer;' onclick='openclose("myElm2");'&gt;Hide&amp;Delta;&lt;/h2&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Come potete vedere non è nulla di trascendentale o di così complicato come poteva sembrare.&lt;br /&gt;Vi allego anche la soluzione per Xna4 (se il link non funziona contattatemi):&lt;br /&gt;&lt;a href="http://odino87.interfree.it/XNA/SpriteSheet.rar"&gt;Soluzione Visual Sutdio&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ed ecco un buonissimo sito con tantissimi spriteSheet!&lt;br /&gt;&lt;a href="http://sdb.drshnaps.com/system.php?sys=4"&gt;Sprite Database&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Alla prossima!&lt;br /&gt;Odino&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-2115240064455437138?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/2115240064455437138/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=2115240064455437138' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/2115240064455437138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/2115240064455437138'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2011/04/xna-way-tutorial-10-sprite-sheet-2d.html' title='The Xna-Way: Tutorial 10: Sprite Sheet &amp; 2D Animation'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-7015051799439631631</id><published>2011-04-16T21:16:00.005+02:00</published><updated>2011-04-16T21:31:33.500+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='The Xna-Way'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA Component'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Guida XNA'/><title type='text'>The Xna-Way: Tutorial 9 (Trick): Ordine dei DrawableGameComponent/GameComponent</title><content type='html'>Vi siete mai trovati a dover aggiungere diversi GameComponent al vostro progetto?&lt;br /&gt;Bè credo di si, dato che sono il componente fondamentale su cui si basa XNA.&lt;br /&gt;&lt;br /&gt;E scommetto che molti si sono trovati nella situazione in cui un Component esegua il metodo Update prima di un altro, o che vengano eseguiti i metodi Draw in un ordine che non è quello desiderato... producendo in questo modo effetti del tutto errati.&lt;br /&gt;&lt;br /&gt;Ma c'è un semplicisso modo per ovviare a tutto questo.&lt;br /&gt;La classe GameComponent espongono due proprietà interessanti:&lt;br /&gt;- UpdateOrder: indica in quale ordine i componenti devono eseguire il loro metodo Update (questo se sono attivi). L'ordine è relativo agli altri componenti presenti nella stessa collezione. Naturalmente i GameComponent con valori più bassi verrano aggiornati prima.&lt;br /&gt;- DrawOrder: indica in quale ordine verrano eseguiti i metodi Draw dei vari componenti.&lt;br /&gt;&lt;br /&gt;Queste due proprietà sono molto utili quando si lavora con componenti che si devono "passare" dai, o per i quali è necessario che lo stato (o la parte di stato) del gioco sui cui operano sia stata prima aggiornata da un altro componente.&lt;br /&gt;&lt;br /&gt;Lo stesso dicasi per l'ordine del rendering della scena. Ciò torna molto utile nel caso si abbia più DrawableGameComponent i quali operano su SpriteBatch differenti per esempio. Così potremmo delegare ai vari componenti il render di una parte della vista, per poi comporre il tutto assieme con pochissimo sforzo.&lt;br /&gt;&lt;br /&gt;Spero vi sia utile (a me lo è stato^^).&lt;br /&gt;Per qualsiasi dubbio contattatemi pure.&lt;br /&gt;A presto.&lt;br /&gt;&lt;br /&gt;Odino&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-7015051799439631631?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/7015051799439631631/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=7015051799439631631' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/7015051799439631631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/7015051799439631631'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2011/04/xna-way-tutorial-9-trick-ordine-dei.html' title='The Xna-Way: Tutorial 9 (Trick): Ordine dei DrawableGameComponent/GameComponent'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-4959063783283824046</id><published>2011-04-05T13:35:00.002+02:00</published><updated>2011-04-05T13:38:26.907+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='The Xna-Way'/><category scheme='http://www.blogger.com/atom/ns#' term='X-RPG Builder'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Lavori'/><category scheme='http://www.blogger.com/atom/ns#' term='comunicazioni'/><category scheme='http://www.blogger.com/atom/ns#' term='Guida XNA'/><title type='text'>X-RPG Builder 2D - aggiornamento 8</title><content type='html'>Lo sviluppo del progetto è attualmente sospeso causa studi universitari, che mi portano via la maggior parte del tempo, e nel tempo che mi rimane mi sono messo a sviluppare un altro proggetto, che spero porterà alla nascita di un Indie Game da poter poi inserire nel Market Place della Microsft.&lt;br /&gt;&lt;br /&gt;Per qualsiasi domanda sul progetto X-Rpg Builder 2D (quando riprenderà, come funzionano certi particolari, come sono state realizzate le strutture dati, etc) contattatemi via e-email. &lt;br /&gt;&lt;br /&gt;A presto.&lt;br /&gt;Odino&lt;br /&gt;&lt;span class="fullpost"&gt;E questo è il resto.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-4959063783283824046?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/4959063783283824046/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=4959063783283824046' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/4959063783283824046'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/4959063783283824046'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2011/04/x-rpg-builder-2d-aggiornamento-8.html' title='X-RPG Builder 2D - aggiornamento 8'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-6228653695324495625</id><published>2011-03-13T10:14:00.005+01:00</published><updated>2011-03-13T10:21:44.253+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='The Xna-Way'/><category scheme='http://www.blogger.com/atom/ns#' term='X-RPG Builder'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Lavori'/><category scheme='http://www.blogger.com/atom/ns#' term='comunicazioni'/><category scheme='http://www.blogger.com/atom/ns#' term='Guida XNA'/><title type='text'>X-RPG Builder 2D - aggiornamento 7</title><content type='html'>E' passato un bel di tempo dall'ultimo aggiornamento.&lt;br /&gt;Cosa è successo nel frattempo?&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;Tante cose. Tanti intoppi, altre faccende da sbrigare che mi hanno tenuto lontano dallo sviluppo.&lt;br /&gt;Solo da poco ho ripreso a mettere mano al codice.&lt;br /&gt;Sto ora lavorando alla parte game del progetto, sviluppando i components e le classi che dovranno mandare effettivamente avanti il gioco.&lt;br /&gt;Ho sviluppato parte del sistema di generazione e gestione delle azioni (e del corrispettivo codice da eseguire) scatenate dagli eventi di gioco.&lt;br /&gt;Per esempio adesso sto lavorando sulla parte del menù di interazione con l'untente, e questo è l'effetto per ora ottenuto.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm6.static.flickr.com/5019/5521680617_1fe0c5df07_b.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 240px; height: 187px;" src="http://farm6.static.flickr.com/5019/5521680617_1fe0c5df07_m.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;C'è ancora molto da fare.&lt;br /&gt;E con il ricominciare delle lezioni può darsi che il tempo che passerò a sviluppare il tutto diminuirà drasticamente. Ma piano piano si porterà tutto a compimento.&lt;br /&gt;&lt;br /&gt;Alla prossima!&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-6228653695324495625?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/6228653695324495625/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=6228653695324495625' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/6228653695324495625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/6228653695324495625'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2011/03/x-rpg-builder-2d-aggiornamento-7.html' title='X-RPG Builder 2D - aggiornamento 7'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm6.static.flickr.com/5019/5521680617_1fe0c5df07_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-5642207914371809610</id><published>2011-01-06T19:30:00.003+01:00</published><updated>2011-01-06T19:38:42.685+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='The Xna-Way'/><category scheme='http://www.blogger.com/atom/ns#' term='X-RPG Builder'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Lavori'/><category scheme='http://www.blogger.com/atom/ns#' term='comunicazioni'/><category scheme='http://www.blogger.com/atom/ns#' term='Guida XNA'/><title type='text'>X-RPG Builder 2D - aggiornamento 6</title><content type='html'>Piccolo aggiornamento sull'editor ed in parte sul game Engine.&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;Ho dovuto separare in modo drastico la libreria base per l'Rpg dal resto della logica dell'applicazione, in modo da avere un ottimo riutilizzo del codice tra editor e motore del gioco.&lt;br /&gt;&lt;br /&gt;Adesso l'engine e l'editor specializzano solo le classi necessarie alla gestione delle immagini, mentre la parte di caricamento è rimasta la solita.&lt;br /&gt;Quindi ho dovuto riscrivere buona parte dell'engine, e ho cominciato a strutturare i vari gameComponents che dovranno girare in background nel gioco.&lt;br /&gt;&lt;br /&gt;Per quanto riguarda l'editor adesso sto strutturando la gestione e la personalizzazione degli eventi, compreso il codice degli eventi. Il codice degli eventi potrà anche portare all'esecuzione di codice C# personale.&lt;br /&gt;Quello che voglio fare è ottenere, dalla struttura del codice degli eventi, la produzione di codice C# che dopo dovrà essere compilato ed eseguito: cioè voglio che durante la fase di esportazione del progetto mi venga generato il codice C# relativo allo pseudo codice degli eventi. In questo modo non dovrò costruirmi un interprete personalizzato per il codice.&lt;br /&gt;&lt;br /&gt;Eccovi un'immagine di come si presenta in questo momento l'editor degli eventi:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm6.static.flickr.com/5044/5330322805_72028215f3_b.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 500px; height: 266px;" src="http://farm6.static.flickr.com/5044/5330322805_72028215f3.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Vi saluto.&lt;br /&gt;A presto con altri aggiornamenti :)&lt;br /&gt;Ciau&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-5642207914371809610?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/5642207914371809610/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=5642207914371809610' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/5642207914371809610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/5642207914371809610'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2011/01/x-rpg-builder-2d-aggiornamento-6.html' title='X-RPG Builder 2D - aggiornamento 6'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm6.static.flickr.com/5044/5330322805_72028215f3_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-5148324351658556463</id><published>2010-12-05T21:51:00.003+01:00</published><updated>2010-12-05T21:55:51.440+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='The Xna-Way'/><category scheme='http://www.blogger.com/atom/ns#' term='X-RPG Builder'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Lavori'/><category scheme='http://www.blogger.com/atom/ns#' term='comunicazioni'/><category scheme='http://www.blogger.com/atom/ns#' term='Guida XNA'/><title type='text'>X-RPG Builder 2D - aggiornamento 5</title><content type='html'>Questo non è un vero e proprio aggiornamento, ma solo una comunicazione.&lt;br /&gt;&lt;br /&gt;Dato che sto seguendo le lezioni dei corsi universitari adesso ho poco tempo (come poche energie) da dedicare a questo progetto, che sta quindi procedendo molto a rilento.&lt;br /&gt;In questo periodo mi sono concentrato sull'editor (e non sul motore del gioco) in modo da poter produrre tutti i dati di cui la mia applicazione finale potrà aver bisogno.&lt;br /&gt;Sono state aggiunte diverse funzioanlità all'editor, ma ancora manca molto da fare.&lt;br /&gt;&lt;br /&gt;Una della perti più importanti da fare (da progettare e da implementare), e che sarà un po' il cuore di tutto è la gestione degli eventi. Questa parte (a cui piano piano sto pensando) rappresenterà il nucleo primario del funzionamento del gioco. &lt;br /&gt;Quindi è fondamentale ponderare bene la sua costruzione, pena una grossa fila di eresie.&lt;br /&gt;&lt;br /&gt;Spero a presto con dei veri aggiornamenti.&lt;br /&gt;Odino&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-5148324351658556463?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/5148324351658556463/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=5148324351658556463' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/5148324351658556463'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/5148324351658556463'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2010/12/x-rpg-builder-2d-aggiornamento-5.html' title='X-RPG Builder 2D - aggiornamento 5'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-2876645042047845250</id><published>2010-10-08T13:45:00.003+02:00</published><updated>2010-10-12T15:16:37.432+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='The Xna-Way'/><category scheme='http://www.blogger.com/atom/ns#' term='X-RPG Builder'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Lavori'/><category scheme='http://www.blogger.com/atom/ns#' term='comunicazioni'/><category scheme='http://www.blogger.com/atom/ns#' term='Guida XNA'/><title type='text'>X-RPG Builder 2D - aggiornamento 4</title><content type='html'>Aggiunta la gestione della creazione e modifica della animazioni per le skill.&lt;br /&gt;Queste animazioni potranno essere utilizzate anche al di fuori delle battaglie, quindi potranno essere utilizzate come "effetti" speciali nell'esplorazione della mappa. &lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;L'ultima versione di Rpg-maker permetteva l'utilizzo di sole due immagini (se ricordo bene) come fonte per i frame da utilizzare per definire le animazioni.&lt;br /&gt;Ho invece deciso che nel mio editor non ci siano limiti al numero di immagini che è possibile utilizzare come fonte per i frame.&lt;br /&gt;Non ci sono ne limiti al numero di immagini che possono comporre un frame, ne al numero di frame che è possibile aggiungere all'immagine. Si possono creare animazioni lunghe a piacimento.&lt;br /&gt;&lt;br /&gt;Certo manca ancora tutta la gestione degli effetti sonori e di altri effetti grafici.&lt;br /&gt;Ma ora come ora sto mirando a produrre più roba possibile ed avere un qualcosa di funzionante.&lt;br /&gt;Per fare questo ho anche cominciato a definire le altre strutture dati di cui avrò bisogno per far funzionare il tutto, tra cui ci sono gli Status che si possono subire (sia per i nemici che per gli alleati), gli elementi (fuoco, acqua, etc) che sono presenti nel gioco e che determineranno l'efficacia delle abilità.&lt;br /&gt;Ora c'è da definire le abilità/magie, gli equipaggiamenti, gli oggetti dell'inventario. Insomma il lavoro non manca.&lt;br /&gt;Quello che mi "spaventa" un po' di più è la creazione di formule bilanciate per il calcolo dei danni che verranno inferti dai/verso i mob.&lt;br /&gt;Quella sarà una parte bella complessa mi sa...&lt;br /&gt;Ma ci arriverò piano piano.&lt;br /&gt;&lt;br /&gt;Alla prossima.&lt;br /&gt;Sperando di riuscire ad uppare anche un video della gestione delle animazioni.&lt;br /&gt;&lt;br /&gt;A presto!&lt;br /&gt;Odino&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-2876645042047845250?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/2876645042047845250/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=2876645042047845250' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/2876645042047845250'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/2876645042047845250'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2010/10/x-rpg-builder-2d-aggiornamento-4.html' title='X-RPG Builder 2D - aggiornamento 4'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-5658006003886274486</id><published>2010-09-22T11:18:00.002+02:00</published><updated>2010-09-22T11:21:20.397+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='The Xna-Way'/><category scheme='http://www.blogger.com/atom/ns#' term='X-RPG Builder'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Lavori'/><category scheme='http://www.blogger.com/atom/ns#' term='comunicazioni'/><category scheme='http://www.blogger.com/atom/ns#' term='Guida XNA'/><title type='text'>X-RPG Builder 2D - aggiornamento 3</title><content type='html'>Altro aggiornamento su questo piccolo (almeno per ora) editor.&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;Credo di aver ormai completato la gestione dei tileset, e di aver implementato anche la gestione dei "livelli" dei tileset di tipo B (quelli che su RPG-Maker erano dedicati a tetti e muri).&lt;br /&gt;Ecco un'immagine di come vengono gestiti nel gioco (e nell'editor di mappe naturalmente).&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm5.static.flickr.com/4087/5012015776_0410945211_b.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 240px; height: 171px;" src="http://farm5.static.flickr.com/4087/5012015776_0410945211_m.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;Direi che come risultato può andare più che bene.&lt;br /&gt;Non mi pare di vedere difetti nel render o nella continuità dei tileset.&lt;br /&gt;Se ne notate perfavore ditelo! ^_^&lt;br /&gt;&lt;br /&gt;Alla prossima!&lt;br /&gt;Odino&lt;br /&gt; &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-5658006003886274486?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/5658006003886274486/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=5658006003886274486' title='1 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/5658006003886274486'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/5658006003886274486'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2010/09/x-rpg-builder-2d-aggiornamento-3.html' title='X-RPG Builder 2D - aggiornamento 3'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm5.static.flickr.com/4087/5012015776_0410945211_t.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-3035855207031840536</id><published>2010-09-18T10:56:00.002+02:00</published><updated>2010-09-18T11:04:39.722+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='The Xna-Way'/><category scheme='http://www.blogger.com/atom/ns#' term='X-RPG Builder'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Lavori'/><category scheme='http://www.blogger.com/atom/ns#' term='comunicazioni'/><category scheme='http://www.blogger.com/atom/ns#' term='Guida XNA'/><title type='text'>X-RPG Builder 2D - aggiornamento 2</title><content type='html'>Eccomi con un altro aggiornamento su X-RPG Builder 2D.&lt;br /&gt;Sembra che più sia stressato, più abbia mal di testa e meglio riesca a lavorare...&lt;br /&gt;vabbè andiamo avanti.&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;Ho aggiunto la gestione degli altri 2 tile set utilizzati da RPG Maker VX, e cioè il tile set per le montagne e le foreste/erba (sempre di 2 celle orizzontali per 3 celle verticali) e quello per i muri/tetto (di 2 celle per 2 celle).&lt;br /&gt;Questo è uno screen preso dal mio editor:&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 317px; height: 296px;" src="http://farm5.static.flickr.com/4111/4997769275_e69855a15d.jpg" border="0" alt="" /&gt;&lt;br /&gt;come si può vedere il risultato non è male, cioè almeno io ne sono abbastanza soddisfatto (c'è ancora da gestire qualcosa ma per ora può bastare, i dettagli li puntualizzerò più avanti).&lt;br /&gt;&lt;br /&gt;Questo invece è il gioco in esecuzione nel progetto XNA &lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm5.static.flickr.com/4127/5000855246_068faa19f6_b.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 240px; height: 179px;" src="http://farm5.static.flickr.com/4127/5000855246_068faa19f6_m.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;Gli npc in automatico sono solo come prova per il controllo delle collisioni.&lt;br /&gt;Quella parte va ancora completata.&lt;br /&gt;&lt;br /&gt;Lo sviluppo di X-RPG Builder (il mio rpg maker su xna) continua!&lt;br /&gt;&lt;br /&gt;Alla prossima con altri aggiornamenti ^_^&lt;br /&gt;&lt;br /&gt;Ciao&lt;br /&gt;Odino&lt;br /&gt;&lt;br /&gt;&lt;a href="http://alessioausilio.blogspot.com/p/x-rpg-builder.html"&gt;&lt;span style="font-weight:bold; font-size:15pt;"&gt;Pagina&lt;/span&gt;&lt;/a&gt; con il riassunto di quanto fatto fino ad ora (contiene tutti i post riguardanti questo progetto).&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-3035855207031840536?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/3035855207031840536/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=3035855207031840536' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/3035855207031840536'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/3035855207031840536'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2010/09/x-rpg-builder-2d-aggiornamento-2.html' title='X-RPG Builder 2D - aggiornamento 2'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm5.static.flickr.com/4111/4997769275_e69855a15d_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-272608112785610750</id><published>2010-09-07T22:21:00.005+02:00</published><updated>2010-09-07T22:24:41.416+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='The Xna-Way'/><category scheme='http://www.blogger.com/atom/ns#' term='X-RPG Builder'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Lavori'/><category scheme='http://www.blogger.com/atom/ns#' term='comunicazioni'/><category scheme='http://www.blogger.com/atom/ns#' term='Guida XNA'/><title type='text'>X-RPG Builder 2D - aggiornamento 1</title><content type='html'>Dopo molto aggiorno questa pagina.&lt;br /&gt;Tutta colpa della preparazione della tesi, che mi porta via sempre tanto tempo.&lt;br /&gt;Comunque è stata aggiunta qualche piccola funzione:&lt;br /&gt;- sono state aggiunte le varibili (contentitori per valori) che possono essere a livello di mappa (visibili ed utilizzabili solo all'interno della mappa in cui sono definite) o a livello di progetto (visibili da ogni parte). Non sono ancora utilizzate&lt;br /&gt;- è possibile impostare il party iniziale&lt;br /&gt;- è possibile aggiungere e definire delle armi&lt;br /&gt;- adesso quando si effettua l'esportazione del progetto vengono salvati nella directory principale tutti i file necessari e vengonoa aggiunti in automatico al progetto XNA&lt;br /&gt;- vengono salvati ed aggiunti al content project del gioco XNA tutte le immagini necessarie al funzionamento del gioco&lt;br /&gt;&lt;br /&gt;Sto ora lavorando per poter definire gli altri oggetti utilizzabili durante il gioco (equipaggiamenti, oggetti dell'inventario, oggetti per delle quest, etc), in modo da poter avere una base su cui cominciare a programmare la gestione degli eventi, dalla loro creazione nell'editor al loro utilizzo all'interno del gioco.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://alessioausilio.blogspot.com/p/x-rpg-builder.html"&gt;&lt;span style="font-weight:bold; font-size:15pt;"&gt;Pagina&lt;/span&gt;&lt;/a&gt; con il riassunto di quanto fatto fino ad ora (contiene tutti i post riguardanti questo progetto).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-272608112785610750?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/272608112785610750/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=272608112785610750' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/272608112785610750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/272608112785610750'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2010/09/x-rpg-builder-2d-aggiornamento-1.html' title='X-RPG Builder 2D - aggiornamento 1'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-1882533071207503225</id><published>2010-08-11T13:19:00.002+02:00</published><updated>2010-08-11T13:22:51.851+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3D'/><category scheme='http://www.blogger.com/atom/ns#' term='Armi Final Fantasy'/><category scheme='http://www.blogger.com/atom/ns#' term='Lightwave'/><category scheme='http://www.blogger.com/atom/ns#' term='Final Fantasy'/><title type='text'>Mage Masher (o Tritamago) WIP 2</title><content type='html'>Dopo un po' di lavoro ecco a voi il rendering della versione finale (almeno credo) della tritamago di Gidan.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://fc02.deviantart.net/fs70/i/2010/222/3/9/Magemasher___TritaMago_by_Odino87.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;max-width: 350px;" src="http://fc02.deviantart.net/fs70/i/2010/222/3/9/Magemasher___TritaMago_by_Odino87.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Per la versione a piena risoluzione (4800x2600) dovete scaricarla da qua:&lt;br /&gt;&lt;a href="http://odino87.deviantart.com/#/d2w2hjo"&gt;DeviantArt&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Spero vi piaccia.&lt;br /&gt;&lt;br /&gt;A presto :)&lt;br /&gt;Odino&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-1882533071207503225?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/1882533071207503225/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=1882533071207503225' title='3 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/1882533071207503225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/1882533071207503225'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2010/08/mage-masher-o-tritamago-wip-2.html' title='Mage Masher (o Tritamago) WIP 2'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-260514601029802035</id><published>2010-08-10T09:15:00.004+02:00</published><updated>2010-08-10T09:24:27.127+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3D'/><category scheme='http://www.blogger.com/atom/ns#' term='Armi Final Fantasy'/><category scheme='http://www.blogger.com/atom/ns#' term='Lightwave'/><category scheme='http://www.blogger.com/atom/ns#' term='Final Fantasy'/><title type='text'>Mage Masher (o Tritamago) WIP 1</title><content type='html'>Dopo tanto mi sono deciso a rimettermi a lavorare un po' con il 3D.&lt;br /&gt;Tanto per riprendere un po' la mano.&lt;br /&gt;Devo dire che mi trovo un po' arrugginito (anche se non del tutto corroso XD).&lt;br /&gt;&lt;br /&gt;Comunque vediamo di spiegare quello che si vuol tentare di fare ^^&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 1px; height: 1px;" src="http://images1.wikia.nocookie.net/__cb21710/common/skins/common/blank.gif" border="0" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;Molti avranno giocato a Final Fantasy IX (gioco che in questo periodo mi vorrei proprio rigiocare :D, anche se quella è un'altra storia xD), e il personaggio principale Gidan (Zidane) Tribal come molti usanno utilizzava delle daghe.&lt;br /&gt;Questa è la sua daga più famosa, tanto che se ricordo bene anche nei vari artwork è rappresentato con questa, la ormai famosa tritamago.&lt;br /&gt;Dato che molto tempo addietro mi ero cimentato nella realizzazione dei Gunblade di Squall e Seifer (cosa che mi è piaciuta tantissimo) ho deciso ora invece di mettermi a realizzare nuovamente le armi dei personaggi dei vari Final Fantasy.&lt;br /&gt;Ed ecco a voi il risultato (della sola modellazione) della Tritamago, per la quale ho impiegato più o meno un'oretta.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm5.static.flickr.com/4102/4876725532_b863a35fff_z.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 613px; height: 620px;" src="http://farm5.static.flickr.com/4102/4876725532_b863a35fff_z.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;Appena avrò tempo e voglia mi cimenterò con il rendering, anche se ancora devo fare delle modifiche alla mesh ed al modello (voglio aggiungere più particolari).&lt;br /&gt;&lt;br /&gt;Se poi avrò modo posterò anche delle immagini progresstive dei vari lavori in modo che si possa avere un'idea del come è stato realizzata la modellazione.&lt;br /&gt;Se qualcuno è interessato ai modelli mi contatti e vediamo se glieli mando ^^&lt;br /&gt;&lt;br /&gt;A presto :)&lt;br /&gt;Odino&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-260514601029802035?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/260514601029802035/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=260514601029802035' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/260514601029802035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/260514601029802035'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2010/08/mage-masher-o-tritamago-wip-1.html' title='Mage Masher (o Tritamago) WIP 1'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm5.static.flickr.com/4102/4876725532_b863a35fff_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-2091541884692902167</id><published>2010-08-08T21:20:00.003+02:00</published><updated>2010-08-08T21:22:46.166+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='The Xna-Way'/><category scheme='http://www.blogger.com/atom/ns#' term='X-RPG Builder'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Lavori'/><category scheme='http://www.blogger.com/atom/ns#' term='comunicazioni'/><category scheme='http://www.blogger.com/atom/ns#' term='Guida XNA'/><title type='text'>Apertura nuova pagina</title><content type='html'>Annuncio l'apertura della pagina relativa ad un mio nuovo progetto, che piano piano sto portando avanti.&lt;br /&gt;&lt;br /&gt;A questo link&lt;br /&gt;&lt;a href="http://alessioausilio.blogspot.com/p/x-rpg-builder.html"&gt;X-RPG Builder 2D&lt;/a&gt;&lt;br /&gt;potrete trovare di volta in volta informazioni più approfondite a riguardo di questo progetto.&lt;br /&gt;&lt;br /&gt;Spero a presto con altre notizie ^^&lt;br /&gt;Ciau!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-2091541884692902167?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/2091541884692902167/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=2091541884692902167' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/2091541884692902167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/2091541884692902167'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2010/08/apertura-nuova-pagina.html' title='Apertura nuova pagina'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-7853746550286618460</id><published>2010-07-06T10:08:00.011+02:00</published><updated>2010-07-06T15:55:20.954+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='The Xna-Way'/><category scheme='http://www.blogger.com/atom/ns#' term='Terrain Edito'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA Component'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Free'/><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial XNA'/><title type='text'>Piccolo editor di terreni free</title><content type='html'>Approfitto dopo tanto di un momento di pace per scrivere e postare qualcosa che spero possa interessare a molti.&lt;br /&gt;Rendo infatti disponibile il codice sorgente di questa mia applicazione, un piccolo terrain editor che ho realizzato per un esame universitario.&lt;br /&gt;Il perchè di questa mia scelta: primo perchè credo che nonostante le grandi imprecisioni, gli errori e i bug che ci possono essere, può essere di interesse per qualcuno, sia per i concetti applicati sia come punto di partenza per altro.&lt;br /&gt;Secondo perchè lo considero io stesso un progetto ormai superato, che però mi ha fatto imparare tanto.&lt;br /&gt;Infatti lo userò come base teorica per realizzare ben altro. &lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;Cominciamo con una piccola spiegazione:&lt;br /&gt;l'interfaccia dell'applicazione è questa:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm5.static.flickr.com/4136/4767582066_470a0c9c3c_b.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 240px; height: 128px;" src="http://farm5.static.flickr.com/4136/4767582066_470a0c9c3c_m_d.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;Per un riassunto veloce dei comandi e delle funzioni basta che andate sulla voce "comandi" sotto "?" nel menù in alto.&lt;br /&gt;&lt;br /&gt;La prima cosa che dovete fare è creare un nuovo livello. Dopo potete o agire direttamente con i mouse sul terreno o caricare una Height Map (tramite il bottone nella colonna di destra). Ecco cosa viene realizzato caricando una delle HM che ho inserito come prova.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm5.static.flickr.com/4114/4767582386_4660ae19a4_b.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 240px; height: 128px;" src="http://farm5.static.flickr.com/4114/4767582386_4660ae19a4_m_d.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;La modalità di editing è modale: se vedete bene in alto a sinistra c'è un gruppo di radio button che vi dicono attualmente cosa state andando a modificare nel livello, se il terreno, le texture o i modelli. Quando siete in una modalità agite solo su quella parte.&lt;br /&gt;Potete cambiare la modalità cliccando sul radio button relativo o premendo 'T'.&lt;br /&gt;Potete texturizzare il terreno a vostro piacere utilizzando le 4 texture in alto a destra. Per cambiare la texture da usare basta farci click sopra, mentre se proprio volete caricare un'altra immagine al suo posto dovete farci doppio click.&lt;br /&gt;&lt;br /&gt;Per inserire i modelli nella scena dovete prima caricarli: andate sotto la scheda Objects e cliccate su "Load Model". Selezionate il modello da caricare e date l'ok. Il modello verrà "compilato" al volo nel formato compatibile con XNA e potrete poi utilizzarlo nel livello. Se ci cliccate sopra nel riquadro sottostante vedrete anche l'anteprima del modello in questione.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm5.static.flickr.com/4116/4767582432_8d90082f16_b.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 240px; height: 128px;" src="http://farm5.static.flickr.com/4116/4767582432_8d90082f16_m.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Provatelo  poi ditemi.&lt;br /&gt;&lt;br /&gt;Immagiamo di aver salvato questo livello:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm5.static.flickr.com/4123/4767606542_5f845734b3_b.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 240px; height: 128px;" src="http://farm5.static.flickr.com/4123/4767606542_5f845734b3_m.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;Per caricarlo all'interno di un progetto XNA game dovete seguire alcuni passi:&lt;br /&gt;1) dovete aggiungere il file *.map che viene generato quando salvate la mappa al progetto XNA e impostare le sue proprietà in modo che venga copiato nella directory finale del progetto durante la compilazione&lt;br /&gt;2) Dovete copiare la bitmap del livello, che ha lo stesso nome del file *.map, e le texture usate per texturizzare il terrain sotto la directory "Content\Textures" del vostro gioco XNA&lt;br /&gt;3) dovete copiare i modelli che avete utilizzato nel livello sotto la directory "Content\Models"&lt;br /&gt;4) dovete copiare le texture usate dai vostri modelli nel gioco XNA mantenendo lo stesso percorso relativo rispetto ai file di origine&lt;br /&gt;NOTA: Naturalmente tutte queste risorse vanno aggiunte al progetto Content del gioco XNA per permettergli di elaborarle.&lt;br /&gt;A questo punto tutto è fatto. Basta che lanciate il il programma e vi ritroverete con il vostro livello caricato e pronto all'uso.&lt;br /&gt;Ecco un'immagine dell'esempio allegato:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm5.static.flickr.com/4122/4767623856_e46ac47ed8_b.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 240px; height: 189px;" src="http://farm5.static.flickr.com/4122/4767623856_e46ac47ed8_m.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Vi allego di seguito la soluzione per Visual Studio 2008.&lt;br /&gt;Per far girare il programma è necessario aver installato XNA 3.1 e il .Net Framework 3.5.&lt;br /&gt;Per qualsiasi cosa, consigli, problemi, lamentele, critiche commentate il pure, o mandate un'email.&lt;br /&gt;Per favore, se scaricate e provate il codice commentate, almeno mi lasciate un feedback sul mio lavoro ^^&lt;br /&gt;&lt;br /&gt;&lt;a href="http://odino87.interfree.it/XNA/TerrainEditor.rar"&gt;&lt;b&gt;Codice sorgente&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Alla prossima :)&lt;br /&gt;Alessio (Odino)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-7853746550286618460?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/7853746550286618460/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=7853746550286618460' title='1 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/7853746550286618460'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/7853746550286618460'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2010/07/piccolo-editor-di-terreni-free.html' title='Piccolo editor di terreni free'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm5.static.flickr.com/4116/4767582432_8d90082f16_t.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-3598439426341691444</id><published>2010-06-13T20:30:00.003+02:00</published><updated>2010-06-13T20:34:27.187+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='comunicazioni'/><title type='text'>Apertura nuovo blog</title><content type='html'>Come preannunciato tempo fa, ho aperto dopo tanto il nuovo blog destinato a raccogliere quei post che non erano attinenti all'informatica, oltre a contenere i nuovi post di tal genere che pubblicherò.&lt;br /&gt;&lt;br /&gt;Il link è: &lt;a href="http://asgardwalls.blogspot.com/"&gt;AsgardWalls&lt;/a&gt;&lt;br /&gt;Chi vuole darci un'occhiata faccia pure (se siete tanto coraggioni o incoscienti).&lt;br /&gt;In un'epoca dove tutti possono dire quello che vogliono ho pensato che era il caso di fare lo stesso. Almeno ci si sfoga un pochino.&lt;br /&gt;&lt;br /&gt;Alla prossima!&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-3598439426341691444?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/3598439426341691444/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=3598439426341691444' title='1 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/3598439426341691444'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/3598439426341691444'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2010/06/apertura-nuovo-blog.html' title='Apertura nuovo blog'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-9161316749798954119</id><published>2010-05-31T09:01:00.003+02:00</published><updated>2010-05-31T10:02:55.798+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='comunicazioni'/><title type='text'>Avviso</title><content type='html'>Comunicazione di servizio:&lt;br /&gt;per esigenze particolari dettate dalla mia mente contorta, forse qualcuno potrà notare che una trentina di post sono scomparsi dal blog.&lt;br /&gt;Questo perchè ho deciso di ripulire il blog, lasciando questo solo per gli articoli riguardanti la programmazione.&lt;br /&gt;Gli altri articoli/post andranno a finire in un altro blog, che vedrò di aprire il prima possibile, dove andrò a mettere tutta quella roba che non riguarda il mondo della programmazione (quindi recensioni, riflessioni, lamentazioni, bestemmioni vari).&lt;br /&gt;Abbiate un po' di calma che ora come ora di tempo ne ho poco quindi la cosa andrà a rilento.&lt;br /&gt;&lt;br /&gt;Saluti dal vostro amichevole Odino di quartiere (non mi uccidete per questa citazione storpiata XD)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-9161316749798954119?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/9161316749798954119/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=9161316749798954119' title='4 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/9161316749798954119'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/9161316749798954119'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2010/05/avviso.html' title='Avviso'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-1172130365118682923</id><published>2010-04-17T11:23:00.002+02:00</published><updated>2010-04-17T11:28:20.927+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='comunicazioni'/><title type='text'>Tanti auguri a me!</title><content type='html'>No, non sono impazzito...&lt;br /&gt;Era ormai il lontano 06/04/2009 quando veniva pubblicato su questo blog il primo post, il primo post dopo il Ragnarok.&lt;br /&gt;Tante cose sono accadute da allora, alcune buone ma la maggior parte mica tanto...&lt;br /&gt;&lt;br /&gt;Tra una disavventura e l'altra siamo andati avanti, si è pubblicato un po' di roba (non tanta, ma ci si è provato).&lt;br /&gt;&lt;br /&gt;L'intenzione di continuare, nonostante il poco tempo, c'è sempre.&lt;br /&gt;Dovuta anche al fatto che bene o male un po' di visite ci sono sempre, per quanto questo sia un blog un po' strano...&lt;br /&gt;&lt;br /&gt;Quindi faccio gli auguri a questo blog! Che possa continuare a prosperare!&lt;br /&gt;E che la luce di Odino lo protegga!&lt;span class="fullpost"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-1172130365118682923?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/1172130365118682923/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=1172130365118682923' title='1 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/1172130365118682923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/1172130365118682923'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2010/04/tanti-auguri-me.html' title='Tanti auguri a me!'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-2393665167370592885</id><published>2010-04-12T20:27:00.013+02:00</published><updated>2010-04-15T21:26:49.547+02:00</updated><title type='text'>Small Tutorial: testo a scomparsa tramite JavaScript (JS)</title><content type='html'>Quanti di voi hanno visto quei fantastici siti/blog dove ci sono i blocchi di testo che appaiono/scompaiono magicamente quando si clicca su dei link...&lt;br /&gt;Sono fantastici vero? ^^&lt;br /&gt;&lt;br /&gt;Bè oggi voglio spiegare un pochino come si fanno...&lt;br /&gt;e vedrete che non è poi così complicato :)&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;Intanto quello di cui avete bisogno è di una funzione javaScript.&lt;br /&gt;Senza entrare nel dettaglio del linguaggio quello che dovete aggiungere è quanto segue:&lt;br /&gt;&lt;fieldset class="csharpcode" style="background-color: #eeeeee; -moz-border-radius: 25px 10px; -webkit-border-radius: 25px 10px; border: 1px solid red; padding: 10px 10px 10px 10px; margin: 10px 10px 10px 10px;"&gt;&lt;br /&gt;&amp;lt;script type=&lt;span class="str"&gt;'text/javascript'&lt;/span&gt;&amp;gt;&lt;br /&gt;function openclose(name){&lt;br /&gt;  var elm = document.getElementById(name);&lt;br /&gt;  &lt;span class="kwrd"&gt;if&lt;/span&gt;(elm .style.display == &amp;amp;#39;none&amp;amp;#39;)&lt;br /&gt;    elm.style.display = &amp;amp;#39;block&amp;amp;#39;;&lt;br /&gt;  &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;br /&gt;    elm.style.display = &amp;amp;#39;none&amp;amp;#39;;&lt;br /&gt;}&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;/fieldset &gt;&lt;br /&gt;&lt;br /&gt;Questa funzione recupera dalla vostra pagina l'elemento con ID passato, e controlla se il suo stile display vale block o none.&lt;br /&gt;In caso sia block lo imposta a none, e viceversa.&lt;br /&gt;&lt;br /&gt;Ora, quando volete avere del testo/contenuti che compaiono/scompaiono fate un qualcosa di questo tipo:&lt;br /&gt;&lt;fieldset class="csharpcode" style="background-color: #eeeeee; -moz-border-radius: 25px 10px; -webkit-border-radius: 25px 10px; border: 1px solid red; padding: 10px 10px 10px 10px; margin: 10px 10px 10px 10px;" class="csharpcode"&gt;&lt;br /&gt;&amp;lt;h2 style=&lt;span class="str"&gt;"cursor: pointer;"&lt;/span&gt; onclick=&lt;span class="str"&gt;"openclose('myElm');"&lt;/span&gt;&amp;gt;Show∇&amp;lt;/h2&amp;gt;&lt;br /&gt;&amp;lt;div id=&lt;span class="str"&gt;"myElm"&lt;/span&gt; style=&lt;span class="str"&gt;"display: none;"&lt;/span&gt;&amp;gt;&lt;br /&gt;&amp;lt;h2 style=&lt;span class="str"&gt;"cursor: pointer;"&lt;/span&gt; onclick=&lt;span class="str"&gt;"openclose('myElm');"&lt;/span&gt;&amp;gt;HideΔ&amp;lt;/h2&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/fieldset&gt;&lt;br /&gt;&lt;br /&gt;All'interno del div mettete quello che vi serve e avrete un effetto simile ^^&lt;br /&gt;&lt;br /&gt;&lt;h2 style="cursor: pointer;" onclick="openclose('myElm');"&gt;Show∇&lt;/h2&gt;&lt;br /&gt;&lt;div id="myElm" style="display: none;"&gt;&lt;br /&gt;&lt;img style="width: 90%;" src="http://farm3.static.flickr.com/2341/4515620286_e32f30ca56_o.jpg" /&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;img style="width? 90%;" src="http://farm3.static.flickr.com/2044/4514983435_9e2863c821_o.jpg" /&gt;&lt;br /&gt;&lt;h2 style="cursor: pointer;" onclick="openclose('myElm');"&gt;HideΔ&lt;/h2&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;byez^^&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-2393665167370592885?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/2393665167370592885/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=2393665167370592885' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/2393665167370592885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/2393665167370592885'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2010/04/small-tutorial-testo-scomparsa-tramite.html' title='Small Tutorial: testo a scomparsa tramite JavaScript (JS)'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-6338768619498936890</id><published>2010-03-29T14:47:00.040+02:00</published><updated>2010-03-29T21:20:58.454+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Riflessioni strane'/><category scheme='http://www.blogger.com/atom/ns#' term='Cavolate'/><category scheme='http://www.blogger.com/atom/ns#' term='Riflessioni'/><category scheme='http://www.blogger.com/atom/ns#' term='Lamentazioni'/><category scheme='http://www.blogger.com/atom/ns#' term='Pensieri'/><category scheme='http://www.blogger.com/atom/ns#' term='Trash'/><title type='text'>Internet Explorer.... una chiavica di browser...</title><content type='html'>In un mondo pieno di Browser, in continua evoluzione, dove quasi ogni giorno centinaia di utenti decidono di navigare su internet...&lt;br /&gt;Perchè la gente continua ad usare IE?&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;Sto avendo modo ultimamente di di lavorare a delle applicazioni internet, e ogni volta che faccio qualche modifica devo controllare come risponde il tutto su Fire Fox (il quale di solito lavora bene, raramente ti fa incazzare), per poi passare a Internet Explorer.&lt;br /&gt;&lt;br /&gt;Come mai solo questi due direte voi?&lt;br /&gt;Perchè da soli fanno circa il 95% delle visite di un sito. Lo so che chi usa Opera o Chrome ora mi linceranno, ma non ci posso far nulla, lo dicono le statistiche.&lt;br /&gt;E le statistiche (mie) mi dicono che ogni volta che devo vedere lle modifiche su IE, il 70% delle volte sono bestemmie!&lt;br /&gt;&lt;br /&gt;Nel senso che:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;funziona ma con qualche piccola differenza&lt;/li&gt;&lt;br /&gt;&lt;li&gt;funziona così così&lt;/li&gt;&lt;br /&gt;&lt;li&gt;funziona male&lt;/li&gt;&lt;br /&gt;&lt;li&gt;non funziona per nulla&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Ma quando gli costerà alla Microsoft mettere una schiera di sviluppatore/programmatori/debuggatori (me lo passate sto francesismo?) a correggere il tutto e a farlo funzionare per bene?&lt;br /&gt;E invece no...&lt;br /&gt;Si ostinano ancora a fare come vogliono loro...&lt;br /&gt;&lt;br /&gt;VI PREGO! ADERIAMO AGLI STANDARD CAVOLO!&lt;br /&gt;&lt;br /&gt;Una piccola vendetta per gli utenti di IE?&lt;br /&gt;Beccatevi questo:&lt;br /&gt;&lt;fieldset style="background-color: #eeeeee; -moz-border-radius: 25px 10px; -webkit-border-radius: 25px 10px; border: 4px solid red; padding: 10px 10px 10px 10px; margin: 10px 10px 10px 10px;"&gt;&lt;br /&gt;&lt;b&gt;Sei un mona?&lt;/b&gt;&lt;br /&gt;Se vedi il bordo smussato hai la superato la prova e non sei un mona.&lt;br /&gt;&lt;br /&gt;Se vedi un fotutto rettangolo sei un mona! Cambia subito browser!&lt;br /&gt;&lt;a href="http://www.mozilla-europe.org/it/firefox/"&gt;Firefox&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.opera.com/download/"&gt;Opera&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.google.com/chrome/?installdataindex=nosearch?hl=it&amp;amp;brand=CHMB&amp;amp;utm_campaign=it&amp;amp;utm_source=it-ha-emea-it-sk&amp;amp;utm_medium=ha"&gt;Chrome&lt;/a&gt;&lt;br /&gt;&lt;/fieldset&gt;&lt;br /&gt;&lt;br /&gt;Alla prossima!&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-6338768619498936890?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/6338768619498936890/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=6338768619498936890' title='4 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/6338768619498936890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/6338768619498936890'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2010/03/internet-explorer-una-chiavica-di.html' title='Internet Explorer.... una chiavica di browser...'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-296961265020511309</id><published>2010-02-10T16:18:00.007+01:00</published><updated>2010-02-10T17:13:09.903+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='The Xna-Way'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA Component'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Lavori'/><category scheme='http://www.blogger.com/atom/ns#' term='comunicazioni'/><title type='text'>The Xna-Way: Terrain Editor - Update 1</title><content type='html'>Aggiornamento sul terrain editor.&lt;br /&gt;&lt;br /&gt;Dopo diversi giorni di lavoro, che sono stati più di quanto avessi preventivato all'inizio (non tanto per la complessità del problema, ma il fatto è che sono stato rallentato da problemi personali) direi che sono quasi alla fine della base di questo progetto.&lt;br /&gt;Cosa è stato fatto in questo periodo?&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;Il codice è stato organizzato in modo che il controllo/editor del livello contenga due oggetti separati definiti come &lt;span style="font-weight: bold;"&gt;TerrainEditor &lt;/span&gt;e &lt;span style="font-weight: bold;"&gt;ModelLevelEditor&lt;/span&gt;. Tali oggetti vanno a riferire lo stesso oggetto Level, solo che il promo va a modificare il terreno e le texture del terreno, mentre il secondo da la possibilità di modificare in modo agevole i modelli presenti nel livello.&lt;br /&gt;&lt;br /&gt;Questi oggetti come si è capito danno specifiche funzioni che agiscono su una parte del modello dell'applicazione.&lt;br /&gt;&lt;br /&gt;Tra le caratteristiche comuni ad entrambi c'è la coda delle operazioni svolte: posso cioè tornare indietro con le operazioni svolte e ripristinare lo stato precedente alla modifica fatta, questo per ogni operazione possibile (editing del terreno, editind delle texture del terreno, editing delle trasformazioni spaziali del modello). Ancora è da rifinire e perfezionare, ma per ora funziona.&lt;br /&gt;&lt;br /&gt;Ho aggiunto la possibilità di importare oggetti 3D a runtime, cioè non compilati a posteriori da XNA tramite il Visual C# o VS. Questa parte devo dire mi ha impegnato un po', ma solo per il fatto che non capivo come re-indirizzare il compilatore alla giusta versione delle dll da usare.&lt;br /&gt;Ora, tramite un sistema di Builder e ContentManager, "compila" a tempo di esecuzione i file che deve importare nella scena. Il tutto rallenta un po' (dato che la compilazione/importazione dei modelli nel formato compatibile con XNA impiega un po' ti tempo; forse potrei ottimizzare aggiungendo in futuro la compilazione in un thread separato, in questo modo, almeno al caricamento di un livello precente otterrei un tempo minore), ma funziona.&lt;br /&gt;Unica "pecca": dato che non riesco ancora a trovare il riferimento a tutti i file necessari per la compilazione di un modello (texture e simili) sarà compito di usa il modello copiare poi nella cartella/directory che più preferisce i file necessari al corretto funzionamento del modello nel livello.&lt;br /&gt;&lt;br /&gt;A cosa serve poter importare oggetti nel livello se poi non si possono usare? Ho aggiunto quindi la possibilità di inserire/eliminare modelli dal livello tramite il mouse. Lo stesso dicasi per quanto riguarda la traslazione/rotazione/scaltura degli stessi.&lt;br /&gt;Per le trasformazioni spaziali degli oggetti ho creato ed aggiunto degli assi cartesiani, per ora molto semplici, che permettono di postare l'oggetto.&lt;br /&gt;&lt;br /&gt;Dato che le modifiche possibili sono diventate varie, ho deciso di rendere modulare il modo di agire sui dati.&lt;br /&gt;L'applicazione permetterà di modificare la parte del modello che vogliamo modificare: tramite dei radio button (o con un short-cut) si può passare dalla modalità di editig del terreno, alla modalità di editing delle texture ed infina a quella dei modelli.&lt;br /&gt;Forse è un po' scomodo all'inizio, ma se si pensa che in altri programmi professionali fanno cose simili (ok forse è esagerato comparare questo sgorbio che sto facendo con programmi professionali, ma a qualcuno/qualcosa ci si deve pur ispirare no?).&lt;br /&gt;&lt;br /&gt;Aggiunta la possibilità di caricare nuove immagini da usare nei brush per la modifica del terreno, e queste immagini poi saranno copiate nella directory dei terrain brush e ricaricate al riavvio successivo.&lt;br /&gt;Credo che andrò a fare una cose del genere anche per le texture usate per il terreno, in modo che quando si vorrà poi riusare il livello creato in un gioco (ma chi mai andrà a farlo mi domando io XD) almeno avrà parte dei dati raggruppati e più facilmente utilizzabili.&lt;br /&gt;&lt;br /&gt;Per ora non credo di avere altro da aggiungere.&lt;br /&gt;Se ho dimenticato qualcosa aggiungerò in seguito.&lt;br /&gt;&lt;br /&gt;Vi lascio con uno screen del programma:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm5.static.flickr.com/4066/4346461224_db24f696e8_b.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 240px; height: 128px;" src="http://farm5.static.flickr.com/4066/4346461224_db24f696e8_m.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Per le percentuali di lavorazione:&lt;br /&gt;&lt;a href="http://alessioausilio.blogspot.com/2010/01/xna-way-terrain-editor-journal.html"&gt;Terrain Editor Journal&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Alla prossima ^^&lt;br /&gt;&lt;br /&gt;PS: non credo che molti avranno qualcosa da dire, ma in caso contrario che dite tutto quello che vi passa per la testa! Curiosità, possibili correzioni, cosa da fare/aggiungere.&lt;br /&gt;E se avete qualche curiosità sul codice ditelo, e vedrò di pubblicarlo! (almeno in parte ^^)&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-296961265020511309?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/296961265020511309/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=296961265020511309' title='1 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/296961265020511309'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/296961265020511309'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2010/02/xna-way-terrain-editor-update-1.html' title='The Xna-Way: Terrain Editor - Update 1'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm5.static.flickr.com/4066/4346461224_db24f696e8_t.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-7229664495716879702</id><published>2010-01-18T16:30:00.009+01:00</published><updated>2010-02-17T17:10:23.827+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='The Xna-Way'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA Component'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Lavori'/><category scheme='http://www.blogger.com/atom/ns#' term='comunicazioni'/><title type='text'>The Xna-Way: Terrain Editor Journal</title><content type='html'>Questo post sarà il giornale di sviluppo che dedicherò al terrain editor.&lt;br /&gt;Aggiornerò di volta in volta con le modifiche che farò, con le possibili modifiche/update da fare al programma, gli errori (e quando riesco a risolverli anche come ho fatto XD).&lt;br /&gt;Se poi ci saranno articoli relativi a pezzi di codice del Terrain Editor saranno linkati anche qui.&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;Quello che mi sono prefisso di fare inizialmente era di creare un Terrain Editor, in modo da poterlo poi utilizzare per creare i livelli di gioco per i miei futuri progetti (sempre pensare in grande perchè poi a forza di tagliare resta sempre poco XD).&lt;br /&gt;Ho quindi poi deciso di ampliare il progetto permettendo di aggiungere oggetti alla scena.&lt;br /&gt;Quindi da "semplice" terrain editor sono passato a voler fare un "semplice" Level Editor (con un formato mio personale).&lt;br /&gt;&lt;br /&gt;I fondamenti sono i seguenti:&lt;br /&gt;- Uso di un'immagine come Height Map (HM) per la creazione del terreno di base.&lt;br /&gt;Un'immagine ha 4 canali per il colore (RGBA), ed ho deciso di utilizzare solo le informazioni presenti nel canale R per la creazione del modello del terreno. In questo modo gli altri canali potranno essere utilizzati per memorizzare altre informazioni (per esempio le zone in cui è possibile "camminare", posizione di alcuni oggetti di scena, etc)&lt;br /&gt;Usando il valore di un singolo colore per l'altezza del vertice, il valore dell'altezza può variare tra 0-255 (estremi compresi).&lt;br /&gt;Per ampliare il range di valori posso utilizzare un fattore di scala (positivo) per il quale moltiplicare il valore dell'altezza del vertice.&lt;br /&gt;Avrò un fattore di scala anche per la dimensione del del modello lungo gli assi X-Z (in questo modo il fattore di scala per la larghezza sarà diverso e distinto da quello per l'altezza).&lt;br /&gt;&lt;br /&gt;- Possibilità di editare il terreno, modificando l'altezza dei vertici che compongono il modello.&lt;br /&gt;Cioè saranno dati dei brush con i quali sarà possibile modificare la mesh del terreno. Ad ogni brush (a seconda della funzionalità che deve espletare) può avere associata un'immagine, la quale verrà utilizzata per modificare la posizione dei vertici. L'immagine associata potrà essere cambiata a seconda del tipo di modifica che si vuole fare, e sarà in BN (o in caso non sia in BN verrà usato solo il valore del canale R, come per la HM usata per costruire il terreno).&lt;br /&gt;&lt;br /&gt;- Possibilità di salvare il terreno prodotto come immagine.&lt;br /&gt;Per quando ci saranno dei possibili modelli sul terreno dovranno essere salvati anche le informazioni sui modelli (forse serializzando con XML),  come anche le informazioni sulle luci della scena, etc.&lt;br /&gt;&lt;br /&gt;- Possibilità di utilizzare 4 texture per la colorazione del terreno. Per ora il numero è limitato a 4 per una maggiore semplicità di programmazione (e per la struttura dei vertici usati): difatto utilizzare più di 4 texture è "la stessa cosa" che usarne 4, solo che i casi da discriminare sono di più. Sarà possibile utilizzare le varie texture in base all'altezza dei vertici, o texturizzare a mano il terreno.&lt;br /&gt;&lt;br /&gt;A presto per degli aggiornamenti&lt;br /&gt;&lt;br /&gt;Stato attuale:&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="fullpost"&gt;Caricamento HM e creazione terreno partendo dall'immagine: 100%&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="fullpost"&gt;Caricamento altre informazioni dall'immagine: 100%&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="fullpost"&gt;Salvataggio terreno editato: 100%&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="fullpost"&gt;Uso di un file XML per la memorizzazione di altre informazioni sul livello: 100%&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="fullpost"&gt;Definizione di Brush personalizzati atti alla modellazione del terreno: 100%&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="fullpost"&gt;Salvataggio/caricamento brush ed immagini dei brush: 100%&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="fullpost"&gt;Possibilità di texturizzare il modello in base all'altezza dei vertici o a mano: 100%&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="fullpost"&gt;Possibilità di creare ed aggiungere nuovi brush: 0%&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="fullpost"&gt;Possibilità di modificare le texture usate dal modello: 100%&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="fullpost"&gt;Possibilità di aggiungere/gestire modelli al livello: 100%&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="fullpost"&gt;Possibilità di  aggiungere/gestire luci nel livello: 0%&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="fullpost"&gt;Possibilità di fare degli screenshot/render del terreno: 0%&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="fullpost"&gt;Algoritmo di intersezione mouse-VS-poligoni: 100% (Implementato algoritmo ricorsivo a partizione dello spazio per la l'indificazione del vertice più vicino al puntatore)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="fullpost"&gt;Algoritmo di editig dei vertici del modello: 100%&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="fullpost"&gt;Algoritmo di texturing: 100%&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span class="fullpost"&gt;End&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-7229664495716879702?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/7229664495716879702/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=7229664495716879702' title='2 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/7229664495716879702'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/7229664495716879702'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2010/01/xna-way-terrain-editor-journal.html' title='The Xna-Way: Terrain Editor Journal'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-3433141622592071714</id><published>2010-01-13T16:07:00.004+01:00</published><updated>2010-01-13T16:26:33.211+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='The Xna-Way'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Lavori'/><category scheme='http://www.blogger.com/atom/ns#' term='comunicazioni'/><title type='text'>The Xna-Way: Terrain Editor</title><content type='html'>Come avevo detto tempo fa, non ho molto tempo per scrivere qualcosa su XNA da postare qua, ma non per questo vuol dire che non stia andando avanti in qualche modo.&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;Ho recentemente iniziato un progetto per l'università (o almeno spero che possa usarlo per un esame universitario), che per ora ha il nome di Terrain Editor.&lt;br /&gt;Lo sto sviluppando usando C# ed XNA (se no cola cavolo che ne parlavo sotto Xna-Way XD), e per ora si prospetta come un semplice editor di terreni.&lt;br /&gt;Alcune immagini:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm3.static.flickr.com/2713/4249265130_11cf591455_o.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 100px; height: 75px;" src="http://farm3.static.flickr.com/2713/4249265130_7036ddccde_t.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm3.static.flickr.com/2709/4267412312_24824f5ebe_b.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 100px; height: 53px;" src="http://farm3.static.flickr.com/2709/4267412312_24824f5ebe_t.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Quello che mi sono prefisso di fare è di creare un piccolo editor di livelli, in modo da poter creare delle mappe da poter usare in un gioco o quello che ci pare.&lt;br /&gt;I "livelli" per ora composti solo dal terreno, sono costruti partendo da delle immagini (usate come Height Map), in modo da poter usare i colori per posizionare i vertici.&lt;br /&gt;In seguito voglio aggiungere altre caratteristiche, tra le quali per ora ho messo:&lt;br /&gt;- editare il terreno (se no che Terrain editor sarebbe...) (già in parte implementato)&lt;br /&gt;- definire zone in cui è possibile camminare o meno&lt;br /&gt;- possibilità di aggiungere oggetti al livello e posizionarli nella scena&lt;br /&gt;- Multitexturing del terreno (questo già in parte implementato)&lt;br /&gt;&lt;br /&gt;poi mano a mano che mi vengono in mente le aggiungerò.&lt;br /&gt;Quando avrò tempo credo che posterò qualche pezzo di codice più interessante (non che per il momendo ce ne sia poi molto).&lt;br /&gt;Spero che il progetto vi piaccia (e nel caso possa usarlo come progetto d'esame che piaccia anche al prof!).&lt;br /&gt;&lt;br /&gt;Un salutone!&lt;br /&gt;A presto!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-3433141622592071714?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/3433141622592071714/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=3433141622592071714' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/3433141622592071714'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/3433141622592071714'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2010/01/xna-way-terrain-editor.html' title='The Xna-Way: Terrain Editor'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2713/4249265130_7036ddccde_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-4029455757675695931</id><published>2009-12-07T16:00:00.001+01:00</published><updated>2009-12-07T16:50:27.181+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='The Xna-Way'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='saluti'/><category scheme='http://www.blogger.com/atom/ns#' term='comunicazioni'/><category scheme='http://www.blogger.com/atom/ns#' term='Guida XNA'/><title type='text'>The Xna-Way: Avviso</title><content type='html'>E' con dispiacere che informo, chi è interessato, chi mi segue, e quei pochi che capitano su queste pagine (forse pure per errore), che non credo aggiungerò altri tutorial/codice/guide su XNA per minimo un mese.&lt;br /&gt;&lt;br /&gt;Motivo?&lt;br /&gt;Studio, università, lavori da consegnare, progetti da completare e discutere, problemi vari, e tanto altro ancora!&lt;br /&gt;Se ce la farò vedrò di pubbliacare qualche post di commento/recensione, ma non prometto nulla.&lt;br /&gt;&lt;br /&gt;Per chi volesse contattarmi o simili vi rammento che sono su msn e rispondo a questo indirizzo e-mail.&lt;br /&gt;odinoa@hotmail.it&lt;br /&gt;&lt;br /&gt;Saluti!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-4029455757675695931?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/4029455757675695931/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=4029455757675695931' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/4029455757675695931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/4029455757675695931'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2009/12/xna-way-avviso.html' title='The Xna-Way: Avviso'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-8309378542781571101</id><published>2009-11-13T17:46:00.003+01:00</published><updated>2009-11-13T18:11:18.113+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3D'/><category scheme='http://www.blogger.com/atom/ns#' term='ZBrush'/><category scheme='http://www.blogger.com/atom/ns#' term='Cavolate'/><category scheme='http://www.blogger.com/atom/ns#' term='Lavori'/><category scheme='http://www.blogger.com/atom/ns#' term='Fast Modelling'/><category scheme='http://www.blogger.com/atom/ns#' term='Trash'/><title type='text'>FUUUUUU.... cioè quando non ti resta altro da fare!</title><content type='html'>Vi è mai capitato di non sapere dove sbattere la testa?&lt;br /&gt;Di avere delle cose da fare ma altre vi si sovrappongono e dovete rimandare?&lt;br /&gt;Oppure solo di provare una forte rabbia per qualcosa che non va per il verso giusto?&lt;br /&gt;&lt;br /&gt;Bè ecco come mi sento quando provo cose del genere!&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm3.static.flickr.com/2498/4095749539_d9671d8ebd_o.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 240px; height: 180px;" src="http://farm3.static.flickr.com/2498/4095749539_e78211d75d_m.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;Sinceramente non saprei in qualche altro modo esprimere la rabbia e la frustrazione che alle volte si prova!&lt;br /&gt;E questa immagine rende bene come ci si sente XD&lt;br /&gt;&lt;br /&gt;Il soggetto non è mio! Il FUUUU come viene chiamato è nato sulle Chan (se ricordo bene) e avendo passato una giornata pesa, persa a compilare della cavolo di librerie che non ne volevano sapere di partire, quando poi ce l'ho fatta per liberarmi un po' ho fatto questa... cosa (XD) in zBrush.&lt;br /&gt;Circa 40 minuti di lavoro... o meno... bo non lo so (intanto facevo anche altre cavolate).&lt;br /&gt;Se qualcuno lo vuole mi chieda il file e glielo invio per posta elettronica.&lt;br /&gt;&lt;br /&gt;Buon FUUUU a tutti!&lt;br /&gt;Meglio un FUUUU che spaccare i mobili di casa XD&lt;br /&gt;&lt;br /&gt;Alla prossima!&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-8309378542781571101?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/8309378542781571101/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=8309378542781571101' title='2 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/8309378542781571101'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/8309378542781571101'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2009/11/fuuuuuu-cioe-quando-non-ti-resta-altro.html' title='FUUUUUU.... cioè quando non ti resta altro da fare!'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2498/4095749539_e78211d75d_t.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-9071668853625551877</id><published>2009-11-10T16:50:00.000+01:00</published><updated>2009-11-10T16:55:31.634+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='The Xna-Way'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA Component'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Guida XNA'/><title type='text'>The Xna-Way: Tutorial 9: Fractal Generator</title><content type='html'>Come avevo preannunciato nell'ultimo post, ho realizzato un piccolo componente che genera alcuni frattali.&lt;br /&gt;Il tutto è scritto in .Net ed utilizza gli strumenti forniti da XNA per creare e manipolare le immagini usate per la generazione dei frattali.&lt;br /&gt;Il "programma" che illustrerò è abbastanza lunghetto rispetto agli altri, ma vedrò nel possibile di spiegarlo al meglio delle mie capacità.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Come sempre vi esorto a farmi notare se ho detto delle boiate immani!&lt;br /&gt;&lt;br /&gt;Nota: nell'&lt;a href="http://alessioausilio.blogspot.com/2009/10/xna-frattali.html"&gt;ultimo post&lt;/a&gt; avevo fatto vedere diverse immagini di frattali realizzate con il codice che andrò ad illustrare, però il codice che vi fornirò adesso potrà generare un solo tipo di frattale, e cioè il frattale di Mandelbrot.&lt;br /&gt;Gli altri non li metterò per ora, anche se il codice è molto simile a quello che userò qua.&lt;br /&gt;&lt;br /&gt;Intanto cominciamo col dire come ho pensato il tutto:&lt;br /&gt;&gt;il calcolo che dobbiamo fare è dato dalla successione:&lt;br /&gt;z(n+1) = z(n)^2 + c&lt;br /&gt;dove z è il valore del punto che vogliamo calcolare, e c è una costante che dobbiamo sommare di volta in volta&lt;br /&gt;per z(0) valore sarà c&lt;br /&gt;per z(1) il valore sarà c^2 + c&lt;br /&gt;e così via.&lt;br /&gt;&lt;br /&gt;&gt;i punti su cui calcoliamo la successione sono quelli del piano complesso, quindi dovremo fare tutti i calcoli utilizzando l'algebra dei numeri complessi&lt;br /&gt;&lt;br /&gt;&gt;il valore di &lt;span style="font-weight: bold;"&gt;c&lt;/span&gt; cambia a seconda di quale punto del piano complesso stiamo calcolando il valore&lt;br /&gt;&lt;br /&gt;&gt;un punto appertiene all'insieme di Mandelbrot se Zn è in modulo minore di 2, dove n indica per quante volte dobbiamo ripetere il calcolo prima di considerare il punto in questione appartenente all'insieme. Quindi se dopo un numero i di ripetizioni del calcolo della successione il valore supera 2, il punto non appartiene all'insieme e verrà colorato in modo particolare, mentre se il punto appartiene all'insieme sarà colorato di nero.&lt;br /&gt;&lt;br /&gt;NOTA: per la gestione dei calcoli con i numeri complessi ho usato una classe che ho trovato su internet, del quale ho fatto brutalmente copy-paste. Lo che di solito non si fa così, ma non era la parte dui numeri complessi che mi interessava implementare. Sicuramente l'uso di questa classe può aggiungere un po' di tempo di calcolo in più, quindi per velocizzare avrei potuto implementare il calcolo a manina, ma la "complessità" dei numeri complessi (scusate il gioco di parole XD) mi ha tolto la voglia.&lt;br /&gt;&lt;br /&gt;Avrò quindi bisono di sapere in quale zona del piano complesso sto andando a calcolare la successione, quindi dovrò definire il limite inferiore e superiore per l'asse reale (considerato l'asse delle ascisse) e l'asse complesso (considerato delle ordinate).&lt;br /&gt;Poi dovrò sapere quanto è lungo il lato delle ascisse e delle ordinate del piano (cioè la differenza tra il limite superiore ed inferiore degli assi), dato che questi valori poi mi servono per calcolare il valore di incremento. Si deve considerare che la texture (che rappresenta il frattale) sarà una "approssimazione" del piano complesso, e dato che non posso avere tanti pixel quanti sono i punti del piano (dato che sarebbero infiniti) devo assegnare ad ogni pixel un punto del piano e calcolare il valore per quel punto, e per fare ciò, quando passo da un pixel al successivo, devo sapere di quando avando/devo incrementare per passare al punto successivo.&lt;br /&gt;&lt;br /&gt;Spieghiamo meglio questa cosa dei pixel...&lt;br /&gt;Come forse saprete i punti del piano sono infiniti, mentre per quanto possano essere piccoli e fitti i pixel di un'immagine essi sono in numero ben finito.&lt;br /&gt;Se ipotizzo i pixel dell'immagine come una "&lt;span style="font-weight: bold; font-style: italic;"&gt;discretizzazione&lt;/span&gt;" del piano complesso (passatemi questo brutto termine che a molti non piace), allora devo &lt;span style="font-style: italic; font-weight: bold;"&gt;assegnare &lt;/span&gt;ad ogni pixel un certo punto del piano, fare i calcoli su quel punto, e colorare il pixel a seconda del risultato ottenuto.&lt;br /&gt;Ora prendiamo il primo pixel dell'immagine, quello che sta in alto a sinistra per interci (perchè nelle immagini l'asse delle X va da sinistra a destra e quello delle Y dall'alto verso il basso), e diamogli come punto quello identificato dall'estremo inferiore per l'asse X e dall'estremo superiore per l'alle Y. Quando poi vogliamo passare al punto successivo (per ora considero lo spostamento solo sull'asse reale, cioè delle X) dovrò incrementare di una certa quantità.&lt;br /&gt;Questa quantità che devo sommare per passare da un punto all'altro la posso calcolare sapendo quanto è lungo il lato reale che sto prendendo in cosiderazione (quindi estremo superiore di X - estremo inferirio di X) e va diviso per la larghezza dell'immagine (in pixel naturalmente). In questo modo per passare da un punto a l'altro si fa una semplice somma.&lt;br /&gt;Notate che la stessa cosa va fatta/calcolta per l'asse delle Y, trovando la quantità di incremento dividendo il lato verticale del piano per il numero di pixel dell'altezza.&lt;br /&gt;&lt;br /&gt;Poi ho bisongno del massimo numero di iterazioni da calcolare prima di considerare il punto come appartenente all'insieme. Ricordo che un punto viene considerato parte dell'insieme di Madelbrot e quindi colorato di nero, solo se dopo N iterazioni (con N numero massimo di iterazioni) del calcolo della successione, il valore rispetta ancora la legge.&lt;br /&gt;Naturalmente avrò bisogno anche di altre variabili: per esempio dovrò poter memorizzare il valore di ogni punto del piano di cui sto calcolando la successione, il numero di iterazioni fatte per ogni punto calcolato, e intanto che ci siamo anche per quali indici/pixel/punto devo ancora continuare a calcolare  la successione.&lt;br /&gt;Le variabili definite a questo scopo sono:&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;double&lt;/span&gt; infx = -2, supx = 2, infy = -2, supy = 2; &lt;span class="rem"&gt;//limiti del piano complesso su cui calcoare la successione&lt;/span&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;double&lt;/span&gt; latox, latoy, incx, incy; &lt;span class="rem"&gt;//lunghezza dei lati e di quando devo incrementare il valore &lt;/span&gt;&lt;br /&gt;          &lt;span class="rem"&gt;//da un pixel e l'altro&lt;/span&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; maxIteration = 250; &lt;span class="rem"&gt;//numero massimo di iterazione&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;protected&lt;/span&gt; Texture2D fractal; &lt;span class="rem"&gt;//texture&lt;/span&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; complete = &lt;span class="kwrd"&gt;true&lt;/span&gt;; &lt;span class="rem"&gt;//indica se il calcolo è completo o no&lt;/span&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; width, height; &lt;span class="rem"&gt;//altezza e larghezza della texture&lt;/span&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;protected&lt;/span&gt; Color[] pixData; &lt;span class="rem"&gt;//vettore contenente il colore dei pixel della texture&lt;/span&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; total; &lt;span class="rem"&gt;// numero totale dei pixel della texture&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;protected&lt;/span&gt; Queue&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt; indici = &lt;span class="kwrd"&gt;new&lt;/span&gt; Queue&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt;(); &lt;span class="rem"&gt;//indice del pixel che devo calcolare&lt;/span&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt;[,] iterazioni; &lt;span class="rem"&gt;//numero di iterazioni per ogni punto&lt;/span&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;protected&lt;/span&gt; Cmplx[,] valori; &lt;span class="rem"&gt;//valore di ogni punto&lt;/span&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;protected&lt;/span&gt; Cmplx zCm = &lt;span class="kwrd"&gt;new&lt;/span&gt; Cmplx(), cCm = &lt;span class="kwrd"&gt;new&lt;/span&gt; Cmplx(); //numeri complessi per il calcolo&lt;/pre&gt;&lt;br /&gt;NOTA: il perchè ho usato una queue (struttura dati che implementa una coda, cioè una "lista" di elementi con estrazione in testa testa ed inserimento in coda) sarà chiaro in seguito.&lt;br /&gt;&lt;br /&gt;La classe MandelBrotFractal è figlia di GameComponent, in questo modo potrà avere il suo metodo update e eseguire parte del calcolo ad ogni chiamata del metodo. Inoltre implementerà un'interfaccia da me definita che esporrà i metodi per agire sul frattale.&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; FractalI&lt;br /&gt;{&lt;br /&gt;  Texture2D Fractal { get; }&lt;br /&gt;  &lt;span class="kwrd"&gt;void&lt;/span&gt; resizeTexture(&lt;span class="kwrd"&gt;int&lt;/span&gt; width, &lt;span class="kwrd"&gt;int&lt;/span&gt; height);&lt;br /&gt;  &lt;span class="kwrd"&gt;bool&lt;/span&gt; Complete { get; }&lt;br /&gt;  &lt;span class="kwrd"&gt;int&lt;/span&gt; Width { get; }&lt;br /&gt;  &lt;span class="kwrd"&gt;int&lt;/span&gt; Heigth { get; }&lt;br /&gt;  &lt;span class="kwrd"&gt;void&lt;/span&gt; UpdateFractalDouble(&lt;span class="kwrd"&gt;double&lt;/span&gt; infx, &lt;span class="kwrd"&gt;double&lt;/span&gt; supx, &lt;span class="kwrd"&gt;double&lt;/span&gt; infy, &lt;span class="kwrd"&gt;double&lt;/span&gt; supy, &lt;span class="kwrd"&gt;int&lt;/span&gt; MAX);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Il significato mi pare abbastanza esplicito, comunque quando si vedrà come vengono usati i metodi sarà ancora più chiaro.&lt;br /&gt;&lt;br /&gt;Il codice completo della classe che genera il MandelBrot è questo:&lt;br /&gt;&lt;a href="javascript:toggle();" id="displayText"&gt;Show/Hide&lt;/a&gt;&lt;br /&gt;&lt;div id="toggleText" style="display: none;"&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; MandelBrotFractal : Microsoft.Xna.Framework.GameComponent, FractalI&lt;br /&gt;{&lt;br /&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;double&lt;/span&gt; infx = -2, supx = 2, infy = -2, supy = 2; &lt;span class="rem"&gt;//limiti del piano complesso su cui calcoare la successione&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;double&lt;/span&gt; latox, latoy, incx, incy; &lt;span class="rem"&gt;//lunghezza dei lati e di quando devo incrementare il valore &lt;/span&gt;&lt;br /&gt;            &lt;span class="rem"&gt;//da un pixel e l'altro&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; maxIteration = 250; &lt;span class="rem"&gt;//numero massimo di iterazione&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; Texture2D fractal; &lt;span class="rem"&gt;//texture&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; complete = &lt;span class="kwrd"&gt;true&lt;/span&gt;; &lt;span class="rem"&gt;//indica se il calcolo è completo o no&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; width, height; &lt;span class="rem"&gt;//altezza e larghezza della texture&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; Color[] pixData; &lt;span class="rem"&gt;//vettore contenente il colore dei pixel della texture&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; total; &lt;span class="rem"&gt;// numero totale dei pixel della texture&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; Queue&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt; indici = &lt;span class="kwrd"&gt;new&lt;/span&gt; Queue&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt;(); &lt;span class="rem"&gt;//indice del pixel che devo calcolare&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt;[,] iterazioni; &lt;span class="rem"&gt;//numero di iterazioni per ogni punto&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; Cmplx[,] valori; &lt;span class="rem"&gt;//valore di ogni punto&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; Cmplx zCm = &lt;span class="kwrd"&gt;new&lt;/span&gt; Cmplx(), cCm = &lt;span class="kwrd"&gt;new&lt;/span&gt; Cmplx(); &lt;span class="rem"&gt;//numeri complessi per il calcolo&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; MandelBrotFractal(Game game, &lt;span class="kwrd"&gt;double&lt;/span&gt; infx, &lt;span class="kwrd"&gt;double&lt;/span&gt; supx, &lt;span class="kwrd"&gt;double&lt;/span&gt; infy, &lt;span class="kwrd"&gt;double&lt;/span&gt; supy, &lt;span class="kwrd"&gt;int&lt;/span&gt; maxInt)&lt;br /&gt;        : &lt;span class="kwrd"&gt;base&lt;/span&gt;(game)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="rem"&gt;//prendo i valori della larghezza e altezza della texture&lt;/span&gt;&lt;br /&gt;        width = &lt;span class="kwrd"&gt;this&lt;/span&gt;.Game.GraphicsDevice.PresentationParameters.BackBufferWidth;&lt;br /&gt;        height = &lt;span class="kwrd"&gt;this&lt;/span&gt;.Game.GraphicsDevice.PresentationParameters.BackBufferHeight;&lt;br /&gt;        &lt;span class="rem"&gt;//numero totale di pixel&lt;/span&gt;&lt;br /&gt;        total = width * height;&lt;br /&gt;        pixData = &lt;span class="kwrd"&gt;new&lt;/span&gt; Color[total]; &lt;span class="rem"&gt;//creo l'array per i colori dei pixel&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span class="rem"&gt;//creo la texture&lt;/span&gt;&lt;br /&gt;        fractal = &lt;span class="kwrd"&gt;new&lt;/span&gt; Texture2D(&lt;span class="kwrd"&gt;this&lt;/span&gt;.Game.GraphicsDevice,&lt;br /&gt;            width,&lt;br /&gt;            height, 1,&lt;br /&gt;            TextureUsage.None, SurfaceFormat.Color);&lt;br /&gt;        &lt;span class="rem"&gt;//creo la matrice che conterrà il numero di iterazioni fatte per ogni punto&lt;/span&gt;&lt;br /&gt;        iterazioni = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt;[height, width];&lt;br /&gt;        &lt;span class="rem"&gt;//creo la matrice di numeri complessi che conterrà il valore di ogni punto del piano che sto calcolando&lt;/span&gt;&lt;br /&gt;        &lt;span class="rem"&gt;//e di volta in volta il calcolo parziale&lt;/span&gt;&lt;br /&gt;        valori = &lt;span class="kwrd"&gt;new&lt;/span&gt; Cmplx[height, width];&lt;br /&gt;        &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; height; i++)&lt;br /&gt;            &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; j = 0; j &amp;lt; width; j++)&lt;br /&gt;                valori[i, j] = &lt;span class="kwrd"&gt;new&lt;/span&gt; Cmplx();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Initialize()&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;base&lt;/span&gt;.Initialize();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Update(GameTime gameTime)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (!complete)&lt;br /&gt;        {&lt;br /&gt;            &lt;span class="rem"&gt;//se il frattale è da completare eseguo il calcolo&lt;/span&gt;&lt;br /&gt;            calcolaFrattale();&lt;br /&gt;        }&lt;br /&gt;        &lt;span class="kwrd"&gt;base&lt;/span&gt;.Update(gameTime);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;virtual&lt;/span&gt; Cmplx calcola(Cmplx z, Cmplx c)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="rem"&gt;//calcolo il valore&lt;/span&gt;&lt;br /&gt;        Cmplx ris = z.sqr().add(c);&lt;br /&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; ris;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; Cmplx ris;&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; calcolaFrattale()&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="rem"&gt;//variabili usate per inizializzare c&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;double&lt;/span&gt; cre, cim;&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;int&lt;/span&gt; indice = 0;&lt;br /&gt;        &lt;span class="rem"&gt;//memorizzo quanti indici devo calcolare&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;int&lt;/span&gt; count = indici.Count;&lt;br /&gt;        &lt;span class="kwrd"&gt;for&lt;/span&gt;(&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; count; i++) &lt;span class="rem"&gt;//faccio count estrazioni dalla coda&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            indice = indici.Dequeue();&lt;br /&gt;            &lt;span class="rem"&gt;//calcolo il corrispettivo indice di riga e di colonna&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;int&lt;/span&gt; r = indice / width;&lt;br /&gt;            &lt;span class="kwrd"&gt;int&lt;/span&gt; c = indice % width;&lt;br /&gt;            &lt;span class="rem"&gt;//calcolo il valore di c da usare (potrei memorizzarlo in una matrice?)&lt;/span&gt;&lt;br /&gt;            cre = infx + (c * incx);&lt;br /&gt;            cim = infy + (r * incy);&lt;br /&gt;&lt;br /&gt;            &lt;span class="rem"&gt;//recupero il valore di z&lt;/span&gt;&lt;br /&gt;            zCm = valori[r, c];&lt;br /&gt;            &lt;span class="rem"&gt;//controllo che il valore sia in modulo minore di 4 e che non abbia già fatto il max num di iterazioni&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (zCm.modsq() &amp;lt;= 4 &amp;amp;&amp;amp; iterazioni[r, c] &amp;lt; maxIteration)&lt;br /&gt;            {&lt;br /&gt;                cCm.set(cre, cim);&lt;br /&gt;                ris = calcola(zCm, cCm); &lt;span class="rem"&gt;//eseguo il calcolo&lt;/span&gt;&lt;br /&gt;                valori[r, c] = ris; &lt;span class="rem"&gt;//aggiorno&lt;/span&gt;&lt;br /&gt;                iterazioni[r, c]++; &lt;span class="rem"&gt;//aggiorno&lt;/span&gt;&lt;br /&gt;                indici.Enqueue(indice); &lt;span class="rem"&gt;//reinserisco l'indice nella coda per il prossimo calcolo&lt;/span&gt;&lt;br /&gt;            }&lt;br /&gt;            &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;br /&gt;            {&lt;br /&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt; (iterazioni[r, c] == maxIteration)&lt;br /&gt;                {&lt;br /&gt;                    &lt;span class="rem"&gt;//il punto fa parte dell'insieme: lo coloro di nero&lt;/span&gt;&lt;br /&gt;                    pixData[indice] = Color.Black;&lt;br /&gt;                }&lt;br /&gt;                &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;br /&gt;                {&lt;br /&gt;                    &lt;span class="rem"&gt;//il punto non fa parte dell'insieme&lt;/span&gt;&lt;br /&gt;                    &lt;span class="kwrd"&gt;float&lt;/span&gt; val = (&lt;span class="kwrd"&gt;float&lt;/span&gt;)iterazioni[r, c] / maxIteration;&lt;br /&gt;                    &lt;span class="kwrd"&gt;int&lt;/span&gt; h, s, v;&lt;br /&gt;                    HsvToRgb(360.0f * val, 1.0f, 1.0f, &lt;span class="kwrd"&gt;out&lt;/span&gt; h, &lt;span class="kwrd"&gt;out&lt;/span&gt; s, &lt;span class="kwrd"&gt;out&lt;/span&gt; v);&lt;br /&gt;                    &lt;span class="rem"&gt;//lo coloro in modo opportuno&lt;/span&gt;&lt;br /&gt;                    pixData[indice] = &lt;span class="kwrd"&gt;new&lt;/span&gt; Color((Byte)h, (Byte)s, (Byte)v);&lt;br /&gt;&lt;br /&gt;                    &lt;span class="rem"&gt;//Nota: cambiando come si calcola il colore posso ottenere scale di colore diverse&lt;/span&gt;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        &lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            fractal.SetData(pixData);&lt;span class="rem"&gt;//aggiorno la texture&lt;/span&gt;&lt;br /&gt;        }&lt;br /&gt;        &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception e)&lt;br /&gt;        { }&lt;br /&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (indici.Count == 0)&lt;br /&gt;        {&lt;br /&gt;            &lt;span class="rem"&gt;//se la coda risulta vuota vuol dire che ho finito di calcolare&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;this&lt;/span&gt;.Game.Window.Title = &lt;span class="str"&gt;"Render complete"&lt;/span&gt;;&lt;br /&gt;            complete = &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; Color makeColor(&lt;span class="kwrd"&gt;float&lt;/span&gt; r, &lt;span class="kwrd"&gt;float&lt;/span&gt; g, &lt;span class="kwrd"&gt;float&lt;/span&gt; b)&lt;br /&gt;    {&lt;br /&gt;        System.Drawing.Color color = System.Drawing.Color.FromArgb((&lt;span class="kwrd"&gt;int&lt;/span&gt;)(r), (&lt;span class="kwrd"&gt;int&lt;/span&gt;)(g), (&lt;span class="kwrd"&gt;int&lt;/span&gt;)(b));&lt;br /&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; Color(color.R, color.G, color.B);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;//qui c'è la funzione per il passaggio dal HSV a RGB&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;//guardate i sorgenti&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;int&lt;/span&gt; Clamp(&lt;span class="kwrd"&gt;int&lt;/span&gt; i)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (i &amp;lt; 0) &lt;span class="kwrd"&gt;return&lt;/span&gt; 0;&lt;br /&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (i &amp;gt; 255) &lt;span class="kwrd"&gt;return&lt;/span&gt; 255;&lt;br /&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; i;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="preproc"&gt;#region&lt;/span&gt; FracalI Membri di&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; Texture2D Fractal&lt;br /&gt;    {&lt;br /&gt;        get { &lt;span class="kwrd"&gt;return&lt;/span&gt; fractal; }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// aggiorna il calcolo del frattale dando gli estremi del piano su cui calcolare e il massimo numero di iterazioni&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;param name="infx"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;param name="supx"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;param name="infy"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;param name="supy"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;param name="maxIt"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;virtual&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; UpdateFractalDouble(&lt;span class="kwrd"&gt;double&lt;/span&gt; infx, &lt;span class="kwrd"&gt;double&lt;/span&gt; supx, &lt;span class="kwrd"&gt;double&lt;/span&gt; infy, &lt;span class="kwrd"&gt;double&lt;/span&gt; supy, &lt;span class="kwrd"&gt;int&lt;/span&gt; maxIt)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;this&lt;/span&gt;.infx = infx;&lt;br /&gt;        &lt;span class="kwrd"&gt;this&lt;/span&gt;.supx = supx;&lt;br /&gt;        &lt;span class="kwrd"&gt;this&lt;/span&gt;.infy = infy;&lt;br /&gt;        &lt;span class="kwrd"&gt;this&lt;/span&gt;.supy = supy;&lt;br /&gt;        &lt;span class="kwrd"&gt;this&lt;/span&gt;.maxIteration = maxIt;&lt;br /&gt;&lt;br /&gt;        latox = Math.Abs(supx - infx);&lt;br /&gt;        latoy = Math.Abs(supy - infy);&lt;br /&gt;        incx = latox / width;&lt;br /&gt;        incy = latoy / height;&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;this&lt;/span&gt;.Game.Window.Title = &lt;span class="str"&gt;"Render WIP"&lt;/span&gt;;&lt;br /&gt;        complete = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;br /&gt;        indici.Clear();&lt;br /&gt;        &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; total; i++)&lt;br /&gt;        {&lt;br /&gt;            &lt;span class="kwrd"&gt;int&lt;/span&gt; r = i / width;&lt;br /&gt;            &lt;span class="kwrd"&gt;int&lt;/span&gt; c = i % width;&lt;br /&gt;            indici.Enqueue(i);&lt;br /&gt;            iterazioni[r, c] = 0;&lt;br /&gt;            valori[r, c].set(0, 0);&lt;br /&gt;            pixData[i] = Color.Lerp(pixData[i], Color.Black, 0.7f);&lt;br /&gt;        }&lt;br /&gt;        fractal.SetData(pixData);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; Complete&lt;br /&gt;    {&lt;br /&gt;        get { &lt;span class="kwrd"&gt;return&lt;/span&gt; complete; }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; Width&lt;br /&gt;    {&lt;br /&gt;        get { &lt;span class="kwrd"&gt;return&lt;/span&gt; width; }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; Heigth&lt;br /&gt;    {&lt;br /&gt;        get { &lt;span class="kwrd"&gt;return&lt;/span&gt; height; }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// ridimenziona la texture su cui andiamo a calcolare il frattale&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;param name="width"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;param name="height"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; resizeTexture(&lt;span class="kwrd"&gt;int&lt;/span&gt; width, &lt;span class="kwrd"&gt;int&lt;/span&gt; height)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="rem"&gt;//aggiorna i valori&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;this&lt;/span&gt;.width = width;&lt;br /&gt;        &lt;span class="kwrd"&gt;this&lt;/span&gt;.height = height;&lt;br /&gt;&lt;br /&gt;        total = width * height;&lt;br /&gt;        &lt;span class="rem"&gt;//ricrea il vettore dei colori&lt;/span&gt;&lt;br /&gt;        pixData = &lt;span class="kwrd"&gt;new&lt;/span&gt; Color[total];&lt;br /&gt;&lt;br /&gt;        &lt;span class="rem"&gt;//elimina la vecchia texture e la ricrea&lt;/span&gt;&lt;br /&gt;        fractal.Dispose();&lt;br /&gt;        fractal = &lt;span class="kwrd"&gt;new&lt;/span&gt; Texture2D(&lt;span class="kwrd"&gt;this&lt;/span&gt;.Game.GraphicsDevice,&lt;br /&gt;            width,&lt;br /&gt;            height, 1,&lt;br /&gt;            TextureUsage.None, SurfaceFormat.Color);&lt;br /&gt;&lt;br /&gt;        &lt;span class="rem"&gt;//ricrea la matrice con il numero di iterazioni fatte per ogni punto&lt;/span&gt;&lt;br /&gt;        iterazioni = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt;[height, width];&lt;br /&gt;        &lt;span class="rem"&gt;//ricrea la matrice di numeri complessi per memorizzare il valore di ogni punto&lt;/span&gt;&lt;br /&gt;        valori = &lt;span class="kwrd"&gt;new&lt;/span&gt; Cmplx[width, height];&lt;br /&gt;        &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; width; i++)&lt;br /&gt;            &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; j = 0; j &amp;lt; height; j++)&lt;br /&gt;                valori[i, j] = &lt;span class="kwrd"&gt;new&lt;/span&gt; Cmplx();&lt;br /&gt;&lt;br /&gt;        &lt;span class="rem"&gt;//forzo l'aggiornamento&lt;/span&gt;&lt;br /&gt;        UpdateFractalDouble(infx, supx, infy, supy, maxIteration);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Preferisco soffermarmi sul metodo calcolaFrattale() e su quello che fa:&lt;br /&gt;quello che facciamo è controllare quanti elementi sono presenti nella coda degli indici (punti) per cu idevo calcolare il prossimo passo della successione (in questo modo so quante estrazioni fare).&lt;br /&gt;Quindi comincio con estrarre l'elemento in testa alla coda, e calcolati l'indice di riga e di colonna trovo il valore della costante &lt;span style="font-weight: bold;"&gt;C&lt;/span&gt; da usare nel calcolo della successione per quel punto.&lt;br /&gt;Il valore di C cambia a seconda del punto che stiamo considerando.&lt;br /&gt;Poi recuperiamo il valore precedente per Z, e controlliamo se in modulo è minore di 4, o se non abbiamo già eseguito per il quel punto il massimo numero di iterazioni.&lt;br /&gt;Se il punto ha valore in modulo maggiore di 4 non fa parte dell'insieme, quindi va colorato in modo oppurtuno. Se invece ho fatto il massimo numero di iterazioni e il valore del punto è ancora minore di 4 lo considero come appartenente all'insieme di Madelbrot e lo coloro di nero.&lt;br /&gt;Per la colorazione del punto, uso il rapporto tra il numero di iterazioni fatte prima di trovare che il punto diverge e il numero massimo di iterazioni come parametro nella funzione che trasforma un colore in scala HSV in RGB (dove il rapporto è usato come H, cioè Hue, cioè la tonalità del colore).&lt;br /&gt;Cambiando il modo in cui si usa il numero di iterazioni fatte nel calcolo del colore del pixel possono ottenere scale di colore diverse.&lt;br /&gt;&lt;br /&gt;Come potete vedere osservando il codice, ogni volta che eseguiamo il metodo calcolaFrattale, viene calcolato un passo per ogni punto che ancora non è stato considerato non appartenente all'insieme. Questo vuol dire che mano a mano che si procede nel calcolo avrò sempre meno punti su cui calcolare la successione, e quindi il calcolo tenderà a diventare più veloce!&lt;br /&gt;&lt;br /&gt;NOTA: perchè per ogni esecuzione del metodo calcolo un solo passo? Non posso calcolare tutto il frattale in una volta sola?&lt;br /&gt;Certo si poteva fare anche in quel modo, ma poi non avrei potuto renderizzare lo stato intermedio del calcolo: in parole semplici avrei dovuto aspettare che il calcolo fosse concluso per poter far vedere il frattale, mentre in questo modo lo posso renderizzare anche quando è in fase di costruzione. In questo modo l'attesa per la completazione del frattale sarà più sopportabile ^^&lt;br /&gt;&lt;br /&gt;Diamo adesso una piccola spiegazione sull'implementazione del metodo UpdateFractal():&lt;br /&gt;questo metodo non fa altro che aggiornare lo stato del componente con i valori passati, e fa ripartire il cacolo del frattale con i nuovi dati.&lt;br /&gt;Adesso io volevo (ed ho poi fatto) un effetto di transizione tra un'immagine di un fratale e quella successiva, solo che non "sapevo" dove metterla e alla fine l'ho messa in questo metodo.&lt;br /&gt;Analizziamo in dettaglio ciò:&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;           &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; total; i++)&lt;br /&gt;           {&lt;br /&gt;               &lt;span class="kwrd"&gt;int&lt;/span&gt; r = i / width;&lt;br /&gt;               &lt;span class="kwrd"&gt;int&lt;/span&gt; c = i % width;&lt;br /&gt;               indici.Enqueue(i);&lt;br /&gt;               iterazioni[r, c] = 0;&lt;br /&gt;               valori[r, c].set(0, 0);&lt;br /&gt;               pixData[i] = Color.Lerp(pixData[i], Color.Black, 0.7f);&lt;br /&gt;           }&lt;/pre&gt;&lt;br /&gt;in questo pezzo di codice scorro il vettore che contiene il colore di ogni pixel dell'immagine. All'inizio impostavo tutti i pixel a nero, solo che così il passaggio tra un'immagine e la successiva era troppo netta (almeno per i miei gusti), e la cancellazione istantanea dell'immagine mi dava noia.&lt;br /&gt;Quindi ho deciso di scurire tutta l'immagine facendo una semplice interpolazione tra il colore attuale de pixel ed il colore nero. Successivamente, quando il calcolo del frattale verrà riavviato, si andrà a lavorare di nuovo sulla stessa texture, colorando in modo diverso i pixel. Si avrà quindi un effetto di transizione tra un'immagine e l'altra.&lt;br /&gt;&lt;br /&gt;Spero di essere stato chiaro fino ad ora, dato che adesso viene la parte più incasinata, e cioè gestire ed agire sul frattale tramite gli strumenti offerti da XNA.&lt;br /&gt;Quello che voglio fare è riuscire, con il mouse, a selezionare una zona del frattale su cui fare zoom, quindi modificare gli estremi della zona del piano su cui stiamo calcolando la successione.&lt;br /&gt;Voglio poi poter incrementare e drecrementare il numero massimo di iterazioni da fare come la risoluzione della texture su cui calcolo il frattale (più pixel ho più punti dovrò considerare, quindi avrò una maggiore precisione).&lt;br /&gt;&lt;br /&gt;Invece di stare a schiaffarvi qui il codice dell'applicazione ve lo lascio la leggere direttamente dal sorgente, dato che la cosa che mi ero proposto di fare era spiegarvi come avevo implementanto il calcolo del frattale.&lt;br /&gt;Però il codice sarà abbastanza commentanto, in questo modo non dovreste avere difficoltà!&lt;br /&gt;&lt;br /&gt;Ecco il link al file&lt;br /&gt;&lt;a style="color: rgb(51, 204, 0);" href="http://odino87.interfree.it/XNA/XNA-Mandelbrot.rar"&gt;&lt;span style="font-weight: bold;"&gt;XNA-Mandelbrot.rar&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Spero di essere stato il più chiaro possibile...&lt;br /&gt;in caso non lo sia stato (cosa più che probabile XD) non esitate a chidere chiarimenti, a dirmi dove ho sbagliato, o anche a mandarmi a quel paese se volete!&lt;br /&gt;&lt;br /&gt;Ciauz! Alla prossima da Odino!&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-9071668853625551877?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/9071668853625551877/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=9071668853625551877' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/9071668853625551877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/9071668853625551877'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2009/11/xna-way-tutorial-9-fractal-generator.html' title='The Xna-Way: Tutorial 9: Fractal Generator'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-7876069262273431186</id><published>2009-10-26T22:50:00.001+01:00</published><updated>2009-10-29T15:30:56.628+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='The Xna-Way'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Guida XNA'/><title type='text'>XNA - Frattali</title><content type='html'>Tutto ciò è colpa di un mio professore dell'università...&lt;br /&gt;E' lui che ha fatto accadere tutto ciò ?_?&lt;br /&gt;Non ve la prendete con me ?_?&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;Seguendo il corso di Costruzione di Interfacce il nostro professore ci ha fatto vedere un'applicazione che fatto lui: si tratta di un programma che permette di calcolare e visualizzare il frattale di Mandelbrot.&lt;br /&gt;Il frattale di MandelBrot è uno dei più famosi frattali (lo so dire ora, ma prima che ce lo facesse vedere lui manco sapevo chi fosse XD), e devo dire che con i frattali ci si può "divertire". Tutto ciò mi ha fatto tornare alla mente quando, da piccolo, mio padre mi fece vedere  un programma per calcolare queste strane immagini, dove io potevo selezionare una parte piccola piccola, e l'immagine non "perdeva di dettaglio"... Ah beata innocenza XD&lt;br /&gt;&lt;br /&gt;Sta di fatto che dopo aver visto questo programma fatto dal nostro professore mi sono deciso a farne uno mio. Dato che sto lavorando con XNA ho deciso di farne uno che utilizzasse XNA per calcolare e visualizzare i frattali.&lt;br /&gt;Ci sto ancora lavorando, e devo implementare alcuni particolari, ma direi che il grosso è fatto.&lt;br /&gt;Quindi se vi chiedete che fine ho fatto, o sono dentro un frattale(XD) o sto studiando per un esame (che voglia eh XD).&lt;br /&gt;&lt;br /&gt;Intanto vi lascio con qualche immagine ottenuta da questo generatore di frattali che ho fatto ^_^&lt;br /&gt;Spero vi piacciano :)&lt;br /&gt;Quando sarà finito posterò qualcosa del codice che ho fatto!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm3.static.flickr.com/2698/4048127284_5f4d3ecd8a_b.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 100px; height: 100px;" src="http://farm3.static.flickr.com/2698/4048127284_5f4d3ecd8a_t.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm3.static.flickr.com/2755/4047386711_38b6737b60_b.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 100px; height: 100px;" src="http://farm3.static.flickr.com/2755/4047386711_38b6737b60_t.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm3.static.flickr.com/2619/4036418251_8fb5915cb9_b.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 100px; height: 100px;" src="http://farm3.static.flickr.com/2619/4036418251_8fb5915cb9_t.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3484/4048126600_9244d17750_b.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 100px; height: 100px;" src="http://farm4.static.flickr.com/3484/4048126600_9244d17750_t.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm3.static.flickr.com/2786/4047386541_4b0e04e8ff_b.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 100px; height: 100px;" src="http://farm3.static.flickr.com/2786/4047386541_4b0e04e8ff_t.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A presto :)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-7876069262273431186?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/7876069262273431186/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=7876069262273431186' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/7876069262273431186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/7876069262273431186'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2009/10/xna-frattali.html' title='XNA - Frattali'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2698/4048127284_5f4d3ecd8a_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-3940039069612234969</id><published>2009-10-22T11:30:00.001+02:00</published><updated>2011-04-16T21:14:56.628+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='The Xna-Way'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA Component'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Guida XNA'/><title type='text'>The Xna-Way: Tutorial 8: Screen Shots del nostro gioco!</title><content type='html'>&lt;span style="font-weight:bold;"&gt;Aggiornamento al 16/04/2011:&lt;/span&gt;&lt;br /&gt;con l'aggiornamento alla versione 4 di Xna questo codice non è più funzionante, dato che alcune delle classi ed oggetti che vengono utilizzate sono state eliminate o è stato rivisto il loro funzionamento.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Quale è una cosa di cui oggi come oggi non si può fare a meno in un videogame?&lt;br /&gt;Bè una delle tante è la possiibilità di salvare la schermata di gioco, di farne una foto e di conservarla, in modo da mostrare ai nostri cari amici (nerd anche loro come noi) le nostre peripezie XD&lt;br /&gt;Questa cosa oltre ad essere una chicca che oramai cerchiamo in quasi ogni gioco mi tornerà utile anche per catturare schermate di gioco per i piccoli tutorial che farò.&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;Mi sono quindi messo di buzzo buono, e studiando degli esempi che ho trovato su Xna-club, esempi che tra l'altro trattavano effetti di post processing come bloom, e ho tirato fuori il mio piccolo componente.&lt;br /&gt;&lt;br /&gt;L'idea su cui mi sono basato è questa: XNA ci fornisce un ciclo di esecuzione nel quale vengono invocati in continuazione i metodi Update e Draw dei components che fanno parte del nostro gioco.&lt;br /&gt;Ora uno screen shot va salvato quando la scena è stata completamtente renderizzata. Quindi, ragionevolmente, dovremmo salvarla dopo che sono stati eseguiti tutti i metodi Draw dei nostri componenti.&lt;br /&gt;Ma come possiamo essere sicuri o controllare questa cosa?&lt;br /&gt;&lt;br /&gt;La cosa più semplice ed immediata da fare è capire che la scena che noi vogliamo salvare, è "completa" quando siamo nel metodo update. Cioè saremo "indietro" di un frame quando andremo a salvare l'immagine, gli oggetti non saranno stati spostati, ma nel contempo il rendering della scena non sarà ancora incominciato, e quindi avremo (da qualche parte in memoria) il render completo della scena al frame precedente!&lt;br /&gt;Quello che dobbiamo fare è semplicemtente recuperarlo e salvarlo.&lt;br /&gt;&lt;br /&gt;Ecco la classe, il component, che fa questo:&lt;br /&gt;&lt;a href="javascript:toggle();" id="displayText"&gt;Show/Hide&lt;/a&gt;&lt;br /&gt;&lt;div id="toggleText" style="display: none;"&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; ScreenShots : Microsoft.Xna.Framework.GameComponent&lt;br /&gt;    {&lt;br /&gt;        ResolveTexture2D resolveTarget;&lt;br /&gt;        &lt;span class="kwrd"&gt;string&lt;/span&gt; path;&lt;br /&gt;        InputI inputDevice;&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; ScreenShots(Game game)&lt;br /&gt;            : &lt;span class="kwrd"&gt;this&lt;/span&gt;(game, System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyPictures))&lt;br /&gt;        {&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; ScreenShots(Game game, &lt;span class="kwrd"&gt;string&lt;/span&gt; path)&lt;br /&gt;            : &lt;span class="kwrd"&gt;base&lt;/span&gt;(game)&lt;br /&gt;        {&lt;br /&gt;            &lt;span class="kwrd"&gt;this&lt;/span&gt;.path = path;&lt;br /&gt;            inputDevice = (InputI)game.Services.GetService(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(InputI));&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Initialize()&lt;br /&gt;        {&lt;br /&gt;            PresentationParameters pp = Game.GraphicsDevice.PresentationParameters;&lt;br /&gt;            SurfaceFormat format = pp.BackBufferFormat;&lt;br /&gt;            resolveTarget = &lt;span class="kwrd"&gt;new&lt;/span&gt; ResolveTexture2D(Game.GraphicsDevice, pp.BackBufferWidth, pp.BackBufferHeight, 1,&lt;br /&gt;                format);&lt;br /&gt;            &lt;span class="kwrd"&gt;base&lt;/span&gt;.Initialize();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Update(GameTime gameTime)&lt;br /&gt;        {&lt;br /&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (inputDevice.wasPressed(Keys.PrintScreen))&lt;br /&gt;            {&lt;br /&gt;                Game.GraphicsDevice.ResolveBackBuffer(resolveTarget);&lt;br /&gt;                DateTime time = DateTime.Now;&lt;br /&gt;                &lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;br /&gt;                {&lt;br /&gt;                    ((Texture2D)resolveTarget).Save(path + &lt;span class="str"&gt;@"\screen"&lt;/span&gt; + time.Ticks.ToString() + &lt;span class="str"&gt;".jpg"&lt;/span&gt;, ImageFileFormat.Jpg);&lt;br /&gt;                }&lt;br /&gt;                &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception e)&lt;br /&gt;                {&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            &lt;span class="kwrd"&gt;base&lt;/span&gt;.Update(gameTime);&lt;br /&gt;        }&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Al costruttore gli viene passato il percorso della directory in cui salvare le immagini, oppure solo il riferimento alla Game, ed in questo secondo caso la directory di default per il salvataggio delle immagini è la cartella immagini dell'utente.&lt;br /&gt;Come si vede si recupera anche il riferimento al servizio per l'input.&lt;br /&gt;&lt;br /&gt;In Initialize creo un ResolveTexture2D delle stesse dimensioni e formato del backBuffer del gioco.&lt;br /&gt;&lt;br /&gt;Nel metodo update controlliamo se il tasto Stamp (o printScree, dipende da come lo si vuole chiamare) è stato premuto.&lt;br /&gt;In caso positivo tramite &lt;span style="font-weight:bold;"&gt;ResolveBackBuffer&lt;/span&gt; recupero il backBuffer del frame precedente (e quindi il render completo della scena precente) e lo metto in resolveTarget.&lt;br /&gt;Dato che resolve target è un tipo particolare di Texture2D posso forzare con un cast il suo tipo ad essere Texture2D appunto, ed usare quindi il metodo save per salvare su disco l'immagine.&lt;br /&gt;&lt;br /&gt;Tutto qua. Così possiamo salvare semplicemente gli screen del nostro gioco.&lt;br /&gt;&lt;br /&gt;Nel costruttore di Game1 si deve aggiungere le seguenti righe:&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;            screenShot = &lt;span class="kwrd"&gt;new&lt;/span&gt; ScreenShots(&lt;span class="kwrd"&gt;this&lt;/span&gt;);&lt;br /&gt;            Components.Add(screenShot);&lt;/pre&gt;&lt;br /&gt;ed siamo veramente alla fine!&lt;br /&gt;&lt;br /&gt;Non allego questa volta il file con il codice, dato che la classe è piccola e completamente inserita nel post.&lt;br /&gt;&lt;br /&gt;Spero vi sia utile.&lt;br /&gt;Alla prossima!&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-3940039069612234969?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/3940039069612234969/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=3940039069612234969' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/3940039069612234969'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/3940039069612234969'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2009/10/xna-way-tutorial-8-screen-shots-del.html' title='The Xna-Way: Tutorial 8: Screen Shots del nostro gioco!'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-4445334460567925505</id><published>2009-10-17T11:44:00.002+02:00</published><updated>2009-10-17T11:45:46.867+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='The Xna-Way'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Guida XNA'/><title type='text'>The Xna-Way: Tutorial 7: Collisioni con BoundingSphere</title><content type='html'>Dopo molto, troppo, tempo eccomi di nuovo qua a parlare di qualcosa inerente ad XNA.&lt;br /&gt;Questa volta voglio un po' parla delle collisioni, cosa che fa impazzire ogni programmatore di Video Giochi.&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;Anche io sono impazzito (più di quanto non fossi prima) quando mi sono addentrato in questo campo, e devo dire che ne sono rimasto un po' spaventato.&lt;br /&gt;&lt;br /&gt;Come si possono calcolare oggi come oggi le collisioni tra 2 oggetti?&lt;br /&gt;Bè un esempio di ciò l'ho usato per calcolare quali oggetti erano intersecati dal bounding Frustum della telecamera e quindi filtrare quelli da renderizzare da quelli che non lo erano.&lt;br /&gt;Questo è un esempio di collisioni fatto con i &lt;span style="font-weight: bold;"&gt;VOLUMI&lt;/span&gt;: ho usato un sfera (per la precisione una BoundingSphere) per approssimare il volume degli oggetti presenti nella scena (ci dovrà essere una sfera per ogni oggetto, o nel caso di oggetti replicati una sola sfera che verrà riposizionata e aggiornata per ogni oggetto di cui voglio calcolare la collisione).&lt;br /&gt;Come qualcuno potrà pensare, calcolare le collisione di 2 oggetti approssimando il loro volume con delle sfere può portare a delle approssimazioni tali da avere un grosso grado di imprecisione del calcolare l'effettiva collisione tra due oggetti.&lt;br /&gt;Se il nostro oggetto è una sfera allora la sua BS (abbreviazione di BoundigSphere) coinciderà esattamente con l'oggetto,  ma già nel caso di un cubo esso verrà contenuto per intero all'interno della sfera, così con oggetti più complessi!&lt;br /&gt;Ecco un esempio di quando ho detto:&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 500px; height: 304px;" src="http://farm4.static.flickr.com/3178/4013273621_bccbff698f.jpg" alt="" border="0" /&gt;&lt;br /&gt;Come possiamo vedere la navicella e il meteorite sono completamente contenuti all'interno delle loro sfere, anche se buona parte delle sfere non sono occupate dal volume del modello.&lt;br /&gt;&lt;br /&gt;Come si fa per calcolare le collissioni? La collisione viene calcolata controllando se le due sfere si toccano o si intersecano l'una con l'altra. Ho una collisione anche se una sfera è contenuta interamente in un'altra.&lt;br /&gt;&lt;br /&gt;XNA ci offre la classe &lt;span style="font-weight: bold;"&gt;BoundingSphere &lt;/span&gt;la quale è caratterizzata da una posizione e da un raggio. Le BS sono comode perchè anche se muoviamo o ruotiamo l'oggetto esso sarà sempre contenuto all'interno della &lt;span style="font-weight: bold;"&gt;stessa &lt;/span&gt;sfera, cosa che non accade con i BoundingBox (altro tipo di volumi per approssimazione), i quali sono dei parallelepipedi. Nel caso di una rotazione dobbiamo ricalcolare il rettangolo che contiene il nostro modello.&lt;br /&gt;L'unico caso in cui dobbiamo modificare la sfera è quando scaliamo il nostro oggetto, dato che dovremo anche aumentare/diminuire il raggio della sfera.&lt;br /&gt;&lt;br /&gt;In tutto questo tempo ho cercato a giro metodi "semplici" per il calcolo della collisione tra due oggetti nel modo più preciso possibile, cioè del tipo poligono contro poligono, vertice su poligono, etc, ma come potete immagianare con scarsi risultati.&lt;br /&gt;Ho provato a farne uno di mio, ma non funzionava bene ed il calcolo era talmente peso che già per modelli a basso numero di poligoni il frame rate si abbassava enormemente.&lt;br /&gt;Ho decico quindi per ora di dedicarmi a qualcosa di meno complicato e di continuare a scrivere qualcosa. Poi quando avrò maggiori conoscenze continuerò in seguito ad approfondire questo argomento.&lt;br /&gt;&lt;br /&gt;Quello che mi sono proposto di fare è quanto segue: alla creazione del modello ho deciso di estrarre dalle informazioni la boundingSphere caricata, e di tenerla aggiornata secondo le trasformazioni dell'oggetto. Esporrò poi un metodo per permettere di controllare se due dati modelli stanno collidendo con le boundingSphere. Forse non è proprio il caso di utilizzare una classe, ma utilizzare un'interfaccia che esponga queste proprietà comuni agli oggetti di cui vogliamo controllare le collisioni.&lt;br /&gt;&lt;br /&gt;Quello che ho fatto è stato definire la seguente interfaccia:&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; CollisionI&lt;br /&gt;{&lt;br /&gt;   BoundingSphere _BoundingSphere { get; }&lt;br /&gt;   &lt;span class="kwrd"&gt;bool&lt;/span&gt; CheckSPhereCollision(CollisionI obj);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Questa interfaccia contiene una proprietà e un metodo: la proprietà ritorna la boundingSphere relativa all'oggetto, mentre il metodo controlla se per due oggetti che implementano l'interfaccia ci sia o meno collisione.&lt;br /&gt;Da notare che in questo modo non vincolo il tipo degli oggetti tra cui posso calcolare la collisione, basta che implementino l'interfaccia e posso calcoare tutto.&lt;br /&gt;Certo è un poco spoglia, ma nessuno ci vieta in futuro, quando ne avremo bisogno, di aggiungere nuove funzionalità a questa interfaccia (aggiornando poi naturamente le classi che le implementano).&lt;br /&gt;Ho deciso di utilizzare un'interfaccia anche per dare libera scelta di implementare in modo diverso le funzionalità da una classe all'altra.&lt;br /&gt;&lt;br /&gt;Vediamo le modifiche fatte nella classe &lt;span style="font-weight: bold;"&gt;Ship&lt;/span&gt;:&lt;br /&gt;Codice da aggiungere a livello di classe-&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;       &lt;span class="rem"&gt;//dati per le collisioni&lt;/span&gt;&lt;br /&gt;       BoundingSphere sphere;&lt;br /&gt;       &lt;span class="kwrd"&gt;float&lt;/span&gt; radius;&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; Color colore = Color.Yellow;&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; BoundingSphere _BoundingSphere&lt;br /&gt;       {&lt;br /&gt;           get { &lt;span class="kwrd"&gt;return&lt;/span&gt; sphere; }&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; CheckSPhereCollision(CollisionI obj)&lt;br /&gt;       {&lt;br /&gt;           &lt;span class="kwrd"&gt;return&lt;/span&gt; sphere.Intersects(obj._BoundingSphere);&lt;br /&gt;       }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Codice da aggiungere nel costruttore-&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;           sphere = &lt;span class="kwrd"&gt;new&lt;/span&gt; BoundingSphere();&lt;br /&gt;&lt;br /&gt;           &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (ModelMesh mesh &lt;span class="kwrd"&gt;in&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.myModel.Meshes)&lt;br /&gt;           {&lt;br /&gt;               &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (ModelMeshPart mp &lt;span class="kwrd"&gt;in&lt;/span&gt; mesh.MeshParts)&lt;br /&gt;                   mp.Effect = currentEffect;&lt;br /&gt;               sphere = BoundingSphere.CreateMerged(sphere, mesh.BoundingSphere);&lt;br /&gt;           }&lt;br /&gt;           radius = sphere.Radius;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Codice da aggiungere nel metodo update (in fondo prima di base.Update(gameTime);)-&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;           sphere.Center = position;&lt;br /&gt;           sphere.Radius = radius * scale;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;OK!&lt;br /&gt;In questo modo abbiamo aggiunto nella classe i campi necessari a gestire le boundingSphere, abbiamo implementato i metodi richiesti.&lt;br /&gt;Nel costruttore creaiamo la boundingSphere come la sfera più grande che può contente tutte le boundingSphere di ogni singola parte del nostro modello (per ora non mi interessa di calcolare possibili sottocollisioni con le singole parti del modello, mi accontento di un calcolo più grossolano, se volete specializzare fate voi, io mi per ora mi accontento di capire il concetto ^^).&lt;br /&gt;Mi salvo anche il raggio iniziale delle sfera.&lt;br /&gt;Nel metodo update riposiziono la sfera in base alla posizione del modello e riaggiorno il raggio (nel caso sia stato scalato il modello).&lt;br /&gt;&lt;br /&gt;Come faccio a disegnare la sfera e a farla visualizzare?&lt;br /&gt;Ho usato una classe statica trovata qua:&lt;br /&gt;&lt;a href="http://www.xnawiki.com/index.php?title=Rendering_Bounding_Spheres"&gt;Rendering Bounding Spheres&lt;/a&gt;&lt;br /&gt;Passando al metodo render la sfera (più altri parametri) essa sarà renderizzata per noi. Certo è un po' pesante quando si deve disegnare molte sfere, quindi non esageriamo! (o se proprio volete renderizzare tutte le sfere vi consiglio di abbassare la risoluzione delle stesse: nel metodo render della classe statica andate a cambiare il valore 30 presente nella chiamata a InitializeGraphics da a 0, le sfere saranno leggermente più spigolose ma ne guadagnarete in prestazioni!).&lt;br /&gt;Quindi nel metodo draw della nostra classe Ship, dopo che abbiamo disegnato il modello aggiungete la seguente riga:&lt;br /&gt;BoundingSphereRenderer.Render(sphere, this.Game.GraphicsDevice, myCamera.View, myCamera.Projection, Color.Yellow);&lt;br /&gt;&lt;br /&gt;Ora se lanciate il gioco dovreste vedere una sfera approssimata da due cerchi, di colore giallo.&lt;br /&gt;&lt;br /&gt;Ora c'è da fare delle modifiche alla classe MeteorManager:&lt;br /&gt;Codice da aggiungere a livello di classe-&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;       BoundingSphere sphere;&lt;br /&gt;       &lt;span class="kwrd"&gt;float&lt;/span&gt; radius;&lt;br /&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; BoundingSphere _BoundingSphere&lt;br /&gt;       {&lt;br /&gt;           get { &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; NotImplementedException(); }&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; CheckSPhereCollision(CollisionI obj)&lt;br /&gt;       {&lt;br /&gt;           &lt;span class="kwrd"&gt;int&lt;/span&gt; val = 1;&lt;br /&gt;           &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = (cameraR - val); i &amp;lt;= &lt;span class="kwrd"&gt;this&lt;/span&gt;.cameraR + val; i++)&lt;br /&gt;           {&lt;br /&gt;               &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; j = (&lt;span class="kwrd"&gt;this&lt;/span&gt;.cameraC - val); j &amp;lt;= &lt;span class="kwrd"&gt;this&lt;/span&gt;.cameraC + val; j++)&lt;br /&gt;               {&lt;br /&gt;                   &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; k = (&lt;span class="kwrd"&gt;this&lt;/span&gt;.cameraP - val); k &amp;lt;= &lt;span class="kwrd"&gt;this&lt;/span&gt;.cameraP + val; k++)&lt;br /&gt;                   {&lt;br /&gt;                       &lt;span class="kwrd"&gt;int&lt;/span&gt; r = i % cells;&lt;br /&gt;                       &lt;span class="kwrd"&gt;int&lt;/span&gt; c = j % cells;&lt;br /&gt;                       &lt;span class="kwrd"&gt;int&lt;/span&gt; p = k % cells;&lt;br /&gt;                       &lt;span class="kwrd"&gt;if&lt;/span&gt; (r &amp;lt; 0)&lt;br /&gt;                           r = cells + r;&lt;br /&gt;                       &lt;span class="kwrd"&gt;if&lt;/span&gt; (c &amp;lt; 0)&lt;br /&gt;                           c = cells + c;&lt;br /&gt;                       &lt;span class="kwrd"&gt;if&lt;/span&gt; (p &amp;lt; 0)&lt;br /&gt;                           p = cells + p;&lt;br /&gt;                       &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (Trasformation tras &lt;span class="kwrd"&gt;in&lt;/span&gt; gameWorld[r % cells, c % cells, p % cells].myList)&lt;br /&gt;                       {&lt;br /&gt;                           sphere.Center = tras.position;&lt;br /&gt;                           sphere.Radius = radius * tras.scale;&lt;br /&gt;                           &lt;span class="kwrd"&gt;if&lt;/span&gt; (sphere.Intersects(obj._BoundingSphere))&lt;br /&gt;                               &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;br /&gt;                       }&lt;br /&gt;                   }&lt;br /&gt;               }&lt;br /&gt;           }&lt;br /&gt;           &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;br /&gt;       }&lt;/pre&gt;&lt;br /&gt;Cosa fa il metodo CheckSPhereCollision?&lt;br /&gt;Prende l'indice della cella in cui siamo, scorre le celle adiacenti a noi, e controlla (riposizionando la sfera e riscalandola) se c'è una collisione con uno degli elementi. Se ne trova uno con cui ho collisione ritorna true, altrimenti se dopo aver controllato tutti gli elementi possibili non ho trovato nessuna collisione ritorno false.&lt;br /&gt;&lt;br /&gt;Il costruttore va modificato con le stesse righe aggiunte nel costruttore di Ship.&lt;br /&gt;Il metodo update non va cambiato, dato che per ora i nostri meteoriti devono star fermi.&lt;br /&gt;Andiamo al metodo draw: questa riga va aggiunta nel ramo più interno, all'interno del IF che fa la verifica se la sfera è o meno intersecata dal frustum della telecamera-&gt;&lt;br /&gt;BoundingSphereRenderer.Render(sphere, this.Game.GraphicsDevice, myCamera.View, myCamera.Projection, Color.Purple);&lt;br /&gt;&lt;br /&gt;Da notare che ora la sphere a cui faccio riferimento non è più quella creata localmente nel Draw, ma quella a livello di classe. In questo modo non andremo a creare un nuovo oggetto ogni volta che viene eseguito il metodo Draw, con un miglioramento dell'utilizzo della memoria direi (su pc non si noterà, ma credo che sulla 360 forse si...).&lt;br /&gt;&lt;br /&gt;Per rendere le cose un po' più "carine" ho deciso di fare ciò:&lt;br /&gt;- nel metodo draw del MeteorManager ho diminuito la variabile val a 5&lt;br /&gt;- nel LoadContent di Game1 ho portato il numero di meteoriti per cella da 5 a 3 (per alleggerire il calcolo)&lt;br /&gt;-nella classe Ship ho aggiunto:&lt;br /&gt;public Color colore = Color.Yellow;&lt;br /&gt;-&gt; nel metodo Update di Game1 ho aggiunto:&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (mman.CheckSPhereCollision(myShip))&lt;br /&gt;                myShip.colore = Color.Red;&lt;br /&gt;            &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;br /&gt;                myShip.colore = Color.Yellow;&lt;/pre&gt;&lt;br /&gt;In questo modo quando si rileva una collisione il colore della sfera della nostra nave diverrà rosso, mentre tornerà giallo quando non collidiamo con nulla!&lt;br /&gt; &lt;br /&gt;Dovrebbe essere tutto! :D&lt;br /&gt;Se qualcosa non va c'è sempre il file allegato!&lt;br /&gt;E se trovate qualche errore fatemelo notare così correggo ^__^&lt;br /&gt;&lt;br /&gt;&lt;a style="color: rgb(51, 204, 0);" href="http://odino87.interfree.it/XNA/XNA-tut7.rar"&gt;&lt;span style="font-weight: bold;"&gt;XNA-tut7.rar&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Argomenti trattati:&lt;br /&gt;&gt; Collisioni con BoundingSphere&lt;br /&gt;&lt;br /&gt;Se leggete o scaricate i sorgenti lasciate un commento plz, almeno mi rendo conto di come vanno le cose ^^&lt;br /&gt;&lt;br /&gt;Alla prossima!&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-4445334460567925505?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/4445334460567925505/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=4445334460567925505' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/4445334460567925505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/4445334460567925505'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2009/10/xna-way-tutorial-7-collisioni-con.html' title='The Xna-Way: Tutorial 7: Collisioni con BoundingSphere'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3178/4013273621_bccbff698f_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-8844493770404294430</id><published>2009-09-11T10:00:00.000+02:00</published><updated>2009-09-11T10:00:01.501+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='The Xna-Way'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Guida XNA'/><title type='text'>The Xna-Way: Tutorial 6: Orientare oggetto nella direzione in cui si muove e telecamera che lo insegue</title><content type='html'>Questa volta il compito che mi sono proposto è stato un po' più difficile:&lt;br /&gt;avendo creato un decente MeteorManager questa volta volevo muovermi attraverso questo fitto campo di meteoriti con una navicella spaziale.&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;Sono partito col pensare a ciò:&lt;br /&gt;- per ora non mi interessa calcolare le collisioni con i meteoriti&lt;br /&gt;- la telecamera sarà in 3° persona, quindi ci troveremo alle spalle della nostra astronave (altrimenti avevamo già la telecamera in prima persona per muoverci)&lt;br /&gt;- la telecamera dovrà seguire il nostro vascello spaziale&lt;br /&gt;- dovremo far muovere nello spazio il nostro mezzo di trasporto&lt;br /&gt;&lt;br /&gt;tutto questo ci porta a dover modificare la nostra telecamera per implementare "l'inseguimento" della nostra astronave. Avremo quella che chiamo Follow Camera.&lt;br /&gt;Anche per il nostro vascello avremo il nostro bel da fare: non dovremmo solo farlo muovere e ruotare nel mondo 3D, ma dovremo farlo muovere nella direzione in cui "guarda", quindi movimenti e rotazioni dovranno essere fatti in modo particolare lavorando sulle direzioni, cosa un po' complicata e astrusa ma fattibile.&lt;br /&gt;&lt;br /&gt;Per prima cosa è meglio fare la modifica alla classe Camera in modo da implementare l'inseguimento di un determinato bersaglio. In questo modo quando poi andremo a far muovere il nostro oggetto nello spazio la telecamera gli starà dietro e noi non avremo problemi ad osservarlo ^_^&lt;br /&gt;&lt;br /&gt;Preso il progetto dell'ultimo post, andiamo nella classe Camesa.cs e sotto il metodo UpdateFreeCamera() andiamo a mettere il seguente metodo:&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; updateFollowCamera(GameTime gameTime)&lt;br /&gt;       {&lt;br /&gt;           &lt;span class="kwrd"&gt;float&lt;/span&gt; delta = (&lt;span class="kwrd"&gt;float&lt;/span&gt;)gameTime.ElapsedGameTime.TotalSeconds;&lt;br /&gt;           &lt;span class="rem"&gt;//creo la matrice temporanea&lt;/span&gt;&lt;br /&gt;           Matrix tmp = Matrix.Identity;&lt;br /&gt;           &lt;span class="rem"&gt;//imposto la direzione di osservazione, la direzione dell'alto e la direzione della destra&lt;/span&gt;&lt;br /&gt;           tmp.Forward = direction;&lt;br /&gt;           tmp.Up = up;&lt;br /&gt;           tmp.Right = Vector3.Cross(up, direction); &lt;span class="rem"&gt;//questa è calcolata come prodotto tra due vettori&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;           Vector3 t;&lt;br /&gt;           &lt;span class="rem"&gt;//trasformo la distanza (offset) dal punto di osservazione con la matrice calcolata&lt;/span&gt;&lt;br /&gt;           Vector3.Transform(&lt;span class="kwrd"&gt;ref&lt;/span&gt; offset, &lt;span class="kwrd"&gt;ref&lt;/span&gt; tmp, &lt;span class="kwrd"&gt;out&lt;/span&gt; t);&lt;br /&gt;&lt;br /&gt;           Vector3 positionTmp;&lt;br /&gt;           &lt;span class="rem"&gt;//calcolo la posizione che vogliamo far avere alla nostra telecamera sommando al punto che siamo osservando&lt;/span&gt;&lt;br /&gt;           &lt;span class="rem"&gt;//la posizione trasformata lungo la matrice&lt;/span&gt;&lt;br /&gt;           Vector3.Add(&lt;span class="kwrd"&gt;ref&lt;/span&gt; target, &lt;span class="kwrd"&gt;ref&lt;/span&gt; t, &lt;span class="kwrd"&gt;out&lt;/span&gt; positionTmp);&lt;br /&gt;           &lt;span class="rem"&gt;//aggiorno la posizione finale&lt;/span&gt;&lt;br /&gt;           position = positionTmp;&lt;br /&gt;       }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Per non avere errori dovremo aggiungere le seguenti variabili di classe:&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;       &lt;span class="rem"&gt;//variabili per l'inseguimento del target&lt;/span&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;protected&lt;/span&gt; Vector3 offset = Vector3.Zero;&lt;br /&gt;       &lt;span class="kwrd"&gt;protected&lt;/span&gt; Vector3 direction = Vector3.Forward&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Cosa fa il metodo?&lt;br /&gt;Il metodo crea una matrice identità e ne imposta i valori per le direzioni che rappresentano il davanti, l'alto e la destra.&lt;br /&gt;Direction e up da dove vengono? Sono dati e assegnati tramite l'oggetto che vogliamo inseguire: cioè direction rappresenta la direzione in cui si sta muoveno il nostro oggetto, mentre up è la direzione che il nostro bersaglio considera come l'alto. In questo modo potremmo mantenere costati le rotazioni!&lt;br /&gt;La destra viene calcolata come prodotto tra i due vettori.&lt;br /&gt;&lt;br /&gt;Dopo trasformo l'offest usando la matrice, e sommo questo offest alla posizione del punto osservato e assegno il risultato alla posizione.&lt;br /&gt;&lt;br /&gt;Quello che manca da fare ora è la classe per gestire la nostra navicella spaziale.&lt;br /&gt;Ecco il file Ship.cs, comunque presente nell'archivio allegato:&lt;br /&gt;&lt;a href="javascript:toggle();" id="displayText"&gt;Ship.cs Show/Hide&lt;/a&gt;&lt;br /&gt;&lt;div id="toggleText" style="display: none;"&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Ship : Microsoft.Xna.Framework.GameComponent&lt;br /&gt;   {&lt;br /&gt;       Model myModel;&lt;br /&gt;       Matrix world;&lt;br /&gt;       InputI inputDevice;&lt;br /&gt;       CameraI myCamera;&lt;br /&gt;&lt;br /&gt;       &lt;span class="rem"&gt;//Dati per il rendering&lt;/span&gt;&lt;br /&gt;       Texture2D text;   &lt;br /&gt;&lt;br /&gt;       Effect currentEffect = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; Effect CurrentEffect&lt;br /&gt;       {&lt;br /&gt;           get { &lt;span class="kwrd"&gt;return&lt;/span&gt; currentEffect; }&lt;br /&gt;           set { currentEffect = &lt;span class="kwrd"&gt;value&lt;/span&gt;; }&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       &lt;span class="rem"&gt;//Dati per le trasformazioni&lt;/span&gt;&lt;br /&gt;       Vector3 position = Vector3.Zero;&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; Vector3 Position&lt;br /&gt;       {&lt;br /&gt;           get { &lt;span class="kwrd"&gt;return&lt;/span&gt; position; }&lt;br /&gt;           set { position = &lt;span class="kwrd"&gt;value&lt;/span&gt;; }&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;float&lt;/span&gt; scale = 1.0f;&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;float&lt;/span&gt; Scale&lt;br /&gt;       {&lt;br /&gt;           get { &lt;span class="kwrd"&gt;return&lt;/span&gt; scale; }&lt;br /&gt;           set { scale = &lt;span class="kwrd"&gt;value&lt;/span&gt;; }&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       &lt;span class="rem"&gt;//Dati per l'orientamento verso la direzione di movimento&lt;/span&gt;&lt;br /&gt;       Vector3 destra = Vector3.Right;&lt;br /&gt;       Vector3 up = Vector3.Up;&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; Vector3 Up&lt;br /&gt;       { get { &lt;span class="kwrd"&gt;return&lt;/span&gt; up; } }&lt;br /&gt;&lt;br /&gt;       Vector3 direction = Vector3.Forward;&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; Vector3 Direction&lt;br /&gt;       { get { &lt;span class="kwrd"&gt;return&lt;/span&gt; direction; } }&lt;br /&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;float&lt;/span&gt; pitch, yaw;&lt;br /&gt;       &lt;span class="kwrd"&gt;float&lt;/span&gt; val;&lt;br /&gt;       Vector3 velocità;&lt;br /&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; Ship(Game game, &lt;span class="kwrd"&gt;string&lt;/span&gt; myModel, &lt;span class="kwrd"&gt;string&lt;/span&gt; texture, Effect effect)&lt;br /&gt;           : &lt;span class="kwrd"&gt;base&lt;/span&gt;(game)&lt;br /&gt;       {&lt;br /&gt;           &lt;span class="kwrd"&gt;this&lt;/span&gt;.myModel = Game.Content.Load&amp;lt;Model&amp;gt;(myModel);&lt;br /&gt;           &lt;span class="kwrd"&gt;this&lt;/span&gt;.text = Game.Content.Load&amp;lt;Texture2D&amp;gt;(texture);&lt;br /&gt;           myCamera = (CameraI)game.Services.GetService(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(CameraI));&lt;br /&gt;           inputDevice = (InputI)game.Services.GetService(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(InputI));&lt;br /&gt;           currentEffect = effect;&lt;br /&gt;&lt;br /&gt;           &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (ModelMesh mesh &lt;span class="kwrd"&gt;in&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.myModel.Meshes)&lt;br /&gt;               &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (ModelMeshPart mp &lt;span class="kwrd"&gt;in&lt;/span&gt; mesh.MeshParts)&lt;br /&gt;                   mp.Effect = currentEffect;&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Initialize()&lt;br /&gt;       {&lt;br /&gt;           &lt;span class="kwrd"&gt;base&lt;/span&gt;.Initialize();&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Update(GameTime gameTime)&lt;br /&gt;       {&lt;br /&gt;           &lt;span class="kwrd"&gt;float&lt;/span&gt; elaps = (&lt;span class="kwrd"&gt;float&lt;/span&gt;)gameTime.ElapsedRealTime.TotalSeconds;&lt;br /&gt;           yaw = 0;&lt;br /&gt;           pitch = 0;&lt;br /&gt;           val = 0;&lt;br /&gt;           &lt;span class="kwrd"&gt;if&lt;/span&gt; (inputDevice.actualKeyboardState.IsKeyDown(Keys.Space))&lt;br /&gt;               val = 1.0f;&lt;br /&gt;           &lt;span class="kwrd"&gt;if&lt;/span&gt; (inputDevice.actualKeyboardState.IsKeyDown(Keys.Right))&lt;br /&gt;               yaw -= 3f * elaps;&lt;br /&gt;           &lt;span class="kwrd"&gt;if&lt;/span&gt; (inputDevice.actualKeyboardState.IsKeyDown(Keys.Left))&lt;br /&gt;               yaw += 3f * elaps;&lt;br /&gt;           &lt;span class="kwrd"&gt;if&lt;/span&gt; (inputDevice.actualKeyboardState.IsKeyDown(Keys.Up))&lt;br /&gt;               pitch -= 3f * elaps;&lt;br /&gt;           &lt;span class="kwrd"&gt;if&lt;/span&gt; (inputDevice.actualKeyboardState.IsKeyDown(Keys.Down))&lt;br /&gt;               pitch += 3f * elaps;&lt;br /&gt;           &lt;span class="kwrd"&gt;if&lt;/span&gt; (inputDevice.actualKeyboardState.IsKeyDown(Keys.R))&lt;br /&gt;           {&lt;br /&gt;               yaw = 0.0f;&lt;br /&gt;               pitch = 0.0f;&lt;br /&gt;               direction = Vector3.Forward;&lt;br /&gt;               up = Vector3.Up;&lt;br /&gt;               destra = Vector3.Right;&lt;br /&gt;               position = Vector3.Zero;&lt;br /&gt;           }&lt;br /&gt;&lt;br /&gt;           &lt;span class="rem"&gt;//se l'astronave a testa in giù devo invertire il valore di yaw&lt;/span&gt;&lt;br /&gt;           &lt;span class="kwrd"&gt;if&lt;/span&gt; (up.Y &amp;lt; 0)&lt;br /&gt;               yaw = -yaw;&lt;br /&gt;&lt;br /&gt;           &lt;span class="rem"&gt;//calcolo la matrice di rotazione data dagli angoli yaw e pitch&lt;/span&gt;&lt;br /&gt;           Matrix rotationMatrix = Matrix.CreateFromAxisAngle(destra, pitch) *&lt;br /&gt;               Matrix.CreateRotationY(yaw);&lt;br /&gt;&lt;br /&gt;           &lt;span class="rem"&gt;//trasformo la direzione e l'alto con la matrice calcolata&lt;/span&gt;&lt;br /&gt;           Vector3.TransformNormal(&lt;span class="kwrd"&gt;ref&lt;/span&gt; direction, &lt;span class="kwrd"&gt;ref&lt;/span&gt; rotationMatrix, &lt;span class="kwrd"&gt;out&lt;/span&gt; direction);&lt;br /&gt;           Vector3.TransformNormal(&lt;span class="kwrd"&gt;ref&lt;/span&gt; up, &lt;span class="kwrd"&gt;ref&lt;/span&gt; rotationMatrix, &lt;span class="kwrd"&gt;out&lt;/span&gt; up);&lt;br /&gt;&lt;br /&gt;           &lt;span class="rem"&gt;//normalizzo&lt;/span&gt;&lt;br /&gt;           direction.Normalize();&lt;br /&gt;           up.Normalize();&lt;br /&gt;&lt;br /&gt;           &lt;span class="rem"&gt;//calcolo i vettori destra e up come prodotto tra vettori&lt;/span&gt;&lt;br /&gt;           Vector3.Cross(&lt;span class="kwrd"&gt;ref&lt;/span&gt; direction, &lt;span class="kwrd"&gt;ref&lt;/span&gt; up, &lt;span class="kwrd"&gt;out&lt;/span&gt; destra);&lt;br /&gt;           Vector3.Cross(&lt;span class="kwrd"&gt;ref&lt;/span&gt; destra, &lt;span class="kwrd"&gt;ref&lt;/span&gt; direction, &lt;span class="kwrd"&gt;out&lt;/span&gt; up);&lt;br /&gt;&lt;br /&gt;           &lt;span class="rem"&gt;//calcolo la forza, l'accellerazione e la velocità&lt;/span&gt;&lt;br /&gt;           Vector3 forza = direction * val * 2400000;&lt;br /&gt;           Vector3 accellerazione = forza / 2 ;&lt;br /&gt;           velocità = accellerazione * elaps;&lt;br /&gt;           &lt;span class="rem"&gt;/*&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;            //ricorda di diminuire il fatto moltiplicativo nel cacolo della forza&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;            velocità += accellerazione * elaps;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;            //per farlo fermare nel caso si usasse il secondo metodo&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;            velocità *= 0.97f;*/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;           position += velocità * elaps;&lt;br /&gt;&lt;br /&gt;           &lt;span class="rem"&gt;//----------------------------------&lt;/span&gt;&lt;br /&gt;           world = Matrix.Identity;&lt;br /&gt;&lt;br /&gt;           world.Forward = direction;&lt;br /&gt;           world.Up = up;&lt;br /&gt;           world.Right = destra;&lt;br /&gt;&lt;br /&gt;           world *= Matrix.CreateScale(scale);&lt;br /&gt;           world *= Matrix.CreateTranslation(position);&lt;br /&gt;          &lt;br /&gt;           &lt;span class="kwrd"&gt;base&lt;/span&gt;.Update(gameTime);&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Draw(GameTime gameTime)&lt;br /&gt;       {&lt;br /&gt;           currentEffect.Parameters[&lt;span class="str"&gt;"Color"&lt;/span&gt;].SetValue(Color.White.ToVector4());&lt;br /&gt;           currentEffect.Parameters[&lt;span class="str"&gt;"Projection"&lt;/span&gt;].SetValue(myCamera.Projection);&lt;br /&gt;           currentEffect.Parameters[&lt;span class="str"&gt;"View"&lt;/span&gt;].SetValue(myCamera.View);&lt;br /&gt;           currentEffect.Parameters[&lt;span class="str"&gt;"ColorMap"&lt;/span&gt;].SetValue(text);&lt;br /&gt;           currentEffect.Parameters[&lt;span class="str"&gt;"World"&lt;/span&gt;].SetValue(world);&lt;br /&gt;           &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (ModelMesh mesh &lt;span class="kwrd"&gt;in&lt;/span&gt; myModel.Meshes)&lt;br /&gt;               mesh.Draw();&lt;br /&gt;       }&lt;br /&gt;   }&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Il file va inserito nel progetto Meteor e non nella libreria, dato che, come il MeteorManager, questo oggetto è specifico per questa applicazione.&lt;br /&gt;&lt;br /&gt;Il pezzo saliente è il metodo &lt;span style="font-weight: bold;"&gt;Update&lt;/span&gt;, il resto è roba già vista!&lt;br /&gt;Cosa fa questo benedetto metodo?&lt;br /&gt;Prima di tutto riazzera il valore della rotazione per yaw e pitch, e anche val.&lt;br /&gt;Val indica se la barra spaziatrice è premuta o meno, e quindi se dobbiamo muoverci o no.&lt;br /&gt;Con la pressione delle frecce direzionali imposto i valori per le rotazioni, e con R riporto il tutto allo stato iniziale.&lt;br /&gt;&lt;br /&gt;Con&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (up.Y &amp;lt; 0)&lt;br /&gt;    yaw = -yaw;&lt;/pre&gt;&lt;br /&gt;faccio in modo che se mi trovo a testa in giù e premo verso destra, continuo a girare ancora verso destra non verso sinitra.&lt;br /&gt;&lt;br /&gt;Dopo di chè calcolola matrice di rotazione (nota: l'angolo per pitch è calcolato passando l'asse di rotazione), e uso tale matrice per trasformare la direzione e l'up.&lt;br /&gt;&lt;br /&gt;Ho poi il calcolo della forza applicata all'oggeto.&lt;br /&gt;Sono formule fisiche. Forza = massa * accellerazione.&lt;br /&gt;So che la formula per calcolare la velocità è sbagliata (anche se quella giusta è riportata come commentata). Ma ora come ora non mi interessa la correttezza delle fisica.&lt;br /&gt;&lt;br /&gt;Alla fine poi ho la creazione della world matrix per la nostra navicella, fatta in modo molto simile a come abbiamo costruito quella per la telecamera.&lt;br /&gt;&lt;br /&gt;Cosa manca da fare per far funzionare il tutto?&lt;br /&gt;Aggiungere il file per il modello 3D e la texture al progetto, creare la nostra astronave, aggiungerla ai components e disegnarla.&lt;br /&gt;Poi dobbiamo modificare leggermente le impostazioni della telecamera.&lt;br /&gt;&lt;br /&gt;Cominciamo: nel costruttore di Game1.cs modifichiamo il codice per la telecamera come segue&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;           myCamera = &lt;span class="kwrd"&gt;new&lt;/span&gt; Camera(&lt;span class="kwrd"&gt;this&lt;/span&gt;);&lt;br /&gt;           myCamera.FarPlane = 100000;&lt;br /&gt;           myCamera.Offset = &lt;span class="kwrd"&gt;new&lt;/span&gt; Vector3(0, 100, 500);&lt;br /&gt;           myCamera.Mode = CameraMode.Follow;&lt;br /&gt;           Components.Add(myCamera);&lt;/pre&gt;&lt;br /&gt;Impostiamo la distanza dal punto di osservazione e cambiamo il tipo di telecamera.&lt;br /&gt;&lt;br /&gt;Nel metodo LoadContent() aggiungiamo questo:&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;           myShip = &lt;span class="kwrd"&gt;new&lt;/span&gt; Ship(&lt;span class="kwrd"&gt;this&lt;/span&gt;, &lt;span class="str"&gt;@"Models\p2_wedge"&lt;/span&gt;, &lt;span class="str"&gt;@"Textures\wedge_p2_diff_v1"&lt;/span&gt;, defaultEffect);&lt;br /&gt;           myShip.Scale = 0.1f;&lt;br /&gt;           Components.Add(myShip);&lt;/pre&gt;&lt;br /&gt;Dove myShip è l'oggetto per la nostra astronave, che dobbiamo aver definito nella classe. Lo scalo ad un fattore 0.1 perchè altrimenti sarebbe troppo grande.&lt;br /&gt;&lt;br /&gt;Nel metodo Draw dopo il render per il meteorManager aggiungiamo questo:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;myShip.Draw(gameTime);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;E nel metodo Update questo:&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;           &lt;span class="kwrd"&gt;if&lt;/span&gt; (myCamera.Mode == CameraMode.Follow)&lt;br /&gt;           {&lt;br /&gt;               myCamera.Target = myShip.Position;&lt;br /&gt;               myCamera.Up = myShip.Up;&lt;br /&gt;               myCamera.Direction = myShip.Direction;&lt;br /&gt;           }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In modo che se la telecamera è di tipo follow, si aggiorna il suo target alla posizione della nostra navicella (ma potrebbe essere benissimo qualsiasi cosa!), e settiamo up e direction con i valori provenienti dal nostro oggetto myShip.&lt;br /&gt;&lt;br /&gt;Dovrebbe essere tutto! :D&lt;br /&gt;Se qualcosa non va c'è sempre il file allegato!&lt;br /&gt;E se trovate qualche errore fatemelo notare così correggo ^__^&lt;br /&gt;&lt;br /&gt;&lt;a style="color: rgb(51, 204, 0);" href="http://odino87.interfree.it/XNA/XNA-tut6.rar"&gt;&lt;span style="font-weight: bold;"&gt;XNA-tut6.rar&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Argomenti trattati:&lt;br /&gt;&gt; muovere un oggetto lungo la direzione che sta osservando&lt;br /&gt;&gt; telecamera che insegue il nostro oggetto&lt;br /&gt;&lt;br /&gt;Alla prossima!&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-8844493770404294430?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/8844493770404294430/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=8844493770404294430' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/8844493770404294430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/8844493770404294430'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2009/09/xna-way-tutorial-6-orientare-oggetto.html' title='The Xna-Way: Tutorial 6: Orientare oggetto nella direzione in cui si muove e telecamera che lo insegue'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-3430585456233994805</id><published>2009-09-09T15:00:00.000+02:00</published><updated>2009-09-10T14:10:54.093+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='The Xna-Way'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Guida XNA'/><title type='text'>The Xna-Way: Tutorial 5: Meteor Manager &amp; Free Camera</title><content type='html'>Eccomi dopo un po' di tempo con un altro post sull'XNA e un suo utilizzo.&lt;br /&gt;&lt;br /&gt;Questa volta mi sono detto: "voglio avere una scena con tanti, ma tanti oggetti!"&lt;br /&gt;Ah, quando il masochismo non ha limiti...&lt;br /&gt;Qualcosa ho comunque fatto, anche se non è proprio un granchè...&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;Quello che mi è venuto in mente, in modo da poterlo poi riusare anche in futuro per una qualche demo simile ad un Asteroid, è di avere un gestore di meteoriti!&lt;br /&gt;Cioè questo gestore ci deve la possibilità di renderizzare a schermo tanti meteoriti.&lt;br /&gt;E vogliamo pure dare la possibilità di muoversi in questo mondo no?&lt;br /&gt;Quindi dovremo fare delle modifiche alla telecamera, in modo che ci pemetta di spostarci in questo universo popolato unicamente da meteoriti!&lt;br /&gt;&lt;br /&gt;Allora per il metorManager creremo un file in un progetto per un gameWindows a se stante, mentre il file della della telecamera che andremo a modifcare è sempre quello della myLibrary.&lt;br /&gt;&lt;br /&gt;Prima di tutto vediamo come strutturare questo fantomatico &lt;span style="font-style: italic;"&gt;MeteorManager&lt;/span&gt;. Io l'ho pensato in questo modo:&lt;br /&gt;-il mondo sarà visto come un cubo, dove all'interno potremo mettere i nostri meteoriti&lt;br /&gt;-il mondo sarà diviso in celle: ad ogni cella sarà assegnata una sezione del mondo, e dentro ogni sezione ci sarà la lista degli elementi che sono contenuti dentro tale sezione&lt;br /&gt;&lt;br /&gt;Perchè le sezioni? Perchè se ho un mondo molto grande potrei dover renderizzare tanti troppi elementi a schermo, e questo rallenterebbe di molto il numero di frame per secondo. Dividendo in sezioni il mondo potremmo decidere di renderizzare solo quelle adiacenti a noi.&lt;br /&gt;Inoltre se poi in futuro dovremmo calcolare la collisione di una fantomatica astronave con un meteorite, invece di controllare le collisioni con tutti i meteoriti della scena (cosa veramente masochistica, che poterebbe via tantissimo tempo) potremmo semplicemente farlo con quelli adiacetni alla sezione in cui ci troviamo.&lt;br /&gt;Pensante a quanto tempo occorre scorrere un cubo in cui ogni lato è diviso in 20 sezioni!&lt;br /&gt;Cioè ci sono 20*20*20 sezioni da controllare! Ognuna con più elementi!&lt;br /&gt;&lt;br /&gt;Avendo suddiviso un mondo cubico in sezioni ho deciso di usare un vettore a 3 dimensioni per gestire il gameWorld.&lt;br /&gt;&lt;a href="javascript:toggle();" id="displayText"&gt;MeteorManager.cs Show/Hide&lt;/a&gt;&lt;br /&gt;&lt;div id="toggleText" style="display: none;"&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;struct&lt;/span&gt; Trasformation&lt;br /&gt;   {&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; Vector3 position;&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;float&lt;/span&gt; angleX, angleY, angleZ;&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;float&lt;/span&gt; scale;&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; Matrix world;&lt;br /&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Update()&lt;br /&gt;       {&lt;br /&gt;           world = Matrix.CreateScale(scale) * Matrix.CreateFromYawPitchRoll(angleY, angleX, angleZ) *&lt;br /&gt;               Matrix.CreateTranslation(position);&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;struct&lt;/span&gt; Sezione&lt;br /&gt;   {&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; Vector2 xRange, yRange, zRange;&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; List&amp;lt;Trasformation&amp;gt; myList;&lt;br /&gt;   }&lt;br /&gt;   &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span class="rem"&gt;/// This is a game component that implements IUpdateable.&lt;/span&gt;&lt;br /&gt;   &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; MeteorManager : Microsoft.Xna.Framework.GameComponent&lt;br /&gt;   {&lt;br /&gt;       CameraI myCamera;&lt;br /&gt;       InputI inputDevice;&lt;br /&gt;       Model myModel;&lt;br /&gt;       Texture2D text;&lt;br /&gt;&lt;br /&gt;       Sezione[, ,] gameWorld;&lt;br /&gt;&lt;br /&gt;       &lt;span class="rem"&gt;//servono per dire in quale riga, colonna e profondità si trova la telecamera&lt;/span&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;int&lt;/span&gt; cameraR, cameraC, cameraP;&lt;br /&gt;      &lt;br /&gt;       Effect currentEffect = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; Effect CurrentEffect&lt;br /&gt;       {&lt;br /&gt;           get { &lt;span class="kwrd"&gt;return&lt;/span&gt; currentEffect; }&lt;br /&gt;           set { currentEffect = &lt;span class="kwrd"&gt;value&lt;/span&gt;; }&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       &lt;span class="rem"&gt;//variabili per la dimensione del mondo&lt;/span&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;float&lt;/span&gt; xRange, yRange, zRange;&lt;br /&gt;&lt;br /&gt;       &lt;span class="rem"&gt;//numero di celle per ogni dimensione&lt;/span&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;int&lt;/span&gt; cells = 20;&lt;br /&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; MeteorManager(Game game, Effect effect, &lt;span class="kwrd"&gt;int&lt;/span&gt; num, &lt;span class="kwrd"&gt;float&lt;/span&gt; xRange, &lt;span class="kwrd"&gt;float&lt;/span&gt; yRange, &lt;span class="kwrd"&gt;float&lt;/span&gt; zRange,&lt;br /&gt;           &lt;span class="kwrd"&gt;string&lt;/span&gt; myModel, &lt;span class="kwrd"&gt;string&lt;/span&gt; texture)&lt;br /&gt;           : &lt;span class="kwrd"&gt;base&lt;/span&gt;(game)&lt;br /&gt;       {&lt;br /&gt;           &lt;span class="kwrd"&gt;this&lt;/span&gt;.currentEffect = effect; &lt;span class="rem"&gt;//assegno l'effetto usato per il rendering&lt;/span&gt;&lt;br /&gt;           &lt;span class="kwrd"&gt;this&lt;/span&gt;.myModel = Game.Content.Load&amp;lt;Model&amp;gt;(myModel); &lt;span class="rem"&gt;//carico il modello&lt;/span&gt;&lt;br /&gt;           &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (ModelMesh mesh &lt;span class="kwrd"&gt;in&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.myModel.Meshes)&lt;br /&gt;               &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (ModelMeshPart mp &lt;span class="kwrd"&gt;in&lt;/span&gt; mesh.MeshParts)&lt;br /&gt;                   mp.Effect = effect; &lt;span class="rem"&gt;//assegno l'effetto ad ogni parte del modello&lt;/span&gt;&lt;br /&gt;           &lt;span class="kwrd"&gt;this&lt;/span&gt;.text = Game.Content.Load&amp;lt;Texture2D&amp;gt;(texture);&lt;span class="rem"&gt;//carico la texture che voglio usare&lt;/span&gt;&lt;br /&gt;           &lt;span class="rem"&gt;//assegno le variabili per la dimensione del mondo&lt;/span&gt;&lt;br /&gt;           &lt;span class="kwrd"&gt;this&lt;/span&gt;.xRange = xRange;&lt;br /&gt;           &lt;span class="kwrd"&gt;this&lt;/span&gt;.yRange = yRange;&lt;br /&gt;           &lt;span class="kwrd"&gt;this&lt;/span&gt;.zRange = zRange;&lt;br /&gt;           myCamera = (CameraI)game.Services.GetService(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(CameraI)); &lt;span class="rem"&gt;//recupero il servizio per la telecamera&lt;/span&gt;&lt;br /&gt;           inputDevice = (InputI)game.Services.GetService(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(InputI));&lt;span class="rem"&gt;//e quello per l'input&lt;/span&gt;&lt;br /&gt;           gameWorld = &lt;span class="kwrd"&gt;new&lt;/span&gt; Sezione[cells, cells, cells];&lt;span class="rem"&gt;//creo la matrice del mondo&lt;/span&gt;&lt;br /&gt;           makeWorld(num); &lt;span class="rem"&gt;//vado a creare i mondo&lt;/span&gt;&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; makeWorld(&lt;span class="kwrd"&gt;int&lt;/span&gt; num)&lt;br /&gt;       {&lt;br /&gt;           &lt;span class="rem"&gt;//calcolo quando spazio deve coprire ogni cella&lt;/span&gt;&lt;br /&gt;           &lt;span class="kwrd"&gt;float&lt;/span&gt; ix = xRange + xRange;&lt;br /&gt;           ix /= cells;&lt;br /&gt;           &lt;span class="kwrd"&gt;float&lt;/span&gt; iy = yRange + yRange;&lt;br /&gt;           iy /= cells;&lt;br /&gt;           &lt;span class="kwrd"&gt;float&lt;/span&gt; iz = zRange + zRange;&lt;br /&gt;           iz /= cells;&lt;br /&gt;           Random rand = &lt;span class="kwrd"&gt;new&lt;/span&gt; Random();&lt;br /&gt;           &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; cells; i++)&lt;br /&gt;           {&lt;br /&gt;               &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; j = 0; j &amp;lt; cells; j++)&lt;br /&gt;               {&lt;br /&gt;                   &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; k = 0; k &amp;lt; cells; k++)&lt;br /&gt;                   {&lt;br /&gt;                       &lt;span class="rem"&gt;//per ogni cella vado a inserire quale zona del mondo copre&lt;/span&gt;&lt;br /&gt;                       gameWorld[i, j, k].xRange = &lt;span class="kwrd"&gt;new&lt;/span&gt; Vector2(i * ix - xRange, (i + 1) * ix - xRange);&lt;br /&gt;                       gameWorld[i, j, k].yRange = &lt;span class="kwrd"&gt;new&lt;/span&gt; Vector2(j * iy - yRange, (j + 1) * iy - yRange);&lt;br /&gt;                       gameWorld[i, j, k].zRange = &lt;span class="kwrd"&gt;new&lt;/span&gt; Vector2(k * iz - zRange, (k + 1) * iz - zRange);&lt;br /&gt;                       &lt;span class="rem"&gt;//vado a creare la lista per la posizione dei meteoriti contenuti nella lista&lt;/span&gt;&lt;br /&gt;                       gameWorld[i, j, k].myList = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;Trasformation&amp;gt;();&lt;br /&gt;                       &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; a = 0; a &amp;lt; num; a++)&lt;br /&gt;                       {&lt;br /&gt;                           Trasformation t = &lt;span class="kwrd"&gt;new&lt;/span&gt; Trasformation();&lt;br /&gt;                           &lt;span class="rem"&gt;//creo la posizione all'interno della zona associata&lt;/span&gt;&lt;br /&gt;                           t.position.X = rand.Next((&lt;span class="kwrd"&gt;int&lt;/span&gt;)gameWorld[i, j, k].xRange.X, (&lt;span class="kwrd"&gt;int&lt;/span&gt;)gameWorld[i, j, k].xRange.Y);&lt;br /&gt;                           t.position.Y = rand.Next((&lt;span class="kwrd"&gt;int&lt;/span&gt;)gameWorld[i, j, k].yRange.X, (&lt;span class="kwrd"&gt;int&lt;/span&gt;)gameWorld[i, j, k].yRange.Y);&lt;br /&gt;                           t.position.Z = rand.Next((&lt;span class="kwrd"&gt;int&lt;/span&gt;)gameWorld[i, j, k].zRange.X, (&lt;span class="kwrd"&gt;int&lt;/span&gt;)gameWorld[i, j, k].zRange.Y);&lt;br /&gt;                           &lt;span class="rem"&gt;//angolo casuale&lt;/span&gt;&lt;br /&gt;                           t.angleX = rand.Next(0, 360);&lt;br /&gt;                           t.angleY = rand.Next(0, 360);&lt;br /&gt;                           t.angleZ = rand.Next(0, 360);&lt;br /&gt;                           &lt;span class="rem"&gt;//scala = 1&lt;/span&gt;&lt;br /&gt;                           t.scale = 1;&lt;br /&gt;                           &lt;span class="rem"&gt;//creo la world matrix per quel particolare meteorite&lt;/span&gt;&lt;br /&gt;                           t.world = Matrix.CreateScale(t.scale) *&lt;br /&gt;                               Matrix.CreateFromYawPitchRoll(t.angleY, t.angleX, t.angleZ) *&lt;br /&gt;                               Matrix.CreateTranslation(t.position);&lt;br /&gt;                           gameWorld[i, j, k].myList.Add(t);&lt;br /&gt;                       }&lt;br /&gt;                   }&lt;br /&gt;               }&lt;br /&gt;           }&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Initialize()&lt;br /&gt;       {&lt;br /&gt;           &lt;span class="kwrd"&gt;base&lt;/span&gt;.Initialize();&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Update(GameTime gameTime)&lt;br /&gt;       {&lt;br /&gt;           checkCameraPosition();&lt;br /&gt;           &lt;span class="kwrd"&gt;base&lt;/span&gt;.Update(gameTime);&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Draw(GameTime gameTime)&lt;br /&gt;       {&lt;br /&gt;           currentEffect.Parameters[&lt;span class="str"&gt;"View"&lt;/span&gt;].SetValue(myCamera.View);&lt;br /&gt;           currentEffect.Parameters[&lt;span class="str"&gt;"Projection"&lt;/span&gt;].SetValue(myCamera.Projection);&lt;br /&gt;           currentEffect.Parameters[&lt;span class="str"&gt;"ColorMap"&lt;/span&gt;].SetValue(text);&lt;br /&gt;           currentEffect.Parameters[&lt;span class="str"&gt;"Color"&lt;/span&gt;].SetValue(Color.Green.ToVector4());&lt;br /&gt;           &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (ModelMesh mesh &lt;span class="kwrd"&gt;in&lt;/span&gt; myModel.Meshes)&lt;br /&gt;           {&lt;br /&gt;               BoundingSphere s = &lt;span class="kwrd"&gt;new&lt;/span&gt; BoundingSphere(mesh.BoundingSphere.Center, mesh.BoundingSphere.Radius);&lt;br /&gt;               &lt;span class="kwrd"&gt;float&lt;/span&gt; radius = s.Radius;&lt;br /&gt;               &lt;span class="kwrd"&gt;int&lt;/span&gt; val = 8;&lt;br /&gt;               &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = (cameraR - val); i &amp;lt;= &lt;span class="kwrd"&gt;this&lt;/span&gt;.cameraR + val; i++)&lt;br /&gt;               {&lt;br /&gt;                   &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; j = (&lt;span class="kwrd"&gt;this&lt;/span&gt;.cameraC - val); j &amp;lt;= &lt;span class="kwrd"&gt;this&lt;/span&gt;.cameraC + val; j++)&lt;br /&gt;                   {&lt;br /&gt;                       &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; k = (&lt;span class="kwrd"&gt;this&lt;/span&gt;.cameraP - val); k &amp;lt;= &lt;span class="kwrd"&gt;this&lt;/span&gt;.cameraP + val; k++)&lt;br /&gt;                       {&lt;br /&gt;                           &lt;span class="kwrd"&gt;int&lt;/span&gt; r = i % cells;&lt;br /&gt;                           &lt;span class="kwrd"&gt;int&lt;/span&gt; c = j % cells;&lt;br /&gt;                           &lt;span class="kwrd"&gt;int&lt;/span&gt; p = k % cells;&lt;br /&gt;                           &lt;span class="kwrd"&gt;if&lt;/span&gt;(r &amp;lt; 0)&lt;br /&gt;                               r = cells + r;&lt;br /&gt;                           &lt;span class="kwrd"&gt;if&lt;/span&gt;(c &amp;lt; 0)&lt;br /&gt;                               c = cells + c;&lt;br /&gt;                           &lt;span class="kwrd"&gt;if&lt;/span&gt;(p &amp;lt; 0)&lt;br /&gt;                               p = cells + p;&lt;br /&gt;                           &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (Trasformation tras &lt;span class="kwrd"&gt;in&lt;/span&gt; gameWorld[r % cells, c % cells, p % cells].myList)&lt;br /&gt;                           {&lt;br /&gt;                               s.Center = tras.position;&lt;br /&gt;                               s.Radius = radius * tras.scale;&lt;br /&gt;                              &lt;br /&gt;                               ContainmentType ris = myCamera.CameraBoundingFrustum.Contains(s);&lt;br /&gt;                               &lt;span class="rem"&gt;if (ris == ContainmentType.Contains || ris == ContainmentType.Intersects)&lt;/span&gt;&lt;br /&gt;                               {&lt;br /&gt;                                   currentEffect.Parameters[&lt;span class="str"&gt;"World"&lt;/span&gt;].SetValue(tras.world);&lt;br /&gt;                                   mesh.Draw();&lt;br /&gt;                               }&lt;br /&gt;                           }&lt;br /&gt;                       }&lt;br /&gt;                   }&lt;br /&gt;               }&lt;br /&gt;           }&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; checkCameraPosition()&lt;br /&gt;       {&lt;br /&gt;           &lt;span class="kwrd"&gt;float&lt;/span&gt; var = (xRange + xRange) / cells;&lt;br /&gt;           cameraR = (&lt;span class="kwrd"&gt;int&lt;/span&gt;)(myCamera.Position.X / var) + cells / 2;&lt;br /&gt;&lt;br /&gt;           var = (yRange + yRange) / cells;&lt;br /&gt;           cameraC = (&lt;span class="kwrd"&gt;int&lt;/span&gt;)(myCamera.Position.Y / var) + cells / 2; ;&lt;br /&gt;&lt;br /&gt;           var = (zRange + zRange) / cells;&lt;br /&gt;           cameraP = (&lt;span class="kwrd"&gt;int&lt;/span&gt;)(myCamera.Position.Z / var) + cells / 2; ;&lt;br /&gt;       }&lt;br /&gt;   }&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Diamo una spiegazione di quello che ho fatto nei vari punti!&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; MeteorManager(Game game, Effect effect, &lt;span class="kwrd"&gt;int&lt;/span&gt; num, &lt;span class="kwrd"&gt;float&lt;/span&gt; xRange, &lt;span class="kwrd"&gt;float&lt;/span&gt; yRange, &lt;span class="kwrd"&gt;float&lt;/span&gt; zRange,&lt;br /&gt;       &lt;span class="kwrd"&gt;string&lt;/span&gt; myModel, &lt;span class="kwrd"&gt;string&lt;/span&gt; texture)&lt;br /&gt;       : &lt;span class="kwrd"&gt;base&lt;/span&gt;(game)&lt;br /&gt;   {&lt;br /&gt;       &lt;span class="kwrd"&gt;this&lt;/span&gt;.currentEffect = effect; &lt;span class="rem"&gt;//assegno l'effetto usato per il rendering&lt;/span&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;this&lt;/span&gt;.myModel = Game.Content.Load&amp;lt;Model&amp;gt;(myModel); &lt;span class="rem"&gt;//carico il modello&lt;/span&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (ModelMesh mesh &lt;span class="kwrd"&gt;in&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.myModel.Meshes)&lt;br /&gt;           &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (ModelMeshPart mp &lt;span class="kwrd"&gt;in&lt;/span&gt; mesh.MeshParts)&lt;br /&gt;               mp.Effect = effect; &lt;span class="rem"&gt;//assegno l'effetto ad ogni parte del modello&lt;/span&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;this&lt;/span&gt;.text = Game.Content.Load&amp;lt;Texture2D&amp;gt;(texture);&lt;span class="rem"&gt;//carico la texture che voglio usare&lt;/span&gt;&lt;br /&gt;       &lt;span class="rem"&gt;//assegno le variabili per la dimensione del mondo&lt;/span&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;this&lt;/span&gt;.xRange = xRange;&lt;br /&gt;       &lt;span class="kwrd"&gt;this&lt;/span&gt;.yRange = yRange;&lt;br /&gt;       &lt;span class="kwrd"&gt;this&lt;/span&gt;.zRange = zRange;&lt;br /&gt;       myCamera = (CameraI)game.Services.GetService(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(CameraI)); &lt;span class="rem"&gt;//recupero il servizio per la telecamera&lt;/span&gt;&lt;br /&gt;       inputDevice = (InputI)game.Services.GetService(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(InputI));&lt;span class="rem"&gt;//e quello per l'input&lt;/span&gt;&lt;br /&gt;       gameWorld = &lt;span class="kwrd"&gt;new&lt;/span&gt; Sezione[cells, cells, cells];&lt;span class="rem"&gt;//creo la matrice del mondo&lt;/span&gt;&lt;br /&gt;       makeWorld(num); &lt;span class="rem"&gt;//vado a creare i mondo&lt;/span&gt;&lt;br /&gt;   }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Quello che fa il costruttore è questo:&lt;br /&gt;assegna al currentEffect l'effetto passato (gli effect sono usati per caricare e gestire codice HLSL, che serve per renderizzare gli elementi della scena, ottenere effetti particolari etc; in questo esempio ho usato un mio piccolo effect che non fa altro che prendere la texture ed applicarla all'oggetto da renderizzare, senza calcolare nessuna luce, questo perchè è più veloce e semplice del basic Effect standard, e qui voglio andare ad ottenere più FPS possibili. Il file è allegato nella soluzione, ma qui non darò spiegazione di come funziona).&lt;br /&gt;Poi carica il modello e la texture passate. Assegna il valore alle variabili che mi dicono quanto è grande il mondo.&lt;br /&gt;Si recupera poi i riferimenti ai servizi della telecamera e del gestore dell'input.&lt;br /&gt;GameWorld è la matrice cubica che andrà a contenere il mondo: ogni cella rappresenta una sezione, e ogni sezione avrò la sua lista di elementi.&lt;br /&gt;&lt;br /&gt;Il metodo makeWorld, per quanto possa disorientare, non fa altro che creare e posizionare in modo radom &lt;span style="font-weight: bold;"&gt;num &lt;/span&gt; elementi per ogni sezione. A voi il compito di guardarlo o di chiedere qualcosa che non vi è chiaro qui.&lt;br /&gt;&lt;br /&gt;Concentriamoci un attimo sul metodo &lt;span style="font-weight: bold;"&gt;checkCameraPosition &lt;/span&gt;invece, che è più curioso secondo me...&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; checkCameraPosition()&lt;br /&gt;   {&lt;br /&gt;       &lt;span class="kwrd"&gt;float&lt;/span&gt; var = (xRange + xRange) / cells;&lt;br /&gt;       cameraR = (&lt;span class="kwrd"&gt;int&lt;/span&gt;)(myCamera.Position.X / var) + cells / 2;&lt;br /&gt;&lt;br /&gt;       var = (yRange + yRange) / cells;&lt;br /&gt;       cameraC = (&lt;span class="kwrd"&gt;int&lt;/span&gt;)(myCamera.Position.Y / var) + cells / 2; ;&lt;br /&gt;&lt;br /&gt;       var = (zRange + zRange) / cells;&lt;br /&gt;       cameraP = (&lt;span class="kwrd"&gt;int&lt;/span&gt;)(myCamera.Position.Z / var) + cells / 2; ;&lt;br /&gt;   }&lt;/pre&gt;&lt;br /&gt;Questo metodo prende la posizione della telecamera e memorizza in 3 variabili l'indice di riga, colonna e profondità in cui si trova la telecamera.&lt;br /&gt;Come si fa ad otterere tale risultato?&lt;br /&gt;Prendo la variazione relativa ad ogni cella (cioè quanto spazio sulla dimensione X, per esempio, copre una cella). Poi prendo la posizione X della telecamera, la divido per questa variazione, e a tale risultato ci sommo la metà delle celle. La somma è necessaria perchè voglio che la posizione 0,0,0 sia il centro del mio mondo cubico!&lt;br /&gt;Se non facessi così sarei invece posizionato ad un vertice del mondo.&lt;br /&gt;&lt;br /&gt;Il metodo draw adesso, che non sto a riportare perchè è lungotto :O&lt;br /&gt;Allora: nelle prime righe si assegna all'effetto usato per il rendering i valori opportuni, quindi la viewMatrix della telecamera, la projectionMatrix della telecamera, la texture dell'oggetto, e un colore.&lt;br /&gt;Poi cominciamo a scorrere le mesh che compongono il nostro oggetto da renderizzare, in questo caso il nostro meteorite, che dovrà essere replicato tante volte.&lt;br /&gt;Si crea una nuova BoundingSphere con centro e raggio presi dalla BoundingSphere della mesh in esame.&lt;br /&gt;Le BoundingSphere sono usate per calcolare le collisioni tra volumi sferici, ma qui le userò per una cosa diversa ma molto utile ^__^&lt;br /&gt;&lt;br /&gt;Poi cominciamo a scorrere le celli adiacenti alla posizione in cui si trova la telecamera: più &lt;span style="font-style: italic;"&gt;val &lt;/span&gt;è grande maggiore è il numero di celle che considero adiacenti.&lt;br /&gt;Poi riassetto gli indici, in modo che non vadano fuori dai limiti consentiti.&lt;br /&gt;Scorro poi la lista di elementi della sezione data dagli indici r,c,p.&lt;br /&gt;Modifico il centro ed il raggio della BoundingSphere, e calcolo se la sfera o contenuta o interseca il BoundingFrustum della telecamera e solo se lo è renderizzo il meteorite.&lt;br /&gt;&lt;br /&gt;Perchè faccio ciò?&lt;br /&gt;Perchè anche se renderizziamo solo le celle vicine a noi, eseguo di solito il draw anche per oggetti che mi sono alle spalle e che io non vedo. Facendo questo sprecherei tempo in rendering inutili, che vengono calcolati, ma il cui risultato non è visualizzato a schermo.&lt;br /&gt;Il frustum della telecamera lo possiamo vedere come un cono che parte dal nostro punto di osservazione, o meglio un tronco di cono, che comincia alla distanza nearPlane e termina a farPlane.&lt;br /&gt;Dato che prima di giungere a questo risultato ho fatto diverse prove, se non usassi il boundingFrustum otterrei con val = 8 qualcosa come soli 5 FPS. Con invece riesco ad arrivare a 70 FPS più o meno stabili! Un buon risultato!&lt;br /&gt;Insomma quello che facciamo è controllare se il volume dato dalla boundingSphere adeguatamente settata è contenuto completamente o in parte nel cono visivo della telecamera, e solo se lo è renderizzo l'oggetto. E' molto più conveniente fare questo controllo che fare un rendering inutile!&lt;br /&gt;E poi perchè usare le BoundingSphere? Perchè è un metodo comodo, semplice ed economico per calcolare il volume di un oggetto, perchè calcolarne il volume esatto controllando i poligoni/vertici è troppo oneroso secondo me (e poi non lo so fare XD).&lt;br /&gt;&lt;br /&gt;E come lo calcolo il frustum?&lt;br /&gt;Per questo bisogna andare a modifcare la telecamera!&lt;br /&gt;Ecco il file della telecamera con tutte le modifiche apportate&lt;br /&gt;&lt;a href="javascript:toggle2();" id="displayText"&gt;Camera.cs Show/Hide&lt;/a&gt;&lt;br /&gt;&lt;div id="toggleText2" style="display: none;"&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;enum&lt;/span&gt; CameraMode&lt;br /&gt;   {&lt;br /&gt;       Fixed,&lt;br /&gt;       Free,&lt;br /&gt;       Rotate,&lt;br /&gt;       Follow       &lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; CameraI&lt;br /&gt;   {&lt;br /&gt;       Matrix View&lt;br /&gt;       { get; }&lt;br /&gt;&lt;br /&gt;       Matrix Projection&lt;br /&gt;       { get; }&lt;br /&gt;&lt;br /&gt;       Vector3 Position&lt;br /&gt;       { get; set; }&lt;br /&gt;&lt;br /&gt;       Vector3 Up&lt;br /&gt;       { get; set; }&lt;br /&gt;&lt;br /&gt;       Vector3 Target&lt;br /&gt;       { get; set; }&lt;br /&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;float&lt;/span&gt; NearPlane&lt;br /&gt;       { get; set; }&lt;br /&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;float&lt;/span&gt; FarPlane&lt;br /&gt;       { get; set; }&lt;br /&gt;&lt;br /&gt;       CameraMode Mode&lt;br /&gt;       { get; set; }&lt;br /&gt;&lt;br /&gt;       BoundingFrustum CameraBoundingFrustum&lt;br /&gt;       { get; }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Camera : Microsoft.Xna.Framework.GameComponent, CameraI&lt;br /&gt;   {&lt;br /&gt;       &lt;span class="rem"&gt;//riferimento al controllo dell'input&lt;/span&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;protected&lt;/span&gt; InputI inputDevice;&lt;br /&gt;       &lt;span class="rem"&gt;//varibili per la telecamera&lt;/span&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;protected&lt;/span&gt; Matrix projection;&lt;br /&gt;       &lt;span class="kwrd"&gt;protected&lt;/span&gt; Matrix view;&lt;br /&gt;       &lt;span class="kwrd"&gt;protected&lt;/span&gt; Vector3 position = Vector3.Zero;&lt;br /&gt;       &lt;span class="kwrd"&gt;protected&lt;/span&gt; Vector3 target = Vector3.Zero;&lt;br /&gt;       &lt;span class="kwrd"&gt;protected&lt;/span&gt; Vector3 up = Vector3.Up;&lt;br /&gt;       &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;float&lt;/span&gt; aspectRatio;&lt;br /&gt;       &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;float&lt;/span&gt; nearPlane;&lt;br /&gt;       &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;float&lt;/span&gt; farPlane;&lt;br /&gt;       &lt;span class="kwrd"&gt;protected&lt;/span&gt; BoundingFrustum cameraFrustum;&lt;br /&gt;       &lt;span class="rem"&gt;//varibili per lo spostamento e per la rotazione&lt;/span&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;float&lt;/span&gt; yaw, pitch;&lt;br /&gt;       &lt;span class="kwrd"&gt;protected&lt;/span&gt; Vector3 movimento;&lt;br /&gt;       &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;float&lt;/span&gt; rotationRate = 100.0f;&lt;br /&gt;       &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;float&lt;/span&gt; movementRate = 15000.0f;&lt;br /&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;protected&lt;/span&gt; CameraMode typeOfCamera = CameraMode.Fixed;&lt;br /&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; Camera(Game game)&lt;br /&gt;           : &lt;span class="kwrd"&gt;base&lt;/span&gt;(game)&lt;br /&gt;       {&lt;br /&gt;           inputDevice = (InputI)game.Services.GetService(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(InputI));&lt;br /&gt;           game.Services.AddService(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(CameraI), &lt;span class="kwrd"&gt;this&lt;/span&gt;);&lt;br /&gt;           typeOfCamera = CameraMode.Fixed;&lt;br /&gt;           nearPlane = 1.0f;&lt;br /&gt;           farPlane = 100000f;&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Initialize()&lt;br /&gt;       {&lt;br /&gt;           &lt;span class="kwrd"&gt;base&lt;/span&gt;.Initialize();&lt;br /&gt;&lt;br /&gt;           aspectRatio = (&lt;span class="kwrd"&gt;float&lt;/span&gt;)Game.GraphicsDevice.Viewport.Width /&lt;br /&gt;               (&lt;span class="kwrd"&gt;float&lt;/span&gt;)Game.GraphicsDevice.Viewport.Height;&lt;br /&gt;           Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, aspectRatio, nearPlane, farPlane, &lt;span class="kwrd"&gt;out&lt;/span&gt; projection);&lt;br /&gt;           Matrix.CreateLookAt(&lt;span class="kwrd"&gt;ref&lt;/span&gt; position, &lt;span class="kwrd"&gt;ref&lt;/span&gt; target, &lt;span class="kwrd"&gt;ref&lt;/span&gt; up, &lt;span class="kwrd"&gt;out&lt;/span&gt; view);&lt;br /&gt;           cameraFrustum = &lt;span class="kwrd"&gt;new&lt;/span&gt; BoundingFrustum(view * projection);&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; updateFreeCamera(GameTime gameTime)&lt;br /&gt;       {&lt;br /&gt;           movimento = Vector3.Zero;&lt;br /&gt;           &lt;span class="kwrd"&gt;float&lt;/span&gt; delta = (&lt;span class="kwrd"&gt;float&lt;/span&gt;)gameTime.ElapsedGameTime.TotalSeconds;&lt;br /&gt;           &lt;span class="kwrd"&gt;if&lt;/span&gt;(inputDevice.actualKeyboardState.IsKeyDown(Keys.Up))&lt;br /&gt;               pitch -= rotationRate * delta;&lt;br /&gt;           &lt;span class="kwrd"&gt;if&lt;/span&gt; (inputDevice.actualKeyboardState.IsKeyDown(Keys.Down))&lt;br /&gt;               pitch += rotationRate * delta;&lt;br /&gt;           &lt;span class="kwrd"&gt;if&lt;/span&gt; (pitch &amp;gt; 89)&lt;br /&gt;               pitch = 89;&lt;br /&gt;           &lt;span class="kwrd"&gt;if&lt;/span&gt; (pitch &amp;lt; -89)&lt;br /&gt;               pitch = -89;&lt;br /&gt;           &lt;span class="kwrd"&gt;if&lt;/span&gt; (inputDevice.actualKeyboardState.IsKeyDown(Keys.Right))&lt;br /&gt;               yaw -= rotationRate * delta;&lt;br /&gt;           &lt;span class="kwrd"&gt;if&lt;/span&gt; (inputDevice.actualKeyboardState.IsKeyDown(Keys.Left))&lt;br /&gt;               yaw += rotationRate * delta;&lt;br /&gt;           &lt;span class="kwrd"&gt;if&lt;/span&gt; (yaw &amp;gt; 360)&lt;br /&gt;               yaw -= 360;&lt;br /&gt;           &lt;span class="kwrd"&gt;if&lt;/span&gt; (yaw &amp;lt; 0)&lt;br /&gt;               yaw += 360;&lt;br /&gt;           &lt;span class="kwrd"&gt;if&lt;/span&gt; (inputDevice.actualKeyboardState.IsKeyDown(Keys.W))&lt;br /&gt;               movimento.Z -= movementRate * delta;&lt;br /&gt;           &lt;span class="kwrd"&gt;if&lt;/span&gt; (inputDevice.actualKeyboardState.IsKeyDown(Keys.S))&lt;br /&gt;               movimento.Z += movementRate * delta;&lt;br /&gt;           &lt;span class="kwrd"&gt;if&lt;/span&gt; (inputDevice.actualKeyboardState.IsKeyDown(Keys.A))&lt;br /&gt;               movimento.X -= movementRate * delta;&lt;br /&gt;           &lt;span class="kwrd"&gt;if&lt;/span&gt; (inputDevice.actualKeyboardState.IsKeyDown(Keys.D))&lt;br /&gt;               movimento.X += movementRate * delta;&lt;br /&gt;&lt;br /&gt;           Matrix rotation = Matrix.CreateFromYawPitchRoll(MathHelper.ToRadians(yaw),&lt;br /&gt;               MathHelper.ToRadians(pitch), 0.0f);&lt;br /&gt;           Vector3.TransformNormal(&lt;span class="kwrd"&gt;ref&lt;/span&gt; movimento, &lt;span class="kwrd"&gt;ref&lt;/span&gt; rotation, &lt;span class="kwrd"&gt;out&lt;/span&gt; movimento);&lt;br /&gt;           position += movimento;&lt;br /&gt;           Vector3 transformedReference;&lt;br /&gt;           Vector3 dir = &lt;span class="kwrd"&gt;new&lt;/span&gt; Vector3(0, 0, -1);&lt;br /&gt;           Vector3.TransformNormal(&lt;span class="kwrd"&gt;ref&lt;/span&gt; dir, &lt;span class="kwrd"&gt;ref&lt;/span&gt; rotation, &lt;span class="kwrd"&gt;out&lt;/span&gt; transformedReference);&lt;br /&gt;           Vector3.Add(&lt;span class="kwrd"&gt;ref&lt;/span&gt; position, &lt;span class="kwrd"&gt;ref&lt;/span&gt; transformedReference, &lt;span class="kwrd"&gt;out&lt;/span&gt; target);&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Update(GameTime gameTime)&lt;br /&gt;       {&lt;br /&gt;           &lt;span class="kwrd"&gt;if&lt;/span&gt; (typeOfCamera == CameraMode.Free)&lt;br /&gt;               updateFreeCamera(gameTime);&lt;br /&gt;&lt;br /&gt;           aspectRatio = (&lt;span class="kwrd"&gt;float&lt;/span&gt;)Game.GraphicsDevice.Viewport.Width /&lt;br /&gt;                   (&lt;span class="kwrd"&gt;float&lt;/span&gt;)Game.GraphicsDevice.Viewport.Height;&lt;br /&gt;           Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, aspectRatio, nearPlane, farPlane, &lt;span class="kwrd"&gt;out&lt;/span&gt; projection);&lt;br /&gt;           Matrix.CreateLookAt(&lt;span class="kwrd"&gt;ref&lt;/span&gt; position, &lt;span class="kwrd"&gt;ref&lt;/span&gt; target, &lt;span class="kwrd"&gt;ref&lt;/span&gt; up, &lt;span class="kwrd"&gt;out&lt;/span&gt; view);&lt;br /&gt;&lt;br /&gt;           cameraFrustum.Matrix = view * projection;&lt;br /&gt;           &lt;span class="kwrd"&gt;base&lt;/span&gt;.Update(gameTime);&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       &lt;span class="preproc"&gt;#region&lt;/span&gt; CameraI Membri di&lt;br /&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; Matrix View&lt;br /&gt;       {&lt;br /&gt;           get { &lt;span class="kwrd"&gt;return&lt;/span&gt; view; }&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; Matrix Projection&lt;br /&gt;       {&lt;br /&gt;           get { &lt;span class="kwrd"&gt;return&lt;/span&gt; projection; }&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; Vector3 Position&lt;br /&gt;       {&lt;br /&gt;           get { &lt;span class="kwrd"&gt;return&lt;/span&gt; position; }&lt;br /&gt;           set { position = &lt;span class="kwrd"&gt;value&lt;/span&gt;; }&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; Vector3 Up&lt;br /&gt;       {&lt;br /&gt;           get { &lt;span class="kwrd"&gt;return&lt;/span&gt; up; }&lt;br /&gt;           set { up = &lt;span class="kwrd"&gt;value&lt;/span&gt;; }&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; Vector3 Target&lt;br /&gt;       {&lt;br /&gt;           get { &lt;span class="kwrd"&gt;return&lt;/span&gt; target; }&lt;br /&gt;           set { target = &lt;span class="kwrd"&gt;value&lt;/span&gt;; }&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;float&lt;/span&gt; NearPlane&lt;br /&gt;       {&lt;br /&gt;           get { &lt;span class="kwrd"&gt;return&lt;/span&gt; nearPlane; }&lt;br /&gt;           set { nearPlane = &lt;span class="kwrd"&gt;value&lt;/span&gt;; }&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;float&lt;/span&gt; FarPlane&lt;br /&gt;       {&lt;br /&gt;           get { &lt;span class="kwrd"&gt;return&lt;/span&gt; farPlane; }&lt;br /&gt;           set { farPlane = &lt;span class="kwrd"&gt;value&lt;/span&gt;; }&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; CameraMode Mode&lt;br /&gt;       {&lt;br /&gt;           get { &lt;span class="kwrd"&gt;return&lt;/span&gt; typeOfCamera; }&lt;br /&gt;           set { typeOfCamera = &lt;span class="kwrd"&gt;value&lt;/span&gt;; }&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; BoundingFrustum CameraBoundingFrustum&lt;br /&gt;       {&lt;br /&gt;           get { &lt;span class="kwrd"&gt;return&lt;/span&gt; cameraFrustum; }&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;br /&gt;   }&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Le parti importante da considerare sono:&lt;br /&gt;l'enumeratore &lt;span style="font-style: italic;"&gt;CameraMode&lt;/span&gt;: questo contiene i vari tipi di telecamera che mi sono venuti in mente. Per ora noi useremo solo &lt;span style="font-weight: bold;"&gt;Free&lt;/span&gt;, ma nulla vieta di implementare anche gli altri o di aggiungerne di nuovi!&lt;br /&gt;Come si può vedere ho anche aggiunto alcuni campi all'interfaccia CameraI.&lt;br /&gt;Aggiunta importate è la CameraBoundingFrustum, che verrà calcolato nel metodo Update.&lt;br /&gt;&lt;br /&gt;Ora passiamo al metodo Update: per prima cosa andiamo a controllare il tipo di telecamera, e se è di tipo Free adiamo a chiamare il metodo per aggiornarla.&lt;br /&gt;Poi si calcola la view e la projection matrix ed infine il boundigFrustum, dato dal prodotto delle view per la projection.&lt;br /&gt;&lt;br /&gt;Vediamo il metodo updateFreeCamera:&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; updateFreeCamera(GameTime gameTime)&lt;br /&gt;   {&lt;br /&gt;       movimento = Vector3.Zero;&lt;br /&gt;       &lt;span class="kwrd"&gt;float&lt;/span&gt; delta = (&lt;span class="kwrd"&gt;float&lt;/span&gt;)gameTime.ElapsedGameTime.TotalSeconds;&lt;br /&gt;       &lt;span class="kwrd"&gt;if&lt;/span&gt;(inputDevice.actualKeyboardState.IsKeyDown(Keys.Up))&lt;br /&gt;           pitch -= rotationRate * delta;&lt;br /&gt;       &lt;span class="kwrd"&gt;if&lt;/span&gt; (inputDevice.actualKeyboardState.IsKeyDown(Keys.Down))&lt;br /&gt;           pitch += rotationRate * delta;&lt;br /&gt;       &lt;span class="kwrd"&gt;if&lt;/span&gt; (pitch &amp;gt; 89)&lt;br /&gt;           pitch = 89;&lt;br /&gt;       &lt;span class="kwrd"&gt;if&lt;/span&gt; (pitch &amp;lt; -89)&lt;br /&gt;           pitch = -89;&lt;br /&gt;       &lt;span class="kwrd"&gt;if&lt;/span&gt; (inputDevice.actualKeyboardState.IsKeyDown(Keys.Right))&lt;br /&gt;           yaw -= rotationRate * delta;&lt;br /&gt;       &lt;span class="kwrd"&gt;if&lt;/span&gt; (inputDevice.actualKeyboardState.IsKeyDown(Keys.Left))&lt;br /&gt;           yaw += rotationRate * delta;&lt;br /&gt;       &lt;span class="kwrd"&gt;if&lt;/span&gt; (yaw &amp;gt; 360)&lt;br /&gt;           yaw -= 360;&lt;br /&gt;       &lt;span class="kwrd"&gt;if&lt;/span&gt; (yaw &amp;lt; 0)&lt;br /&gt;           yaw += 360;&lt;br /&gt;       &lt;span class="kwrd"&gt;if&lt;/span&gt; (inputDevice.actualKeyboardState.IsKeyDown(Keys.W))&lt;br /&gt;           movimento.Z -= movementRate * delta;&lt;br /&gt;       &lt;span class="kwrd"&gt;if&lt;/span&gt; (inputDevice.actualKeyboardState.IsKeyDown(Keys.S))&lt;br /&gt;           movimento.Z += movementRate * delta;&lt;br /&gt;&lt;br /&gt;       Matrix rotation = Matrix.CreateFromYawPitchRoll(MathHelper.ToRadians(yaw),&lt;br /&gt;           MathHelper.ToRadians(pitch), 0.0f);&lt;br /&gt;       Vector3.Transform(&lt;span class="kwrd"&gt;ref&lt;/span&gt; movimento, &lt;span class="kwrd"&gt;ref&lt;/span&gt; rotation, &lt;span class="kwrd"&gt;out&lt;/span&gt; movimento);&lt;br /&gt;       position += movimento;&lt;br /&gt;       Vector3 transformedReference;&lt;br /&gt;       Vector3 dir = &lt;span class="kwrd"&gt;new&lt;/span&gt; Vector3(0, 0, -1);&lt;br /&gt;       Vector3.Transform(&lt;span class="kwrd"&gt;ref&lt;/span&gt; dir, &lt;span class="kwrd"&gt;ref&lt;/span&gt; rotation, &lt;span class="kwrd"&gt;out&lt;/span&gt; transformedReference);&lt;br /&gt;       Vector3.Add(&lt;span class="kwrd"&gt;ref&lt;/span&gt; position, &lt;span class="kwrd"&gt;ref&lt;/span&gt; transformedReference, &lt;span class="kwrd"&gt;out&lt;/span&gt; target);&lt;br /&gt;   }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;MovementRate e RotationRate sono due variabili definite nella classe e ci dicono quanto velocemente si muove e ruota la nostra telecamera.&lt;br /&gt;A seconda dei tasti che premiamo andiamo a modifcare i valori di Pitch e Yaw (che stanno rispettivamente per l'angolo sull'asse X ed Y), oppure a spostare la posizone della telecamera.&lt;br /&gt;Usando yaw e pitch creo una matrice di rotazione, che uso per trasformare (cioè per spostare lungo la direzione data dalla matrice) la posizione della telecamera.&lt;br /&gt;La stessa cosa la faccio per la posizione del punto che sto osservando, cioè per il target.&lt;br /&gt;Come possiamo vedere in questo metodo non c'è il calcolo per la creazione della view e della projection: qui si aggiorna solo il valore della posizione e del target, la creazione viene fatta nel metodo update.&lt;br /&gt;&lt;br /&gt;E questo è tutto.&lt;br /&gt;Ora si deve solo andare in Game1.cs e mettere questo nel metodo Initialize:&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;       defaultEffect = Content.Load&amp;lt;Effect&amp;gt;(&lt;span class="str"&gt;@"Effects\Default"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;       mman = &lt;span class="kwrd"&gt;new&lt;/span&gt; MeteorManager(&lt;span class="kwrd"&gt;this&lt;/span&gt;, defaultEffect, 5, maxX,&lt;br /&gt;           maxY, maxZ, &lt;span class="str"&gt;@"Models\asteroid1"&lt;/span&gt;, &lt;span class="str"&gt;@"Textures\asteroid1"&lt;/span&gt;);&lt;br /&gt;       Components.Add(mman);&lt;/pre&gt;&lt;br /&gt;Le due variabili vanno naturalmente create prima ^^&lt;br /&gt;Questo ci dice di caricare il file Default.fx, e di creare il MeteorManager che avrà 5 elementi per ogni sezione.&lt;br /&gt;&lt;br /&gt;Dato che il MeteorManager è un GameComponent e non un DrawableGameComponent bisogna dirgli noi quando renderizzarlo!&lt;br /&gt;Quindi nel metodo Draw di Game1.cs va messo questo:&lt;br /&gt;mman.Draw(gameTime);&lt;br /&gt;&lt;br /&gt;Ma veramente serve tutta questa palla del CameraBoundingFrustum, delle collisioni e tutto il resto?&lt;br /&gt;Fate una prova:&lt;br /&gt;Andate nel file del MeteorManager, nel Draw(..) mettere val = 8 e commentate la riga dove fate il controllo sul risultato del CameraBoundingFrustum.Contains(..).&lt;br /&gt;Io riesco ad ottenere soltanto 5-6 FPS.&lt;br /&gt;Facendo il controllo passo a circa 70.&lt;br /&gt;&lt;br /&gt;Voi che dite? Serve?&lt;br /&gt;Per me si ^___^&lt;br /&gt;&lt;br /&gt;Poi almeno così si è visto come creare un manager per un insieme di oggetti, e come cominciare a buttare giù una semplice struttura per un gioco... qui il compito è..... contatare tutti gli asteroidi XD Sai che spasso XD&lt;br /&gt;Scherzi a parte, potrebbe comunque essere un'idea di base per la struttura di un semplice gioco!&lt;br /&gt;&lt;br /&gt;Ci dovrebbero essere altri metodi per semplificare il rendering di istanze multiple dello stesso elemento, ma ancora non sono in grado di applicarli.&lt;br /&gt;Spero vi sia stato utile tutto questo.&lt;br /&gt;&lt;br /&gt;Se ci sono cose che non tornanto o sbagliate o che si possono fare meglio (il che è molto probabile) ditelo please :)&lt;br /&gt;&lt;br /&gt;Alla prossima!&lt;br /&gt;&lt;br /&gt;Intanto ecco i file allegati!&lt;br /&gt;&lt;a style="color: rgb(51, 204, 0);" href="http://odino87.interfree.it/XNA/XNA-tut5.rar"&gt;&lt;span style="font-weight: bold;"&gt;XNA-tut5.rar&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Argomenti trattati:&lt;br /&gt;Free camera&lt;br /&gt;Camera Bounding Frustum&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-3430585456233994805?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/3430585456233994805/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=3430585456233994805' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/3430585456233994805'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/3430585456233994805'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2009/08/xna-way-tutorial-5-meteor-manager-free.html' title='The Xna-Way: Tutorial 5: Meteor Manager &amp; Free Camera'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-6016645355128029084</id><published>2009-08-24T14:10:00.003+02:00</published><updated>2009-08-24T14:18:02.859+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3D'/><category scheme='http://www.blogger.com/atom/ns#' term='Lavori'/><category scheme='http://www.blogger.com/atom/ns#' term='Fast Modelling'/><category scheme='http://www.blogger.com/atom/ns#' term='Lightwave'/><title type='text'>Fast Modelling 9 - Mecha</title><content type='html'>Quando sono preoccupato per qualcosa e non trovo modo di distrarmi o pensare ad altro (non posso studiare perchè le cose non mi resterebbero in testa) mi metto a lavorare a qualcosa.&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;Questa è l'ultima fatica (ancora incompleta) data dalla mia disperata mente!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm3.static.flickr.com/2523/3852329990_165ddffb96_b.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 120px; height: 240px;" src="http://farm3.static.flickr.com/2523/3852329990_165ddffb96_m.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Può darsi che sarà il nuovo lavoro per un bel WIP.&lt;br /&gt;Si vedrà come va avanti.&lt;br /&gt;Cosa ne pensate? Vi piace? Oppure come "stile" non va bene?&lt;br /&gt;&lt;br /&gt;Sarà comunque servito a distrarmi?&lt;br /&gt;No, affatto...&lt;br /&gt;Il problema di riuscire a fare più cose contemporaneamente è che anche i brutti pensieri permangono. Solo il sonno forse mi darà pace, e ora mi sta venendo una grande voglia di dormire...&lt;br /&gt;&lt;br /&gt;Alla prossima...&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-6016645355128029084?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/6016645355128029084/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=6016645355128029084' title='2 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/6016645355128029084'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/6016645355128029084'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2009/08/fast-modelling-9-mecha.html' title='Fast Modelling 9 - Mecha'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2523/3852329990_165ddffb96_t.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-5904832785908717905</id><published>2009-08-22T09:16:00.005+02:00</published><updated>2009-08-22T09:44:34.496+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3D'/><category scheme='http://www.blogger.com/atom/ns#' term='Rendering'/><category scheme='http://www.blogger.com/atom/ns#' term='Lavori'/><category scheme='http://www.blogger.com/atom/ns#' term='Lightwave'/><category scheme='http://www.blogger.com/atom/ns#' term='Gunblade'/><category scheme='http://www.blogger.com/atom/ns#' term='Final Fantasy'/><title type='text'>Seifer Gunblade</title><content type='html'>In questi giorni proprio non so cosa fare per ternemi occupato.&lt;br /&gt;Ho tanti troppi pensieri per la testa, ma al contempo tanta troppe cose che vorrei fare...&lt;br /&gt;Non mi succedeva da tanto tempo, e devo dire che è frustrante non avere la possibilità di realizzare tutto quello che si vorrebbe nell'arco di un solo giorno.&lt;br /&gt;&lt;br /&gt;Comunque proseguendo sulla retta via cominciamo a descrivere cosa ho fatto.&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;Ho notato che parecchi degli accesi al blog sono stati fatti ricercando "Gunblade" o come costruirne uno (magari fossi in grado di farne uno vero XD).&lt;br /&gt;Quindi ieri sera (mentre guardavo qualcosa alla tv... mi pare aspettassi Wasabi :P) mi sono detto "Cosa potrei fare come lavoro sempre in tema Gunblade?".&lt;br /&gt;Eh purtroppo di Gunblade ce ne sta solo uno!&lt;br /&gt;NO INVECE! C'è anche quello di quel maledetto ed antipatico di Seifer -.-&lt;br /&gt;&lt;br /&gt;E allora non ci ho pensato troppo su, ho trovato una cavolo di immagine (a bassa risoluzione -.-) e mi sono messo a modellarlo!&lt;br /&gt;&lt;br /&gt;Come forma è certamente più semplice rispetto al Revolver di Squall, con meno dettagli direi.&lt;br /&gt;Poi avendo un'immagine a bassa risoluzione non ho potuto mettere tutti i dettagli che avrei voluto ?_?&lt;br /&gt;Il risultato però non mi dispiace (per averci lavoraro al massimo un'oretta).&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm3.static.flickr.com/2546/3842965127_66fc352841_b.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 144px; height: 240px;" src="http://farm3.static.flickr.com/2546/3842965127_66fc352841_m.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;Come si può vedere è molto più semplice.&lt;br /&gt;E mi chiedo come facesse Seifer a tirare quelle pizze tremente impugnando questo affare a mo di pistola e con una mano sola :O&lt;br /&gt;Almeno quello di Squall lo si poteva usare a 2 mani e aveva una forma più a spada che a pistola...&lt;br /&gt;I misteri della vita! :O&lt;br /&gt;&lt;br /&gt;Poi devo dire che il modello "pistola automatica" mi piace poco, poi come ho detto, non ho potuto particolareggiare molto: anche così sono andato abbastanza a fantasia.&lt;br /&gt;E anche usando una foto di una pistola automatica non posso mettere troppa roba che non "esiste" nel progetto gunblade, anche perchè dopo non tornano forme e posizioni.&lt;br /&gt;&lt;br /&gt;Poi mi sono detto "E a metterli assieme entrambi come rende il tutto?"&lt;br /&gt;Ecco a voi :)&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm3.static.flickr.com/2581/3842966491_49f11d8f1a_b.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 160px; height: 240px;" src="http://farm3.static.flickr.com/2581/3842966491_49f11d8f1a_m.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;Diaciamocelo....&lt;br /&gt;Il gunblade di Seifer a confronto con quello di Squall sembra un coltellino svizzero XD&lt;br /&gt;Dai quello di Squall è troppo più bello e massiccio!&lt;br /&gt;Credo che l'unica arma che ispira più potenza sia la Buster Sword di Cloud :P&lt;br /&gt;&lt;br /&gt;Bè come al solito spero vi piaccia, e se avete delle critiche da fare, anche sulla forma e sui dettagli dei modelli ditelo che provvedo a cambiare e a modifcare!&lt;br /&gt;&lt;br /&gt;Inoltre una piccola richiesta: se qualcuno trova delle foto ad alta definizione del gunblade di Seifer me lo può dire? In questo modo potrò aggiungere altri dettagli :)&lt;br /&gt;&lt;br /&gt;Eccovi i link per le immagini ad alta risoluzione :)&lt;br /&gt;&lt;a href="http://odino87.deviantart.com/art/Seifer-Gunblade-134293070"&gt;Seifer's Gunblade&lt;/a&gt;&lt;br /&gt;&lt;a href="http://odino87.deviantart.com/art/Both-Gunblade-134293197"&gt;Both Gunblade&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-5904832785908717905?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/5904832785908717905/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=5904832785908717905' title='2 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/5904832785908717905'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/5904832785908717905'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2009/08/seifer-gunblade.html' title='Seifer Gunblade'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2546/3842965127_66fc352841_t.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-6016572618880840519</id><published>2009-08-14T08:00:00.001+02:00</published><updated>2009-10-18T17:30:45.914+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='The Xna-Way'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA Component'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Guida XNA'/><title type='text'>The Xna-Way: Tutorial 4: Input</title><content type='html'>Ok eccoci di nuovo qua.&lt;br /&gt;Dopo aver visto la telecamera della scena, come si carica e renderizza un semplice modello voglio vedere ora come organizzare la gestione dell'input!&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;Come ho deciso di organizzare questa cosa?&lt;br /&gt;Bè XNA ci da tutte le funzioni per gestire l'input da tastiera, da mouse e da gamePad. Come sempre lavoro solo su Windows, quindi io gestirò solo quello da mouse e da tastiera, anche se per ora mi dedicherò solo a quello da tastiera.&lt;br /&gt;&lt;br /&gt;Lo stato della tastiera va aggiornato e controllato ad ogni ciclo di esecuzione, e il posto migliore per farlo è il metodo update.&lt;br /&gt;Quindi posso pensare di organizzare un gameComponent per la gestione e aggiornamento dell'input da tastiera. Ma quanti e quali componenti devono/possono usare l'input?&lt;br /&gt;Be così ad occhio io direi la nostra telecamera, e per ora un eventuale personaggio da muovere. Se poi ci fossero altri componenti potremmo avere dei problemi di accesso ai dati per l'input.&lt;br /&gt;Sarebbe auspicabile che ogni componente che vuole accedere all'input acceda agli stessi dati, cioè alla stessa copia in memoria dei dati relativi all'input.&lt;br /&gt;&lt;br /&gt;Come per la telecamera anche il gestore dell'input sarà visto come un servizio, al quale poi potremo accedere da ogni punto del nostro gioco.&lt;br /&gt;Per fare questo quindi useremo un'interfaccia, che esporrà i metodi e le proprietà che ci servono, e una classe (un gameComponent) che implementi l'interfaccia.&lt;br /&gt;L'interfaccia e la classe saranno rispettivamente InputI e MyInput.&lt;br /&gt;&lt;br /&gt;Ecco il codice del file che andremo ad aggiungere alla nostra libreria di classi:&lt;br /&gt;MyInput.cs&lt;br /&gt;&lt;a href="javascript:toggle();" id="displayText"&gt;Show/Hide&lt;/a&gt;&lt;br /&gt;&lt;div id="toggleText" style="display: none;"&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; InputI&lt;br /&gt;   {&lt;br /&gt;       KeyboardState KeyboardState { get; }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; MyInput : Microsoft.Xna.Framework.GameComponent, InputI&lt;br /&gt;   {&lt;br /&gt;       KeyboardState kState;&lt;br /&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; MyInput(Game game)&lt;br /&gt;           : &lt;span class="kwrd"&gt;base&lt;/span&gt;(game)&lt;br /&gt;       {&lt;br /&gt;           game.Services.AddService(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(InputI), &lt;span class="kwrd"&gt;this&lt;/span&gt;);&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Initialize()&lt;br /&gt;       {&lt;br /&gt;           &lt;span class="kwrd"&gt;base&lt;/span&gt;.Initialize();&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Update(GameTime gameTime)&lt;br /&gt;       {&lt;br /&gt;           kState = Keyboard.GetState();&lt;br /&gt;&lt;br /&gt;           &lt;span class="kwrd"&gt;base&lt;/span&gt;.Update(gameTime);&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       &lt;span class="preproc"&gt;#region&lt;/span&gt; InputI Membri di&lt;br /&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; KeyboardState KeyBoardState&lt;br /&gt;       {&lt;br /&gt;           get { &lt;span class="kwrd"&gt;return&lt;/span&gt; kState; }&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;br /&gt;   }&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Come sempre se in futuro ci servono nuove funzionalità esse verranno implementate, ma per ora non ci servono e basta quello che abbiamo.&lt;br /&gt;&lt;br /&gt;Cosa fa il codice?&lt;br /&gt;Bè la classe definisce un oggetto di tipo &lt;span style="font-style: italic;"&gt;KeyboardState&lt;/span&gt;, il quale andrà a contenere lo stato della tastiera, è cioè quali sono i tasti premuni e non premuti.&lt;br /&gt;Nel costrutture, come pensato, vado ad aggiungere il gameComponent alla lista dei Servizi.&lt;br /&gt;&lt;br /&gt;Il metodo update fa una cosa semplicissima: ad ogni esecuzione aggiorna il valore attuale contenuto nella variabile kState, in modo che quando un altro componente vuole ottenere informazioni sulla tastiera otterrà sempre lo stato aggioranto.&lt;br /&gt;&lt;br /&gt;Come posso recuperare il riferimento al servizio ed utilizzarlo?&lt;br /&gt;Andiamo nella nostra classe Model3D, e andiamo ad aggiungere un campo di classe così:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;InputI inputDevice;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;che sarà usato per contenere il riferimento al nostro gestore dell'input.&lt;br /&gt;Ne costruttore di Model3D andiamo ad aggiungere questa riga:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;inputDevice = (InputI)game.Services.GetService(typeof(InputI));&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;è simile a quella usata per recuperare il riferimento al servizio che gestisce la telecamera, solo che questa recupera il servizio per l'output.&lt;br /&gt;Nel metodo update della classe Model3D aggiugiamo queste righe sotto l'incremento dell'angolo sull'asse Y:&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt;(inputDevice.KeyBoardState.IsKeyDown(Keys.Up))&lt;br /&gt;    angleX += 5f * (&lt;span class="kwrd"&gt;float&lt;/span&gt;)gameTime.ElapsedRealTime.TotalSeconds;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;in modo che quando premiamo il tasto "up" l'angolo sull'asse X venga incrementato.&lt;br /&gt;Bene quasi finito!&lt;br /&gt;&lt;br /&gt;Andiamo nel file Game1.cs, aggiungiamo anche qui il campo&lt;br /&gt;&lt;span style="font-style: italic;"&gt;inputDevice = (InputI)game.Services.GetService(typeof(InputI));&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;e il costruttore trasfromiamolo così:&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; Game1()&lt;br /&gt;       {&lt;br /&gt;           graphics = &lt;span class="kwrd"&gt;new&lt;/span&gt; GraphicsDeviceManager(&lt;span class="kwrd"&gt;this&lt;/span&gt;);&lt;br /&gt;           Content.RootDirectory = &lt;span class="str"&gt;"Content"&lt;/span&gt;;&lt;br /&gt;           counter = &lt;span class="kwrd"&gt;new&lt;/span&gt; FPSCounter(&lt;span class="kwrd"&gt;this&lt;/span&gt;);&lt;br /&gt;           Components.Add(counter);&lt;br /&gt;&lt;br /&gt;           myInput = &lt;span class="kwrd"&gt;new&lt;/span&gt; MyInput(&lt;span class="kwrd"&gt;this&lt;/span&gt;);&lt;br /&gt;           Components.Add(myInput);&lt;br /&gt;&lt;br /&gt;           myCamera = &lt;span class="kwrd"&gt;new&lt;/span&gt; Camera(&lt;span class="kwrd"&gt;this&lt;/span&gt;);&lt;br /&gt;           Components.Add(myCamera);&lt;br /&gt;       }&lt;/pre&gt;&lt;br /&gt;Come possiamo vedere ho creato ed aggiunto un oggetto di tipo MyInput alla collezione dei componenti.&lt;br /&gt;Ma come mai l'ho fatto prima della telecamera?&lt;br /&gt;Perchè se in un futuro amplierò le funzionalità della mia telecamera e vorrò usare l'input, se aggiungo prima la camera e poi l'input, quando nel costrutire la telecamera andrò a cercare di recuperare il riferimento al servizio che implementa l'interfaccia InputI mi ritornerà NULL, dato che tale servizio non sarà stato ancora aggiunto. Così facendo invece la telecamera lo troverebbe pronto.&lt;br /&gt;&lt;br /&gt;Se ora avviamo il gioco, dovremmo vedere sempre il nostro asteroide che ruota, ma premendo il tasto SU ruoterà anche attorno all'asse X.&lt;br /&gt;Fantastico! E anche molto semplice direi ^^&lt;br /&gt;&lt;br /&gt;Bene facciamo un'ultima modifca e poi abbiamo finito per oggi!&lt;br /&gt;Nel metodo update della classe Game1.cs andiamo ad eliminare la condizione del costrutto if (che riguarda il gamePad) con questa:&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (myInput.KeyBoardState.IsKeyDown(Keys.Escape))&lt;br /&gt;   &lt;span class="kwrd"&gt;this&lt;/span&gt;.Exit();&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;in modo che premendo il tasto Escape allora il gioco verrà terminato!&lt;br /&gt;&lt;br /&gt;Ok per oggi è tutto!&lt;br /&gt;Spero di essere stato chiaro.&lt;br /&gt;Anche questa volta niente sorgenti, dato che il file per il componente di Input è tutto listato qua sopra, e le modifiche da fare sono esigue.&lt;br /&gt;&lt;br /&gt;Se qualcosa non vi torna ditelo senza problemi e correggo! :)&lt;br /&gt;&lt;br /&gt;Alla prossima!&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-6016572618880840519?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/6016572618880840519/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=6016572618880840519' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/6016572618880840519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/6016572618880840519'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2009/08/xna-way-tutorial-4-input.html' title='The Xna-Way: Tutorial 4: Input'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-5627624362279601726</id><published>2009-08-11T16:05:00.027+02:00</published><updated>2009-08-12T12:33:43.083+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='The Xna-Way'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Guida XNA'/><title type='text'>The Xna-Way: Tutorial 3: Modelli 3D</title><content type='html'>Piccola introduzione all'uso dei modelli tridimensionali!&lt;br /&gt;Ma proprio minimale eh ^^&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;Intanto ecco a voi il codice di questa piccola classe che ho creato per gestire un modello 3D.&lt;br /&gt;Da dire che il concetto è sbagliato, perchè è errato pensare di fare e di creare un game component per ogni oggetto che vogliamo gestire. Avremmo in questo modo un aumento della complessità realizzativa e un calo di prestazioni dovuto al grande numero di componenenti in gioco. Di solito si userà un gestore per quegli oggetti che hanno un comportamento comune, e un oggetto apposito per quelli che hanno un comportamento particolare.&lt;br /&gt;Ma per ora, per questi esempi semplici va più che bene.&lt;br /&gt;&lt;/span&gt;&lt;span class="fullpost"&gt;Questo componenten va aggiunto al progetto myLibrary.&lt;br /&gt;&lt;br /&gt;Model3D.cs&lt;br /&gt;&lt;/span&gt;&lt;span class="fullpost"&gt;&lt;a href="javascript:toggle();" id="displayText"&gt;Show&lt;/a&gt;&lt;br /&gt;&lt;div id="toggleText" style="display: none;"&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Model3D : Microsoft.Xna.Framework.DrawableGameComponent&lt;br /&gt;{&lt;br /&gt;Model myModel;&lt;br /&gt;Matrix world;&lt;br /&gt;&lt;br /&gt;InputI inputDevice;&lt;br /&gt;&lt;br /&gt;Vector3 position = Vector3.Zero;&lt;br /&gt;&lt;span class="kwrd"&gt;float&lt;/span&gt; scale = 1.0f;&lt;br /&gt;&lt;span class="kwrd"&gt;float&lt;/span&gt; angleX, angleY, angleZ;&lt;br /&gt;&lt;br /&gt;CameraI myCamera;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; Model3D(Game game, &lt;span class="kwrd"&gt;string&lt;/span&gt; myModel)&lt;br /&gt;    : &lt;span class="kwrd"&gt;base&lt;/span&gt;(game)&lt;br /&gt;{&lt;br /&gt;    position.Z = -8000;&lt;br /&gt;    world = Matrix.Identity + Matrix.CreateTranslation(position);&lt;br /&gt;    myCamera = (CameraI)game.Services.GetService(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(CameraI));&lt;br /&gt;    &lt;span class="kwrd"&gt;this&lt;/span&gt;.myModel = Game.Content.Load&amp;lt;Model&amp;gt;(myModel);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Update(GameTime gameTime)&lt;br /&gt;{&lt;br /&gt;    &lt;span class="rem"&gt;//prova rotazione&lt;/span&gt;&lt;br /&gt;    angleY += 5f * (&lt;span class="kwrd"&gt;float&lt;/span&gt;)gameTime.ElapsedRealTime.TotalSeconds;&lt;br /&gt;    &lt;span class="rem"&gt;//----------------------------------&lt;/span&gt;&lt;br /&gt;    world = Matrix.CreateScale(scale) *&lt;br /&gt;        Matrix.CreateFromYawPitchRoll(angleY, angleX, angleZ) *&lt;br /&gt;        Matrix.CreateTranslation(position);&lt;br /&gt;    &lt;span class="kwrd"&gt;base&lt;/span&gt;.Update(gameTime);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Draw(GameTime gameTime)&lt;br /&gt;{&lt;br /&gt;    Matrix[] transforms = &lt;span class="kwrd"&gt;new&lt;/span&gt; Matrix[myModel.Bones.Count];&lt;br /&gt;    myModel.CopyAbsoluteBoneTransformsTo(transforms);&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (ModelMesh mesh &lt;span class="kwrd"&gt;in&lt;/span&gt; myModel.Meshes)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (BasicEffect be &lt;span class="kwrd"&gt;in&lt;/span&gt; mesh.Effects)&lt;br /&gt;        {&lt;br /&gt;            be.EnableDefaultLighting();&lt;br /&gt;            be.Projection = myCamera.Projection;&lt;br /&gt;            be.View = myCamera.View;&lt;br /&gt;            be.World = world * transforms[mesh.ParentBone.Index];&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        mesh.Draw();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;base&lt;/span&gt;.Draw(gameTime);&lt;br /&gt;}&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Come si può vedere la classe Model3D.cs deriva da DrawableGameComponent, in questo modo ha il suo metodo Draw.&lt;br /&gt;&lt;br /&gt;Model3D ha come campi privati un oggetto myModel di tipo Model che servirà per contenere il modello che andremo a caricare.&lt;br /&gt;Poi ha un vettore per la sua posizione nel mondo 3D della scena, 3 variabili per il valore della rotazione lungo i 2 assi (X, Y, e Z) e una variabile per la scala dell'oggetto (cioè per dire quanto deve essere grande l'oggetto).&lt;br /&gt;&lt;br /&gt;La matrice chiamata &lt;span style="font-style: italic;"&gt;world &lt;/span&gt;è la matrice che costruiremo usando le varabili che caratterizzano la posizione del nostro oggetto nel mondo.&lt;br /&gt;&lt;br /&gt;Ha anche un oggetto di tipo CameraI che andrà a contenere il riferimento al servizio della telecamera. Ma come lo recuperiamo? :O&lt;br /&gt;&lt;br /&gt;Al costruttore gli passiamo (oltre al game) il percorso dove è situato il modello che vogliamo caricare. In questo modo possiamo caricarlo ed assegnarlo al nostro oggetto.&lt;br /&gt;Per fare questo usiamo il metodo Load di Content. Questo Metodo ci permette di caricare molti dei contenuti multimediali che vogliamo usare nel nostro gioco, come i modelli appunto, musica, immagini, etc.&lt;br /&gt;Non mi dilungo nello spiegare cosa faccia, ma in parole povere è come se riscrivesse l'oggetto che vogliamo caricare in un formato compatibile ed utilizzabile da XNA sia su pc che sulla 360.&lt;br /&gt;&lt;br /&gt;Concentriamoci un attimo su questa riga:&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;myCamera = (CameraI)game.Services.GetService(typeof(CameraI));&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Cosa fa? Abbiamo visto nel file Camera.cs come aggiungere un servizio, che poi non era altro che un gameComponent che implementava un'interfaccia.&lt;br /&gt;Questo metodo ci permette di recuperare il riferimento ad un servizio che abbiamo aggiunto, e di far riferimento sempre alla solita copia di quel servizio da ogni punto del nostro gioco.&lt;br /&gt;In questo caso andiamo a prendere il riferimento al serivizio che si occupa gestire la telecamera.&lt;br /&gt;Naturalmente potremo accedere solo ai metodi e proprietà definite nell'interfaccia.&lt;br /&gt;Ci serve di recuperare il riferimento alla telecamera perchè per la fase di rendering dell'oggetto abbiamo bisogno di un paio di informazioni da parte della camera.&lt;br /&gt;&lt;br /&gt;Fatto questo cambiamo il valore z del vettore position, in modo che sia distante dal punto di osservazione della telecamera e sia ben visibile.&lt;br /&gt;&lt;br /&gt;Nel metodo update aggiungiamo questo:&lt;br /&gt;&lt;pre class="csharpcode"&gt;angleY += 5f;&lt;br /&gt;world = Matrix.CreateScale(scale) *&lt;br /&gt;        Matrix.CreateFromYawPitchRoll(angleY, angleX, angleZ) *&lt;br /&gt;        Matrix.CreateTranslation(position);&lt;/pre&gt;Questo codice incrementa il valore dell'angolo di rotazione sull'asse Y di 5 gradi ad ogni esecuzione del metodo update, e dopo ricostruisce la matrice world.&lt;br /&gt;La matrice world è costruita prima calcoando la matrice per la scala, poi per la rotazione ed infine per la traslazione.&lt;br /&gt;Per calcolare la rotazione usiamo il CreateFromYawPitchRoll: questi termini (Yaw, Pitch, Roll) indicano rispettivamente il valore della rotazione attorno agli assi Y, X, e Z (cioè Yaw = Y, Pitch = X, e Roll = Z). Ecco perchè al metodo gli passo prima l'angolo per l'asse Y, poi per X ed infine per Z.&lt;br /&gt;&lt;br /&gt;Di solito si segue questo ordine, anche perchè la moltiplicazione tra matrici non è commutativa ed eseguire questa moltiplicazione con un ordine diverso porta a risultati doversi.&lt;br /&gt;&lt;br /&gt;Ora andiamo al metodo Draw!&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (ModelMesh mesh &lt;span class="kwrd"&gt;in&lt;/span&gt; myModel.Meshes)&lt;br /&gt;            {&lt;br /&gt;                &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (BasicEffect be &lt;span class="kwrd"&gt;in&lt;/span&gt; mesh.Effects)&lt;br /&gt;                {&lt;br /&gt;                    be.EnableDefaultLighting();&lt;br /&gt;                    be.Projection = myCamera.Projection;&lt;br /&gt;                    be.View = myCamera.View;&lt;br /&gt;                    be.World = world;&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                mesh.Draw();&lt;br /&gt;            }&lt;br /&gt;            &lt;br /&gt;            &lt;span class="kwrd"&gt;base&lt;/span&gt;.Draw(gameTime);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Questo è il classico ciclo di esecuzione per renderizzare un modello tridimensionale.&lt;br /&gt;Fatto copia incolla dal manualone (vantiamocene eh XD).&lt;br /&gt;Quello che fa è più o meno questo: per ogni mesh contenuta nel modello (dato che un modello può essere composto da più mesh) prende il basicEffect della mesh attuale, imposta i valori per la projection matrix, view matrix (per dire come è fatto il punto di osservazione) prelevandoli dal servizio che gestisce la telecamera (ecco a cosa ci serviva il riferimento ad essa!). Poi dobbiamo impostare il valore per la world matrix, che rappresenta la posizione, la rotazione e la scala del nostro oggetto nella scena. Infine renderizza la parte in esame.&lt;br /&gt;&lt;br /&gt;Come si fa ad usare questo componente che abbiamo appena creato?&lt;br /&gt;Nel progetto che stiamo usando, dopo aver aggiungo la telecamera come visto l'altra volta, andiamo nel file Game1.cs e nel metodo Inizialize aggiungiamo questo codice:&lt;br /&gt;&lt;pre class="csharpcode"&gt;Model3D modell = &lt;span class="kwrd"&gt;new&lt;/span&gt; Model3D(&lt;span class="kwrd"&gt;this&lt;/span&gt;, &lt;span class="str"&gt;@"Models\asteroid1"&lt;/span&gt;);&lt;br /&gt;Components.Add(modell);&lt;/pre&gt;Per fare questo dovrete aggiungere nella cartella Content del progetto due cartelle: una chiamata Models, dove andremo a mettere il modello del nostro asteroide, e un'altra chiamata Textures, dove andremo a mettere la texture del nostro modello (che verrà caricata in automatico assieme al modello).&lt;br /&gt;Come possiamo notare, quando andiamo a caricare il modello, e a specificare il nome dell'oggetto da caricare, non mettiamo l'estensione. Questo perchè non ci serve, dato che l'oggetto è già stato passato nella content Pipeline di XNA. Se vogliamo quindi riferirci ad un oggetto per caricarlo, come in questo caso, gli dobbiamo dare solo il nome, senza estensione.&lt;br /&gt;Questo codice crea ed aggiunge li componente per la gestione del modello.&lt;br /&gt;&lt;br /&gt;Avviando il gioco se tutto va bene dovremmo vedere un meteorite che ruota su se stesso.&lt;br /&gt;Ora abbiamo due possibilità: o il metorite ruota lentamente o va come una scheggia.&lt;br /&gt;Se va lentamente è perchè non abbiamo creato ed aggiunto il gameComponente per il conteggio degli FPS, se va come una scheggià per perchè lo abbiamo creato.&lt;br /&gt;Ricordo che il componente per il conteggio degli FPS toglie il limite al numero di volte che il metodo Update viene chiamato in un secondo.&lt;br /&gt;Per usare l'FPSCounter e far ruotare il modello alla velocità giusta cambiamo il codice per l'aggiornamento dell'angolo in questo modo:&lt;br /&gt;&lt;br /&gt;angleY += 5f * (float)gameTime.ElapsedRealTime.TotalSeconds;&lt;br /&gt;&lt;br /&gt;Accedendo al gameTime, e prendendo il valore ElapsedRealTime non facciamo altro che recuperare il tempo passato dall'ultima invocazione del metodo Update. Così facendo l'incremento non sarà di 5 gradi ad ogni invocazione del metodo, ma di una frazione di 5 ad ogni invocazione del metodo.&lt;br /&gt;In questo modo l'incremento sarà fatto alla giusta velocità, sia usando che non usando l'FPSCounter. Difatti se proviamo ad eseguire il codice prima con FPSCounter e poi senza notiamo che non c'è differenza nella velocità di rotazione dell'oggetto.&lt;br /&gt;&lt;br /&gt;Spero sia chiaro.&lt;br /&gt;&lt;br /&gt;Come ho detto questo è solo un esempio, e di solito non si fa una cosa del genere. Ma per addentrarci un po' nel caricamento e nella renderizzazione degli oggetti 3D credo possa andare.&lt;br /&gt;&lt;br /&gt;Eccovi intanto i sorgeti di quanto fatto:&lt;br /&gt;&lt;a style="color: rgb(51, 204, 0);" href="http://odino87.interfree.it/XNA/XNA-tut3.rar"&gt;&lt;span style="font-weight: bold;"&gt;XNA-tut3.rar&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;Alla prossima :)&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-5627624362279601726?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/5627624362279601726/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=5627624362279601726' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/5627624362279601726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/5627624362279601726'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2009/08/xna-way-tutorial-3-modelli-3d.html' title='The Xna-Way: Tutorial 3: Modelli 3D'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-3705456462652170161</id><published>2009-08-11T15:17:00.028+02:00</published><updated>2009-10-18T17:30:40.102+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='The Xna-Way'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA Component'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Guida XNA'/><title type='text'>The Xna-Way: Tutorial 2: Camera</title><content type='html'>Finalmente trovo il tempo e la voglia di scrivere qualche altra riga.&lt;br /&gt;Questa volta mi sono occupato della camera della scena. Una semplice telecamera fissa, perchè per poter aggiungere altre funzionalità dovrò prima implementare altri servizi e componenti, tra i quali quelli per gestire l'input da tastiera (e mouse) e un modo semplice per renderizzare qualcosa a scena.&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;Purtroppo per vedere gli effetti di quanto scrivo dovremo attentere il prossimo articolo. Questo non perchè non funziona, ma solo perchè non ci sarà niente da renderizzare nella scena (come ho detto dovrò poi implementare un qualcosa per far renderizzare un modello tridimensionale!)&lt;br /&gt;Questo componenten va aggiunto al progetto myLibrary.&lt;br /&gt;Ecco il codice del file:&lt;br /&gt;&lt;br /&gt;Camera.cs&lt;br /&gt;&lt;a href="javascript:toggle();" id="displayText"&gt;Hide/Show&lt;/a&gt;&lt;br /&gt;&lt;div id="toggleText" style="display: none;"&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; CameraI&lt;br /&gt;{&lt;br /&gt;  Matrix View&lt;br /&gt;  { get; }&lt;br /&gt;&lt;br /&gt;  Matrix Projection&lt;br /&gt;  { get; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Camera : Microsoft.Xna.Framework.GameComponent, CameraI&lt;br /&gt;{&lt;br /&gt;  &lt;span class="rem"&gt;//varibili per la telecamera&lt;/span&gt;&lt;br /&gt;  Matrix projection;&lt;br /&gt;  Matrix view;&lt;br /&gt;  Vector3 position = &lt;span class="kwrd"&gt;new&lt;/span&gt; Vector3(0.0f, 0.0f, 20.0f);&lt;br /&gt;  Vector3 target = Vector3.Zero;&lt;br /&gt;  Vector3 up = Vector3.Up;&lt;br /&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;public&lt;/span&gt; Camera(Game game)&lt;br /&gt;      : &lt;span class="kwrd"&gt;base&lt;/span&gt;(game)&lt;br /&gt;  {&lt;br /&gt;      game.Services.AddService(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(CameraI), &lt;span class="kwrd"&gt;this&lt;/span&gt;);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Initialize()&lt;br /&gt;  {&lt;br /&gt;      &lt;span class="kwrd"&gt;base&lt;/span&gt;.Initialize();&lt;br /&gt;&lt;br /&gt;      &lt;span class="kwrd"&gt;float&lt;/span&gt; aspectRatio = (&lt;span class="kwrd"&gt;float&lt;/span&gt;)Game.GraphicsDevice.Viewport.Width /&lt;br /&gt;          (&lt;span class="kwrd"&gt;float&lt;/span&gt;)Game.GraphicsDevice.Viewport.Height;&lt;br /&gt;      Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, aspectRatio, 1.0f, 10000.0f, &lt;span class="kwrd"&gt;out&lt;/span&gt; projection);&lt;br /&gt;      Matrix.CreateLookAt(&lt;span class="kwrd"&gt;ref&lt;/span&gt; position, &lt;span class="kwrd"&gt;ref&lt;/span&gt; target, &lt;span class="kwrd"&gt;ref&lt;/span&gt; up, &lt;span class="kwrd"&gt;out&lt;/span&gt; view);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Update(GameTime gameTime)&lt;br /&gt;  {&lt;br /&gt;      &lt;span class="kwrd"&gt;base&lt;/span&gt;.Update(gameTime);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  &lt;span class="preproc"&gt;#region&lt;/span&gt; CameraI Membri di&lt;br /&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;public&lt;/span&gt; Matrix View&lt;br /&gt;  {&lt;br /&gt;      get { &lt;span class="kwrd"&gt;return&lt;/span&gt; view; }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;public&lt;/span&gt; Matrix Projection&lt;br /&gt;  {&lt;br /&gt;      get { &lt;span class="kwrd"&gt;return&lt;/span&gt; projection; }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Naturalmente nessuno ci vieta di aggiungere funzionalità al nostro codice in futuro :)&lt;br /&gt;&lt;br /&gt;Analizziamo il codice pezzo a pezzo:&lt;br /&gt;il vettore &lt;span style="font-style: italic;"&gt;position &lt;/span&gt;è quello che contiene la posizione dal quale stiamo osservando la scena, mentre &lt;span style="font-style: italic;"&gt;target &lt;/span&gt;è il vettore che contiene il punto che stiamo osservando.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Up &lt;/span&gt;è il vettore che indica in quale direzione è l'alto nella scena.&lt;br /&gt;Con il codice scritto abbiamo che la telecamera (o punto di osservazione) è posizionato in posizione X = 0, Y = 0, Z = 20.&lt;br /&gt;Stiamo osservando il punto X = Y = Z = 0, e l'alto è dato dal vettore con componente Y positiva (in teoria [0,1,0]).&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;float&lt;/span&gt; aspectRatio = (&lt;span class="kwrd"&gt;float&lt;/span&gt;)Game.GraphicsDevice.Viewport.Width /&lt;br /&gt;     (&lt;span class="kwrd"&gt;float&lt;/span&gt;)Game.GraphicsDevice.Viewport.Height;&lt;br /&gt;Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4,&lt;br /&gt;     aspectRatio, 1.0f, 10000.0f, &lt;span class="kwrd"&gt;out&lt;/span&gt; projection);&lt;br /&gt;Matrix.CreateLookAt(&lt;span class="kwrd"&gt;ref&lt;/span&gt; position, &lt;span class="kwrd"&gt;ref&lt;/span&gt; target, &lt;span class="kwrd"&gt;ref&lt;/span&gt; up, &lt;span class="kwrd"&gt;out&lt;/span&gt; view);&lt;/pre&gt;&lt;br /&gt;Con questo codice creiamo prima di tutto il rapporto tra le dimensioni del nostro schermo (di solito un televisore è in 4:3 o 16:9). Nel nostro caso il rapporto è tra la larghezza e l'altezza delle dimensioni dell'area di rendering.&lt;br /&gt;Per accedere a questa informazione utiliziamo&lt;br /&gt;Game.GraphicsDevice.Viewport.Width e Game.GraphicsDevice.Viewport.Height.&lt;br /&gt;&lt;br /&gt;Queste informazioni vengono utilizzate poi per creare la &lt;span style="font-style: italic;"&gt;projection &lt;/span&gt;matrix: questa matrice serve a definire come viene presentato a schermo quello che viene renderizzato nella scena. Gli ultimi due parametri numerici sono il &lt;span style="font-style: italic;"&gt;nearPlane &lt;/span&gt;e il &lt;span style="font-style: italic;"&gt;farPlane&lt;/span&gt;. Indicano i limiti di quanto è possibile vedere: cioè tutto quello che risulterà distante dalla telecameta e tra nearPlane e farPlane sarà visibile.&lt;br /&gt;Come si può vedere gli passiamo anche l'&lt;span style="font-style: italic;"&gt;aspectRatio &lt;/span&gt;calcolato prima.&lt;br /&gt;L'ultimo parametro, quello con "out", definisce in quale variabile andrà a finire il risultato.&lt;br /&gt;&lt;br /&gt;La &lt;span style="font-style: italic;"&gt;view &lt;/span&gt;matrix identifca la telecamera, e ci serve a definire in quale punto siamo, cosa stiamo osservando, e dove si trova la direzione dell'alto. Come si vede per calcolarla si utilizza le tre variabili definite prima.&lt;br /&gt;&lt;br /&gt;Per ora la telecamera è fissa, cioè non si muove, non cambia punto di osservazione... Nulla un punto fisso.&lt;br /&gt;Questo è il più semplice tipo di telecamera che si piò creare. Si potrà poi utilizzare questa classe come base per ereditare altri tipi di telecamere.&lt;br /&gt;&lt;br /&gt;Per poterla utilizzare, nel costruttore di Game1.cs si deve creare un oggetto di tipo camera ed aggiungerlo alla collezione dei components.&lt;br /&gt;&lt;br /&gt;Torniamo un attimo al costruttore della telecamera, ed osserviamo questa riga:&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;game.Services.AddService(typeof(CameraI), this);&lt;/span&gt;&lt;br /&gt;Che cosa fa?&lt;br /&gt;Be con l'&lt;span style="font-style: italic;"&gt;FPSCounter &lt;/span&gt;avevamo visto come creare un component ed aggiungerlo alla collezione dei Components in modo che poi venisse gestito in automatico.&lt;br /&gt;Quello che faccio ora è creare un servizio: un servizio è un componente che implementa un'interfaccia. Tramite questa interfaccia possiamo poi riferire il servizio ed accedere al servizio stesso tramite i metodi e le proprietà definite dall'interfaccia.&lt;br /&gt;C'è da dire però che ci deve essere nei Services un solo oggetto che implementa una certa interfaccia. Quindi non posso aggiungere due gestori per la camera che implementano la CameraI, dato che poi non sapremo come recupere l'uno o l'altro. Se voglio aggiungere due telecamere diverse i due oggetti devono implementare due interfacce diverse.&lt;br /&gt;Per aggiungerlo alla collezione dei servizi dobbiamo prima di tutto accedere tramite l'oggetto game alla collezione dei servizi, e poi gli dobbiamo dire di che tipo considerare l'oggetto che stiamo aggiungendo (in questo caso come un tipo CameraI) e l'oggetto da aggiungere (in questo caso l'oggetto che stiamo costruendo e quindi this).&lt;br /&gt;Vediamo infatti che la notra classe implementa l'interfaccia CameraI, la quale definisce delle proprietà che andranno a recuperare i valori della projection e della view matrix.&lt;br /&gt;Quando in un altro punto del nostro gioco andremo a recuperare il riferimento al servizio che implementa la CameraI andremo a recuperare il riferimento del solito oggetto, e quindi andremo a recuperare sempre le stesse informazioni.&lt;br /&gt;&lt;br /&gt;Per ora finisco qui.&lt;br /&gt;La prossima volta vedrò di dire come si può creare un componente che si occupa di caricare e renderizzare nella scena un oggetto tridimensionale, e come recueperare il riferimento al servizio della camera appena creato ed aggiunto.&lt;br /&gt;&lt;br /&gt;Questa volta niente sorgenti, dato che ho messo il file completo nel post :)&lt;br /&gt;Spero di essere stato chiaro.&lt;br /&gt;Se qualcosa è spiegato frettolosamente o in malo modo ditelo e provvederò a correggere! :D&lt;br /&gt;&lt;br /&gt;Ciau! Alla prossima!&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-3705456462652170161?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/3705456462652170161/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=3705456462652170161' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/3705456462652170161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/3705456462652170161'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2009/08/xna-way-tutorial-2-camera.html' title='The Xna-Way: Tutorial 2: Camera'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-6353330328329333478</id><published>2009-08-04T15:17:00.008+02:00</published><updated>2009-08-09T17:56:17.870+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3D'/><category scheme='http://www.blogger.com/atom/ns#' term='Rendering'/><category scheme='http://www.blogger.com/atom/ns#' term='Lavori'/><category scheme='http://www.blogger.com/atom/ns#' term='Fast Modelling'/><category scheme='http://www.blogger.com/atom/ns#' term='Lightwave'/><title type='text'>Fast Modelling 8 - armchair</title><content type='html'>Altra giornata divisa tra un progetto per l'università (anche se portato avanti lentamente e con poca voglia), uno strano malumore generale, fatica fisica (le legne per l'inverno vanno messe a posto nella legnaia eh!)...&lt;br /&gt;Si arriva alla sera e cosa si fa?&lt;br /&gt;Da un lato il libro su XNA (che non ho abbandonato eh, solo che devo sperimentare alcune cose e scrivere qualche altro esempio per capire come funzionano delle cose poi vi farò sapere ^^), o la possibilità di modellare qualcosa di veloce e possibilmente indolore...&lt;br /&gt;&lt;br /&gt;Secondo voi se state a leggere queste righe, cosa avrò mai fatto?&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;Quando stavo pensando a cosa poter fare, mi sono girato di scatto a destra sentondo un ronzio di una zanzare (maledetta!) e cosa ho visto?&lt;br /&gt;La poltrona!&lt;br /&gt;E allora ho cominciato a modellare la poltroncina che ho di fianco, cercando di mantenere una struttura semplice.&lt;br /&gt;Il risultato dopo 15-20 minuti di lavoro è stato il seguente:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm3.static.flickr.com/2672/3792200097_4f4ce967e7_o.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 86px; height: 100px;" src="http://farm3.static.flickr.com/2672/3792200097_3c2b28590d_t.jpg" alt="" border="0" /&gt;&lt;/a&gt;Devo dire che il mio stesso lavoro non mi è piaciuto più di tanto... Sinceramente speravo di giungere ad un risultato migliore.... Ok direte voi potevi interrompere o modificare il tutto, ma quanto mi prendono questi "attacchi" non posso: come chi butta giù una bozza non si ferma fino a lavoro finito io faccio lo stesso. Non mollo fino a quando non sento che sono arrivato alla fine.&lt;br /&gt;Erò però deciso a fare di meglio.&lt;br /&gt;Ho quindi cercanto sul mitico Google qualche immagine di poltrone (cavolo non pensavo ce ne potessero essere di tanti tipi, forme, stili, decorate e non, moderne o romantiche, etc....&lt;br /&gt;Insomma dopo un quarto d'ora buono a spulciare poltrone, ho trovato quella con la forma che facaveva al caso mio.&lt;br /&gt;Altri 20 minuti di lavoro ed ecco il risultato:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3568/3787587819_674e723c8a_o.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 100px; height: 86px;" src="http://farm4.static.flickr.com/3568/3787587819_c2019ba18a_t.jpg" alt="" border="0" /&gt;&lt;/a&gt;Ora si che ero abbastanza soddisfatto del mio operato.&lt;br /&gt;Non ci avrei dormito bene la notte poi (tutte balle XD).&lt;br /&gt;Quindi ora dovevo solo scegliere il colore, controllare il codice sul catalogo, compilare il modulo e l'ordinazione era pronta...&lt;br /&gt;Ok sto delirando!&lt;br /&gt;&lt;br /&gt;Dopo qualche prova di texturizzazione, e qualche rendering andato male, questo è stato il mio risultato:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3431/3787587827_8e70aed837_o.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 100px; height: 80px;" src="http://farm4.static.flickr.com/3431/3787587827_83dbd22a41_t.jpg" alt="" border="0" /&gt;&lt;/a&gt;Se volete il prezzo per il prodotto è di 70€ spese di spedizione escluse (XD).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Tutto sommato mi sono divertito.&lt;br /&gt;Spero vi piaccia, anche se non è proprio il massimo lo so... come al solito potevo spenderci un po' più di tempo e forse veniva meglio...&lt;br /&gt;Comunque basta piangere.&lt;br /&gt;&lt;br /&gt;Se avete qualche commento, prego non esitate :)&lt;br /&gt;&lt;br /&gt;Alla prossima!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-6353330328329333478?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/6353330328329333478/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=6353330328329333478' title='3 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/6353330328329333478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/6353330328329333478'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2009/08/fast-modelling-8-armchair.html' title='Fast Modelling 8 - armchair'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2672/3792200097_3c2b28590d_t.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-2593608654020661539</id><published>2009-07-31T19:30:00.003+02:00</published><updated>2009-10-18T17:30:18.453+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='The Xna-Way'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA Component'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Guida XNA'/><title type='text'>The Xna-Way: Tutorial 1: FPS Counter</title><content type='html'>Salve a tutti!&lt;br /&gt;Ho deciso di cominciare il prima possibile a scrivere qualcosa riguardante il magnifico mondo dell'XNA.&lt;br /&gt;Le mie conoscenze a riguardo sono per ora esigue, ed è per questo che ho deciso di scrivere qui quello che produrrò di "utile" di volta in volta, in modo da poter rendere diponibile ad altri quel poco che imparerò e per fare in modo che gli sventurati che capiteranno da queste parti e che ne sanno più di me, vedendo i miei strafaciolni, possano (se vogliono) correggermi!&lt;br /&gt;&lt;br /&gt;Detto questo cominciamo! ^^&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;Dato che ho appena incominciato ad avventurarmi in questo mondo non andrò a buttarmi in spiegazioni troppo complicate o astruse...&lt;br /&gt;Anche perchè il mio "sapere" aumenterà mano a mano che proseguirò con la lettura del manuale! Quindi per ora sono un po' a secco...&lt;br /&gt;&lt;br /&gt;Cosa abbiamo appreso intanto?&lt;br /&gt;Bè dopo aver scaricato dal sito della microsoft l'ultimo Microsoft Visual C# 2008 Express Edition e XNA 3.1, ho deciso di mettermi all'opera.&lt;br /&gt;Nota: io non ho una X-Box 360 (eh lo so sono stronzo ?_?), quindi tutto il codice che andrò a scrivere sarà per Windows.&lt;br /&gt;Naturalmente il codice potrà funzionare anche su una 360, solo che alle volte si dovranno fare delle modifiche. Quello che conta è che il concetto che sta dietro è lo stesso.&lt;br /&gt;&lt;br /&gt;Dopo la creazione di un nuovo progetto di prova quello che appare è un file &lt;span style="font-weight: bold;"&gt;Game1.cs&lt;/span&gt; contenente il seguente codice:&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt; public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Game1 : Microsoft.Xna.Framework.Game&lt;br /&gt;{&lt;br /&gt;    GraphicsDeviceManager graphics;&lt;br /&gt;    SpriteBatch spriteBatch;&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; Game1()&lt;br /&gt;    {&lt;br /&gt;        graphics = &lt;span class="kwrd"&gt;new&lt;/span&gt; GraphicsDeviceManager(&lt;span class="kwrd"&gt;this&lt;/span&gt;);&lt;br /&gt;        Content.RootDirectory = &lt;span class="str"&gt;"Content"&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Initialize()&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;base&lt;/span&gt;.Initialize();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; LoadContent()&lt;br /&gt;    {&lt;br /&gt;        spriteBatch = &lt;span class="kwrd"&gt;new&lt;/span&gt; SpriteBatch(GraphicsDevice);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; UnloadContent()&lt;br /&gt;    {&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Update(GameTime gameTime)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)&lt;br /&gt;            &lt;span class="kwrd"&gt;this&lt;/span&gt;.Exit();&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;base&lt;/span&gt;.Update(gameTime);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Draw(GameTime gameTime)&lt;br /&gt;    {&lt;br /&gt;        GraphicsDevice.Clear(Color.CornflowerBlue);&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;base&lt;/span&gt;.Draw(gameTime);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;A cosa sono questi metodi a grandi linee?&lt;br /&gt;Il &lt;span style="font-weight: bold;"&gt;Game1()&lt;/span&gt; è il costrutture della nostra classe Game1, nella quale andremo a creare tutti gli oggetti che ci serviranno per la nostra applicazione.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Inizialize()&lt;/span&gt; è il metodo che viene chiamato dopo il costruttore, e qui andremo ad inizializzare tutti i valori che ci servono.&lt;br /&gt;Il &lt;span style="font-weight: bold;"&gt;LoadContent()&lt;/span&gt; viene chiamato dopo l'Initialize() e sarà il metodo dove inseriremo il caricamento dei file che ci servono, come i file audio, i modelli 3D, le immagini, etc. Insomma di tutta quella roba che sfrutta il il ContentPipeline di XNA per il caricamento degli elementi del gioco.&lt;br /&gt;Dal contempo l'&lt;span style="font-weight: bold;"&gt;UnloadContent &lt;/span&gt;viene chiamato alla chiusura dell'applicazione serve a liverare la memoria occupata dai file caricati.&lt;br /&gt;Il "cuore" della nostra applicazione sono i metodi &lt;span style="font-weight: bold;"&gt;Update&lt;/span&gt;() e Draw().&lt;br /&gt;Questi metodi vengono chiamati a ripetizione, cioè Upadate()-Draw()-Update()-Draw() e così via fino a quando non viene chiusa l'appliacazione.&lt;br /&gt;In Update() verrà messo il codice che serve ad aggiornare lo stato del nostro gioco, come la posizione della telecamera, la posizione dei nemici,...&lt;br /&gt;Nel metodo Draw() tutto il codice che serve a disegnare, a renderizzare, la scena del gioco a schermo.&lt;br /&gt;&lt;br /&gt;Se facciamo partire il programma adesso l'unica cosa che vedremo è una scena vuota a tinta unita.&lt;br /&gt;&lt;br /&gt;Cosa vogliamo fare adesso?&lt;br /&gt;Bè io intanto volevo vedere gli FPS della scena, anche per rendermi conto quando va veloce il tutto ^^&lt;br /&gt;&lt;br /&gt;Si potrebbe pensare di mettere tutto il codice che ci serve nel file Game1.cs.&lt;br /&gt;Certo funzionerebbe, ma dopo che avevo cominciato a scrivere qualcosa mi sono renso conto di questo: adesso metto il conteggio dei frame nel Draw(), poi dovrò renderizzare altri elementi quando mi servono, poi potrei voler fare qualche altra cosa etc.&lt;br /&gt;Tutto questo dopo un po' renderebbe le cose confusionarie, portanto il codice ad una cattiva lettura e bassa possibilità di fare manutenzione e correzione.&lt;br /&gt;Poi diciamocelo, C# è un linguaggio ad oggetti e ci sarà pure il modo di fare fare un oggetto che mi faccia il conto degli FPS da solo e possibilmente in automatico!&lt;br /&gt;Meglio quindi cercare una soluzione più comoda e al contempo performante, cercando al contempo di suddividere il codice in più unità logiche cooperanti.&lt;br /&gt;&lt;br /&gt;Con XNA possiamo utilizzare i GameComponents. Con i GameComponent possiamo organizzare al loro interno parte delle operazioni che vogliamo far fare al nostro gioco, e queste operazioni saranno poi richiamate automaticamente dal Framework di XNA.&lt;br /&gt;Infatti XNA ci da la possibilità di gestire una collezione di GameComponents, alla quale possiamo aggiungere gli elementi che vogliamo siano gestiti come GameComponent.&lt;br /&gt;Quindi in questo caso possiamo creare un GameComponent per il calcolo degli FPS, un GameComponent per la gestione e il movimento della telecamera, etc.&lt;br /&gt;Però non dobbiamo pensare che per ogni oggetto che vogliamo gestire si possa creare un GameComponent non va bene. Ma per ora questa cosa non ci tocca. Si affronterà in seguito.&lt;br /&gt;Andiamo quindi a creare il codice del nostro FPS Counter.&lt;br /&gt;&lt;br /&gt;Per avere un'ulteriore suddivisione tra il codice del gioco e dei vari elementi che andremo a creare ho deciso di mettere tutti gli elementi in una GameLibrary (nel mio caso una WindowsGameLibrary, chi volesse provare il codice su una 360 devrà creare una X-BOX 360 Library).&lt;br /&gt;&lt;br /&gt;Ho quindi creato il mio progetto libreria, chiamato myLibrary (che fantasia -.-).&lt;br /&gt;Aggiungiamo un nuovo elemento al progetto, aggiungendo un GameComponent e chiamiamolo FPSCounter.&lt;br /&gt;Fatto questo invece di far derivare FPSCounter da GameComponent facciamolo derivare da DrawableGameComponent, in questo modo il nostro FPSCount avrà il suo metodo Draw che verrà chiamato in automatico da XNA! (invece il GameComponent classico non offre questo metodo). E voi come direte... e ce ne importa del metodo Draw()?&lt;br /&gt;Bè per contare gli FPS ci serve il metodo Draw() dato che gli FPS indicano il numero di volte al secondo che una scena viene renderizzata.&lt;br /&gt;&lt;br /&gt;Per calcolare il valore FPS ci servono le seguenti variabili:&lt;br /&gt;una variabile per tenere a mente il numero di volte che abbiamo renderizzato la scena (frameCount)&lt;br /&gt;una varibile per tenere a mente quando abbiamo renderizzato l'ultima volta la scena (timeLastDraw)&lt;br /&gt;Quelle che ho usato io, e che ho definito nella classe FPSCounter sono:&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; frameCount = 0;&lt;br /&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;float&lt;/span&gt; intervall;&lt;br /&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;float&lt;/span&gt; elapsedTime;&lt;br /&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;float&lt;/span&gt; timeLastDraw;&lt;br /&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;float&lt;/span&gt; fpsValue;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;Dove intervall è l'intervallo in cui voglio misurare il numero di frame (in questo caso un secondo).&lt;br /&gt;elapsedTime contiene il tempo che è passato dall'ultima invocazione di Draw().&lt;br /&gt;fpsValue non credo che abbia bisogno di spiegazioni ^^.&lt;br /&gt;&lt;br /&gt;L'unico metodo che ci interessa è il Draw(), ed è questo che andremo a ridefinire.&lt;br /&gt;Tutti gli altri, costruttore a parte, possono essere cancellati.&lt;br /&gt;Per ora nel costruttore mettiamo solo&lt;br /&gt;&lt;code&gt;intervall = 1.0f;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;mentre il metodo Draw() sarà così fatto:&lt;br /&gt;&lt;pre class="csharpcode"&gt;elapsedTime = (&lt;span class="kwrd"&gt;float&lt;/span&gt;)gameTime.ElapsedRealTime.TotalSeconds;&lt;br /&gt;frameCount++;&lt;br /&gt;timeLastDraw += elapsedTime;&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (timeLastDraw &amp;gt; intervall)&lt;br /&gt;{&lt;br /&gt;  fpsValue = frameCount / intervall;&lt;br /&gt;  frameCount = 0;&lt;br /&gt;  timeLastDraw -= intervall;&lt;br /&gt;  Game.Window.Title = fpsValue.ToString();&lt;br /&gt;}&lt;br /&gt;&lt;span class="kwrd"&gt;base&lt;/span&gt;.Draw(gameTime);&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;prima ci calcoliamo quanto tempo è passato dall'ultima invocazione di Draw(), poi incrementiamo il frameCount, ed aggiungiamo il valore di elapsedTime a timeLastDraw, e poi controlliamo il valore di timeLastDraw.&lt;br /&gt;Se il suo valore è maggiore di intervall, quindi di un secondo, calcolo il valore di fpsValue, azzero il frameCount, sottraggo intervall a timeLastDraw.&lt;br /&gt;Come ultima operazione mostro il valore di fpsValue nella barra del titolo della finestra in cui è avviata l'applicazione (questo fa solo su Windows).&lt;br /&gt;&lt;br /&gt;Ok fatto questo dobbiamo ora avviare il counter assieme al programma.&lt;br /&gt;Come collegarla con la nostra applicazione, e cioè con il Game1.cs?&lt;br /&gt;Prima di tutto aggiungiamo il riferimento alla nostra libreria: nell'esplora soluzioni facciamo tassto destro su riferimenti-&gt;aggiungi riferimento-&gt;scheda progetti-&gt;selezioniamo il nostro progetto myLibrary.&lt;br /&gt;Fatto questo in vetta al file Game1.cs, sotto tutti gli altri using, mettiamo questa riga:&lt;br /&gt;&lt;code&gt;using myLibrary&lt;/code&gt;&lt;br /&gt;Nel file Game1.cs mettiamo una varibile di classe come questa:&lt;br /&gt;&lt;pre class="csharpcode"&gt;FPSCounter counter;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;e dentro il costruttore di Game1.cs aggiungiamo:&lt;br /&gt;&lt;pre class="csharpcode"&gt;counter = &lt;span class="kwrd"&gt;new&lt;/span&gt; FPSCounter(&lt;span class="kwrd"&gt;this&lt;/span&gt;);&lt;br /&gt;Components.Add(counter);&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;Queste righe creano un nuovo FPSCounter e lo aggiungono alla collezione di GameComponent del nostro gioco.&lt;br /&gt;Ricordo che i GameComponent vengono eseguiti automaticamente da XNA.&lt;br /&gt;&lt;br /&gt;Quello che vi dovrebbe apparire è un valore nella barra del titolo al posto del nome della vostra applicazione.&lt;br /&gt;Dovrebbe apparirivi un valore pari a 60, o che oscilla tra 58 e 60.&lt;br /&gt;Ora dico...&lt;br /&gt;Ho rifatto nuovo il portatile, e avere un "gioco" senza nulla scena che mi da 60 FPS mi pare un po' pochino...&lt;br /&gt;&lt;br /&gt;Perchè accade questo?&lt;br /&gt;Perchè XNA è impostato per fare il ciclo di chiamata Update-Draw 60 volte al secondo.&lt;br /&gt;Quindi se anche fosse possibile renderizzare ad una velocità più alta lui la limita.&lt;br /&gt;&lt;br /&gt;Come possiamo ovviare a questo limite?&lt;br /&gt;Per renderizzare al massimo della velocità dobbiamo mettere queste righe di codice nel costruttore di FPS:&lt;br /&gt;&lt;pre class="csharpcode"&gt;GraphicsDeviceManager manager = (GraphicsDeviceManager)Game.Services.GetService(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(IGraphicsDeviceManager));&lt;br /&gt;&lt;br /&gt;manager.SynchronizeWithVerticalRetrace = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;br /&gt;Game.IsFixedTimeStep = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;Con queste andiamo a prendere il servizio che fa da gestore per la grafica del gioco,&lt;br /&gt;e con le altre righe gli diciamo che deve renderizzare il più velocemente possibile.&lt;br /&gt;Più precisamente: mettendo a false il valore SynchronizeWithVerticalRetrace dico che non deve sincronizzarsi con la frequenza del monitor, mentre con IsFixedTimeStep a false dico che non deve chiamare il metodo Update alla frequenza di default di 60 volte al secondo.&lt;br /&gt;&lt;br /&gt;Facendo rieseguire ora ottengo un valore che si aggira sui 1500 FPS...&lt;br /&gt;Già meglio cavolo :)&lt;br /&gt;&lt;br /&gt;Per ora basta gente ^^&lt;br /&gt;Spero di essere stato chiaro.&lt;br /&gt;Come sempre se qualcosa non torna, se volete esprimere un commento, proporre una modifica, etc, siete liberissimi di farlo!&lt;br /&gt;&lt;br /&gt;Ecco intanto il codice prodotto fino ad ora!&lt;br /&gt;&lt;a style="color: rgb(51, 204, 0);" href="http://odino87.interfree.it/XNA/XNA-tut1.rar"&gt;&lt;span style="font-weight: bold;"&gt;XNA-tut1.rar&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Alla possima!&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-2593608654020661539?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/2593608654020661539/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=2593608654020661539' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/2593608654020661539'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/2593608654020661539'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2009/07/xna-way-tutorial-1-fps-counter.html' title='The Xna-Way: Tutorial 1: FPS Counter'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-7287187167419996739</id><published>2009-07-29T19:16:00.002+02:00</published><updated>2009-07-29T19:22:07.420+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3D'/><category scheme='http://www.blogger.com/atom/ns#' term='Lavori'/><category scheme='http://www.blogger.com/atom/ns#' term='Fast Modelling'/><category scheme='http://www.blogger.com/atom/ns#' term='Lightwave'/><title type='text'>Fast Modelling 7 - GamePad</title><content type='html'>Cosa fare quando si è stanchi fisicamente, quando non avete voglia di fare un po' di fatica fisica, quando avete la testa che vi fa male, quando avete la mente assillata da pensieri che non pensavate di avere e che alle volte non vorreste avere?&lt;br /&gt;&lt;br /&gt;Ma buttiamoci sulla modellazazione e vediamo di fare qualcosa...&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;Cosa si realizza oggi?&lt;br /&gt;Avevo accando al pc un gamePad, quindi senza pensarci troppo su ho cominciato a modellare un cavolo di gamePad...&lt;br /&gt;&lt;br /&gt;Devo dire che il design non mi piace per niente, poteva essere fatto meglio.&lt;br /&gt;Avrei potuto avere anche un workFlow migliore...&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3535/3768898625_1630d7fdcb_o.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 240px; height: 182px;" src="http://farm4.static.flickr.com/3535/3768898625_6f0a27946c_m.jpg" border="0" alt="" /&gt;&lt;/a&gt;Avrei potuto fare tante cose molto meglio, ma è andata così...&lt;br /&gt;Tempo di realizzazione?&lt;br /&gt;Direi circa 30 minuti, comprendendo controlli a forum e siti nel frattempo...&lt;br /&gt;&lt;br /&gt;30 minuti in cui ho tenuto la testa occupata e in cui non ho pensato a nulla?&lt;br /&gt;Magari... 30 minuti passati a modellare sto coso, sempre assillato da questo rumore di sottofondo che è la mia mente, ottenendo solo un qualcosa che mi convince poco e nulla...&lt;br /&gt;&lt;br /&gt;Se avrò tempo e voglia vedrò di modificarlo e di fare un rendering (spero decente).&lt;br /&gt;&lt;br /&gt;Alla prossima!&lt;br /&gt;Sperando di essere più in forma...&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-7287187167419996739?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/7287187167419996739/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=7287187167419996739' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/7287187167419996739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/7287187167419996739'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2009/07/fast-modelling-7-gamepad.html' title='Fast Modelling 7 - GamePad'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3535/3768898625_6f0a27946c_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-8426971330395518684</id><published>2009-07-26T12:30:00.004+02:00</published><updated>2009-07-26T14:54:16.749+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='The Xna-Way'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='comunicazioni'/><title type='text'>The Xna-Way</title><content type='html'>Piccola comunicazione.&lt;br /&gt;Dato che adesso ho un po' più di tempo libero davanti a me, causa "vacanze estive" (se così si possono chiamare) ho il tempo di dedicarmi alla lettura e allo studio del manualone sull'XNA.&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;Quindi molto probabilmente comincerò a scrivere qualche programmino per XNA, e credo che posterò qua i risultati, il codice e se riesco qualche piccolo tutorial o aiuto.&lt;br /&gt;Non per farmi passare per un esperto, solo che cominciando a studiarlo voglio condividere con chi è interessato i miei dubbi, "scoperte" e piccoli passi in avanti.&lt;br /&gt;Così almeno chi ne sa più di me potrà darmi qualche capaccione e rimettermi sulla giusta strada :)&lt;br /&gt;&lt;br /&gt;E per questo che in alto è stata aggiunta alla barra la voce Xna-Way, sotto il cui nome andranno tutti i post riguardati questo tema.&lt;br /&gt;&lt;br /&gt;Nota: oltre alla voce Xna-Way è stata aggiunta quella per Lightwave, dato che ormai cominciano ad esserci diversi post a riguardo.&lt;br /&gt;&lt;br /&gt;Alla prossima, e spero con un po' di nuovo materiale! :)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-8426971330395518684?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/8426971330395518684/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=8426971330395518684' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/8426971330395518684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/8426971330395518684'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2009/07/xna-way.html' title='The Xna-Way'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-4536322816224930429</id><published>2009-07-25T13:00:00.004+02:00</published><updated>2009-07-26T15:33:54.093+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3D'/><category scheme='http://www.blogger.com/atom/ns#' term='Rendering'/><category scheme='http://www.blogger.com/atom/ns#' term='Lavori'/><category scheme='http://www.blogger.com/atom/ns#' term='Fast Modelling'/><category scheme='http://www.blogger.com/atom/ns#' term='Lightwave'/><title type='text'>Fast Modelling 6 - Ampolla</title><content type='html'>Anche oggi ero in vena di fare alcune prove.&lt;br /&gt;Sto cercando di sbizzarirmi in nuove scene e di vedere come vengono elborate le varie parti.&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;Anche questa volta la scena è semplicissima:&lt;br /&gt;un'ampolla, con dentro un pianeta o_O&lt;br /&gt;Ok non è che sia proprio il massimo come realismo lo ammetto, ma mi è venuto in mento quando ho ripensato alla scena finale di Men In Black (mitico film :D).&lt;br /&gt;Quindi ho pensato di fare un qualcosa di simile.&lt;br /&gt;&lt;br /&gt;Dopo aver creato la scena, ho deciso di mettere più copie dello stesso oggetto, in modo che ottenere anche più riflessioni tra le varie copie.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm3.static.flickr.com/2562/3754787584_81c70eccf3_b.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 100px; height: 75px;" src="http://farm3.static.flickr.com/2562/3754787584_81c70eccf3_t.jpg" border="0" alt="" /&gt;&lt;/a&gt;Come potete vedere l'effetto ottenuto non è che sia proprio realistico, ma guardando le altre ampolle in secondo piano si nota che ci sono i riflessi.&lt;br /&gt;Mi sono fatto un'idea anche di come risulta l'effetto di rifrazione nei materiali trasparenti. Il problema è quando questo effetto è comulativo tra più oggetti int trasparenza.&lt;br /&gt;Per complicare ancola la scena ho voluto che il piano di appoggio funzionasse come uno specchio!&lt;br /&gt;In questo modo si sarebbe visto anche la parte bassa delle ampolle.&lt;br /&gt;&lt;br /&gt;Per finire ho provato a dare un effetto di profondità di campo (depth of field): per chi non sa cosa sia pensate a quando mettete a fuoco un oggetto. Tutto quello che sta dietro non è messo a fuoco, ma vi appare sfuocato. Ecco in parole povere cosa volevo ottenere.&lt;br /&gt;&lt;br /&gt;Come di nota dall'immagine questo effetto non è che sia propriamente realizzato bene. Infatti avrei voluto fare un altro rendering con impostazioni diverse, ma dopo circa 30 minuti di render non avevo voglia di stare ad aspettare ancora.&lt;br /&gt;&lt;br /&gt;Spero di vi piaccia!&lt;br /&gt;&lt;br /&gt;Alla prossima. :D&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-4536322816224930429?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/4536322816224930429/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=4536322816224930429' title='2 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/4536322816224930429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/4536322816224930429'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2009/07/fast-modelling-6-ampolla.html' title='Fast Modelling 6 - Ampolla'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2562/3754787584_81c70eccf3_t.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-383189289978680736</id><published>2009-07-20T23:53:00.008+02:00</published><updated>2009-07-21T00:09:41.806+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3D'/><category scheme='http://www.blogger.com/atom/ns#' term='Rendering'/><category scheme='http://www.blogger.com/atom/ns#' term='Lavori'/><category scheme='http://www.blogger.com/atom/ns#' term='Fast Modelling'/><category scheme='http://www.blogger.com/atom/ns#' term='Lightwave'/><title type='text'>Fast Modelling 5 - Book's heart</title><content type='html'>Oggi mi giravano come pochi.&lt;br /&gt;Motivo? Esame bocciato, ma questa è un'altra storia di cui non voglio parlare qua per non appestarvi troppo...&lt;br /&gt;&lt;br /&gt;Comunque, dopo essermi sfogato, ho detto "abbiamo il piccio nuovo, facciamolo lavorare.... dè" (il dè in fondo ci sta sempre bene! :P)&lt;br /&gt;&lt;br /&gt;Ma fare cosa?&lt;br /&gt;Cosa si potrebbe fare di bellino e divertente?&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;Complice il fatto che sono stato 4 giorni ad solo a Pisa a fracassarmi i così detti, e avendo quindi molto tempo per pensare a tutto e di più (cosa che alle volte odio!), e complice anche le brevi meditazioni che ho fatto (anche quelle dovrei smettere mi sa, più si scava peggio è -.-)... insomma sta di fatto che con la malinconia che mi è presa mi è tornata alla mente una foto che vidi tempo fa su Deviant Art.&lt;br /&gt;&lt;br /&gt;La foto consisteva in un anello messo in equilibrio su un libro aperto, con una luce alle spalle...&lt;br /&gt;Bella roba direte voi!&lt;br /&gt;Invece vi posso dire che come immagine è molto bella :)&lt;br /&gt;&lt;br /&gt;Io non contento ci ho messo pure una sfera tanto per complicarmi un po' la vita XD&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm3.static.flickr.com/2581/3739931943_ef16dcbb55_b.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 100px; height: 63px;" src="http://farm3.static.flickr.com/2581/3739931943_ef16dcbb55_t.jpg" border="0" alt="" /&gt;&lt;/a&gt;Come si può vedere qua la modellazione è presente solo di nome! Fare una sfera, un anello, un qualcosa che assomiglia ad un libro non è che sia un impegno gravoso...&lt;br /&gt;Ma andiamo avanti va!&lt;br /&gt;&lt;br /&gt;Quello che veramente mi interessava era il rendering di questa scena, e come potete capire quello sopra era solo una prova ^^&lt;br /&gt;Dopo svariate prove, quello che ho ottenuto è stato questo!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm3.static.flickr.com/2641/3739914565_56ea0bb0a0_b.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 100px; height: 63px;" src="http://farm3.static.flickr.com/2641/3739914565_56ea0bb0a0_t.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3524/3739915813_571fd98d10_b.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 100px; height: 63px;" src="http://farm4.static.flickr.com/3524/3739915813_571fd98d10_t.jpg" border="0" alt="" /&gt;&lt;/a&gt;Nella prima immagine c'è una sola luce, alle "spalle" della sfera (si potrà dire le spalle della sfera? XD), mentre nella seconda le luci sono 3, una alla destra e una alla sinistra della sfera.&lt;br /&gt;Come potete vedere con le ombre proiettate hanno una forma particolare!&lt;br /&gt;Scommetto che non ci avevate pensato eh ^__^&lt;br /&gt;&lt;br /&gt;Bè come esercizio non è che fosse complicatissimo.&lt;br /&gt;Volevo solo fare qualche prova con le luci (per la cronaca: le tre luci sono di tipo Spot, per capirci meglio come se fossero proiettate da una torcia), e giocare un po' sulle ombre e trasparenze!&lt;br /&gt;&lt;br /&gt;Spero vi piaccia come immagine! :)&lt;br /&gt;&lt;br /&gt;Come sempre sentitevi liberi di commentare o di proporre miglioramenti!&lt;br /&gt;&lt;br /&gt;Alla prossima gente :D&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-383189289978680736?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/383189289978680736/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=383189289978680736' title='3 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/383189289978680736'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/383189289978680736'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2009/07/fast-modelling-5-books-heart.html' title='Fast Modelling 5 - Book&apos;s heart'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2581/3739931943_ef16dcbb55_t.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-6526164278160851697</id><published>2009-07-17T18:51:00.017+02:00</published><updated>2009-07-21T00:15:51.530+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3D'/><category scheme='http://www.blogger.com/atom/ns#' term='Rendering'/><category scheme='http://www.blogger.com/atom/ns#' term='Lavori'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows 7'/><category scheme='http://www.blogger.com/atom/ns#' term='Lightwave'/><category scheme='http://www.blogger.com/atom/ns#' term='Gunblade'/><category scheme='http://www.blogger.com/atom/ns#' term='comunicazioni'/><title type='text'>Windows 7</title><content type='html'>Cominciamo a dire qualche cosina, e dare le prime impressioni su questo nuovo SO.&lt;br /&gt;&lt;img src="http://farm4.static.flickr.com/3481/3730035554_143e454121_m.jpg"/&gt;Premetto che fino a quando non ho cambiato portatile ho sempre usato XP (ed Ubunto per l'università, ma questa è un'altra cosa).&lt;br /&gt;Quindi pensavo di trovarmi maluccio con win7...&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;Sul portatile come accade oramai c'era installato Windows Vista... anche se da come andava mi pareva che alla Microsoft abbiano avuto più che altro una grande sVista!&lt;br /&gt;Cioè lento, si bloccava per il trasferimento dei file, poi di default chiede ogni volta la conferma per installare o anche solo copiare un file...&lt;br /&gt;Poi alcune cose sono veramente fatte da cani: per riuscire a raggiungere le proprietà per la configurazione della scheda di rete e mettere un cavolo di indirizzo IP statico si deve fare i salti mortali!&lt;br /&gt;&lt;br /&gt;Dove diavolo è finita la semplicità di XP?&lt;br /&gt;Secondo me come è vietato guidare sotto l'effetto dell'alchool o degli stupefacenti dovrebbero pure vietare di programmarci!&lt;br /&gt;&lt;br /&gt;Quindi cosa ho fatto?&lt;br /&gt;Mi sono scaricato la ISO di Win7, burnata ed installata.&lt;br /&gt;&lt;br /&gt;Prima nota positiva: un partition manager fatto bene!&lt;br /&gt;Per non parlare del fatto che l'installazione è velocissima! Ci mette meno di XP (ok che sono diventati più veloci i pc ^^).&lt;br /&gt;&lt;br /&gt;Dopo l'installazione ci vuole un po' per prendere la mano... almeno a me che non ho usato Vista (da cui / ha breso la sua base).&lt;br /&gt;Alcune icoone e funzioni sono state spostate (per esempio il tasto per visualizzare il desktop ora si trova nell'angolo in basso a destra! Che fatica a trovarlo XD).&lt;br /&gt;Prima cosa che si nota: boot velocissimo e sistema stabile e veloce, ultra reattivo!&lt;br /&gt;E' tutto il giorno che è acceso, installa, faccio i benchmark, provo e riprovo e non si è piantato mai una volta!&lt;br /&gt;MAI un rallentamento, un accenno a prendere fiato!&lt;br /&gt;&lt;br /&gt;Anche l'aspetto grafico è curato e carino.&lt;br /&gt;Poi anche Areo, che sinceramente pensavo peso ed inutile, è comodo e veloce, e non cunsuma eccesive risorse: se non sapessi che è attivo non me ne accorgerei nemmeno!&lt;br /&gt;Per alcuni effetti mi ricorda molto le ultime distro di Linux, con tutti quegli strani effettini.&lt;br /&gt;&lt;br /&gt;Altre note?&lt;br /&gt;Gestione dei programmi veramente buona.&lt;br /&gt;Ho provato a fare dei render che feci tempo fa sul vecchio portatile, e ora il tempo di resa è circa 1/10 o meno di quello precedente (merito anche del processore molto più potente, ma anche il SO operativo aiuta, dato che 7 ha buona gestione della memoria!).&lt;br /&gt;Addirittura sono riuscito a fare un render che prima non sarei riuscito a fare!&lt;br /&gt;Alta risoluzione, anti-Aliasing ed altri effetti (solo per appesantire, tanto la differenza ad occhio si notava poco), e devo dire che è andata bene!&lt;br /&gt;Ci ha messo 20 minuti per renderizzare il tutto, ma nel frattempo navigavo, scrivevo, ascoltavo musica, vedevo un filmato su youTube, installavo AdobeReader, etc... e non si è minimamente impensierito!&lt;br /&gt;Andato avanti fino alla fine senza un tentennamento!&lt;br /&gt;&lt;br /&gt;Ho trovato un'unica pecca, e cioè che come vista occupa circa 1 gB di ram...&lt;br /&gt;Ma che ci vogliamo fare, non esistono più i SO che partono in 200 MB di ram ^^&lt;br /&gt;&lt;br /&gt;Che dire gente!&lt;br /&gt;Accorrete ed installate!&lt;br /&gt;&lt;br /&gt;Ecco i 2 render di prova che ho fatto!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm3.static.flickr.com/2644/3729240453_866cd8aa9d_b.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 100px; height: 100px;" src="http://farm3.static.flickr.com/2518/3729238281_d579d4f943_t.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;Dimensione: 1800x2400 px&lt;br /&gt;Tempo di resa: circa 80 secondi - contro gli oltre 10 minuti sul vecchi portatile&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm3.static.flickr.com/2518/3729238281_d579d4f943_b.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 75px; height: 100px;" src="http://farm3.static.flickr.com/2644/3729240453_866cd8aa9d_t.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;Dimensione: 2000x2000&lt;br /&gt;Tempo di resa: 20 minuti circa - contro un spegnimento a stronco all'incirca dopo 2 minuti sul vecchio portatile.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ci sentiamo presto!&lt;br /&gt;Alla prossima!&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-6526164278160851697?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/6526164278160851697/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=6526164278160851697' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/6526164278160851697'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/6526164278160851697'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2009/07/windows-7.html' title='Windows 7'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3481/3730035554_143e454121_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-1379373444040431774</id><published>2009-07-17T15:38:00.001+02:00</published><updated>2009-07-17T15:39:18.580+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='comunicazioni'/><title type='text'>Si riparte!</title><content type='html'>Nuovo portatile preso!&lt;br /&gt;Funziona benone, è una potenza!&lt;br /&gt;&lt;br /&gt;Si può quindi ricominciare a lavoricchiare... anche se ora c'è da reinstallare ogni cosa...&lt;br /&gt;Con tanta calma di farà tutto! Forza e coraggio! &lt;span class="fullpost"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-1379373444040431774?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/1379373444040431774/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=1379373444040431774' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/1379373444040431774'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/1379373444040431774'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2009/07/si-riparte.html' title='Si riparte!'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-7556492451713968141</id><published>2009-07-16T07:57:00.002+02:00</published><updated>2009-07-16T07:59:09.448+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='comunicazioni'/><title type='text'>Ancora poco</title><content type='html'>Finalmente ho comprato un nuovo portatile.&lt;br /&gt;Questo significa che tra poco potrò di nuovo tornare a lavorare.&lt;br /&gt;Datemi solo il tempo di installare i sistemi operativi che mi servono e i vari programmi.&lt;br /&gt;&lt;br /&gt;A presto!&lt;span class="fullpost"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-7556492451713968141?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/7556492451713968141/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=7556492451713968141' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/7556492451713968141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/7556492451713968141'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2009/07/ancora-poco.html' title='Ancora poco'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-6721932109989560811</id><published>2009-07-01T19:34:00.002+02:00</published><updated>2009-07-01T19:36:07.343+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='comunicazioni'/><title type='text'>Una notizia positiva</title><content type='html'>Sono riuscito a recuperare i dati dall'HD del mio portatile.&lt;br /&gt;Almeno una cosa positiva in questi giorni...&lt;br /&gt;Ora siamo alla ricerca di qualche offerta per un portatile...&lt;br /&gt;Speriamo di non svenarci troppo!&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-6721932109989560811?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/6721932109989560811/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=6721932109989560811' title='3 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/6721932109989560811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/6721932109989560811'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2009/07/una-notizia-positiva.html' title='Una notizia positiva'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-1449157534590255739</id><published>2009-06-26T23:03:00.002+02:00</published><updated>2009-06-26T23:06:47.634+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lamentazioni'/><category scheme='http://www.blogger.com/atom/ns#' term='comunicazioni'/><title type='text'>Momentanea assenza forzata</title><content type='html'>Come dice il titolo mi tocca momentaneamente sospendere la pubblicazione di contenuti... Potrò semmai postare qualche lamentazione o riflessione, ma per ora niente più lavori...&lt;br /&gt;Ho dei problemi con il portatile sul quale ho tutti i dati, e mannaggia a me ancora non sono riuscito a recuperarli.&lt;br /&gt;Il povero pc sembra abbia tirato le cuoia, anche se io spero di riscire a ripararlo più che comprarlo nuovo.&lt;br /&gt;&lt;br /&gt;A più presto possibile con (spero buone) nuove!&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-1449157534590255739?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/1449157534590255739/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=1449157534590255739' title='1 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/1449157534590255739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/1449157534590255739'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2009/06/momentanea-assenza-forzata.html' title='Momentanea assenza forzata'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-7560596961716731473</id><published>2009-06-21T00:44:00.005+02:00</published><updated>2009-06-21T01:18:05.528+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3D'/><category scheme='http://www.blogger.com/atom/ns#' term='Rendering'/><category scheme='http://www.blogger.com/atom/ns#' term='Lavori'/><category scheme='http://www.blogger.com/atom/ns#' term='Fast Modelling'/><category scheme='http://www.blogger.com/atom/ns#' term='Lightwave'/><title type='text'>Fast Modelling 4 - Bottiglia in LightWave</title><content type='html'>Un altra piccola prova per esercitarsi con LW.&lt;br /&gt;Ogni tanto mi piglia il pazzo e mi ci butto così che ci posso fare!&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;Questa volta è toccato un piccolo esercizio di rendering.&lt;br /&gt;Volevo provare a fare un render un po' più realistico, non fotorealistico ma un po' più somigliate alla realtà.&lt;br /&gt;Ho fatto una piccola bottiglia, un piano, qualche sfera messa a caso (dentro la bottiglia)... Insomma una scenetta semplice semplice.&lt;br /&gt;&lt;br /&gt;La difficoltà era nel fare un buon render...&lt;br /&gt;Dopo aver applicato un materiale di tipo vitreo agli oggetti mi sono sbizzarrito in varie prove di resa.&lt;br /&gt;Non facile devo dire, quando ci si trova davanti a tutte quelle impostazioni, valori da cambiare, provare, etc.&lt;br /&gt;&lt;br /&gt;Poi, cercando anche tra i vari tutorial che avevo raccolto, mi sono imbattuto in uno sull'HDRI.&lt;br /&gt;Poche semplici impostazioni, caricando un'immagine per HDRI e usandola nell'ImageWorld.&lt;br /&gt;Un render di prova senza nemmeno apportare modifiche alla scena o altro e il risultato è stato questo!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3326/3644522363_a2887fc71c_o.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 100px; height: 75px;" src="http://farm4.static.flickr.com/3326/3644522363_d5a71c3a38_t.jpg" border="0" alt="" /&gt;&lt;/a&gt;Mi piace come effetto!&lt;br /&gt;Controlla "da solo" le riflessioni, la luminosità, etc...&lt;br /&gt;Credo che sia così almeno, devo studiarlo meglio e fare altre prove.&lt;br /&gt;&lt;br /&gt;Lo so, avete delle domande:&lt;br /&gt;- Come si sono entrate le sfere dato che sono troppo grandi per poter essere infilate dal foro della bottiglia?&lt;br /&gt;- cosa conteneva la bottiglia e chi si è scolato il contenuto?&lt;br /&gt;Eh... I misteri della vita :D&lt;br /&gt;&lt;br /&gt;Alla prossima, sperando che non sia una bottigia...&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-7560596961716731473?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/7560596961716731473/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=7560596961716731473' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/7560596961716731473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/7560596961716731473'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2009/06/fast-modelling-4-bottiglia-in-lightwave.html' title='Fast Modelling 4 - Bottiglia in LightWave'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3326/3644522363_d5a71c3a38_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-4220695225510645417</id><published>2009-06-18T20:59:00.011+02:00</published><updated>2009-06-18T21:41:03.321+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3D'/><category scheme='http://www.blogger.com/atom/ns#' term='Lavori'/><category scheme='http://www.blogger.com/atom/ns#' term='Lightwave'/><title type='text'>LightWave - Cartoon soldier</title><content type='html'>Un altro lavoro è finito...&lt;br /&gt;O almeno è finito per me. Oramai è entrato nella parte della mia mente che fa parte di quelle cose che non verranno più toccate.&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;Mi sono deciso oggi, a mettermi a fare un po' di prove per il rendering.&lt;br /&gt;Prova qua, prova la (e tra un render e l'altro studiavo per l'esame) sono riuscito a raggiungere un risultato soddisfacente (almeno per me e per la voglia che avevo di completare il tutto).&lt;br /&gt;&lt;br /&gt;Ho tolto poi gli elementi strani, che facevan tanto androide o simili, che avevo aggiunto precedentemente.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3609/3638687453_b60065e8a5_o.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 100px; height: 75px;" src="http://farm4.static.flickr.com/3609/3638687453_fc058bc922_t.jpg" border="0" alt="" /&gt;&lt;/a&gt;Potevo fare di meglio lo so:&lt;br /&gt;- la pelle non è proprio venuta benissimo&lt;br /&gt;- potevo creare una barba/capelli/sopracciglia migliori&lt;br /&gt;- rendere migliore l'espressione&lt;br /&gt;- per li occhiali idem come sopra&lt;br /&gt;&lt;br /&gt;Però come ho detto stavo finendo la voglia di lavorarci, considerando poi che il pc non ce la fa a renderizzare bene scene troppo sofisticate (con conseguente spegnimento a stronco del computer, seguito da eresie lanciate da parte mia).&lt;br /&gt;&lt;br /&gt;Ecco poi a voi una vista totale del personaggio e del gatling:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3368/3639497734_b4afdd1127_o.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 100px; height: 80px;" src="http://farm4.static.flickr.com/3368/3639497734_96305a5e4c_t.jpg" border="0" alt="" /&gt;&lt;/a&gt;Per essere in stile cartoon non mi pare poi tanto male.&lt;br /&gt;Lo so cosa state pensando: si lo so che ha la pancia!&lt;br /&gt;Ci stava bene la pancetta :P&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Come sempre sono "poco soddisfatto" perchè so che volendo potrei fare molo meglio.&lt;br /&gt;Ma dato il periodo strano, e tanti altri motivi, non posso lamentarmi troppo...&lt;br /&gt;&lt;br /&gt;Spero vi piaccia!&lt;br /&gt;&lt;br /&gt;Alla prossima!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-4220695225510645417?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/4220695225510645417/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=4220695225510645417' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/4220695225510645417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/4220695225510645417'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2009/06/lightwave-cartoon-soldier.html' title='LightWave - Cartoon soldier'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3609/3638687453_fc058bc922_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-4610698263044639436</id><published>2009-06-17T13:22:00.019+02:00</published><updated>2009-06-17T20:27:59.573+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3D'/><category scheme='http://www.blogger.com/atom/ns#' term='Lavori'/><category scheme='http://www.blogger.com/atom/ns#' term='Fast Modelling'/><category scheme='http://www.blogger.com/atom/ns#' term='Lightwave'/><title type='text'>Fast Modelling 3 - Mano in LightWave</title><content type='html'>Vi capita mai di avere un mal di testa tale non potervci concentrare?&lt;br /&gt;E per quanto provate a non persarci, il dolore martellante continua incessante a rompervi le scatole?&lt;br /&gt;&lt;br /&gt;A me capita spesso in questo periodo!&lt;br /&gt;Ma oggi, anche se mi ha costretto ad abbandonare lo studio, mi sono messo all'opera cercando di distrarmi un poco.&lt;br /&gt;Il lavoro è fatto sotto l'effetto di una forte emicrania, quindi potrebbe non essere venuto fuori benissimo...&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;Sempre per la serie sketch veloci, fatti così su due piedi, ho deciso oggi di dedicarmi ad uno di quelli che riconosco essere uno dei miei punti deboli: le mani!&lt;br /&gt;Mi riescono sempre male a me le mani...&lt;br /&gt;Anche se di solito quando vado a modellare una mano arrivo che ho già il braccio fatto, e quindi non mi ritrovo più di tanto a collegare bene i due arti.&lt;br /&gt;Stavolta ho deciso di affrontare il problema dalla parte opposta!&lt;br /&gt;Sono partito quindi dalla falangetta del medio, cioè questa:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3410/3635659224_fa4e9d36de_o.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 100px; height: 70px;" src="http://farm4.static.flickr.com/3410/3635659224_fc711cef27_t.jpg" alt="" border="0" /&gt;&lt;/a&gt;Accidenti... ho creato il mio primo moncherino...&lt;br /&gt;Bhe è abbastanza semplice come pezzo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Poi la prosecuzione del lavoro è andata abbastanza spedita:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3376/3634848443_68ce36c383_o.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 100px; height: 58px;" src="http://farm4.static.flickr.com/3376/3634848443_4ee79e52f4_t.jpg" alt="" border="0" /&gt;&lt;/a&gt;prima ho dovuto creare il resto del dito, cosa immediata&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3301/3635659318_7b58c87817_o.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 100px; height: 51px;" src="http://farm4.static.flickr.com/3301/3635659318_cc316511f5_t.jpg" alt="" border="0" /&gt;&lt;/a&gt;e dato che non sono masochista, per la creazione delle altre dita ho clonato quello che avevo già fatto, e li ho rimpiccioliti in modo opportuno.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3634/3634848555_846e8d5b14_o.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 100px; height: 77px;" src="http://farm4.static.flickr.com/3634/3634848555_69e3ecb842_t.jpg" alt="" border="0" /&gt;&lt;/a&gt;Dopo aver clonato le dita, si è cominciato a creare la mano vera e propria.&lt;br /&gt;&lt;br /&gt;Il primo ostacolo che ho avuto è stato la creazione del pollice e la sua attacatura alla mano:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3654/3635659478_cd4e09ae75_b.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 100px; height: 48px;" src="http://farm4.static.flickr.com/3654/3635659478_cd4e09ae75_t.jpg" alt="" border="0" /&gt;&lt;/a&gt;ho riusato la falange creata per il medio, per poi attaccarla alla mano.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3552/3634848693_a4a1a4e398_o.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 100px; height: 60px;" src="http://farm4.static.flickr.com/3552/3634848693_efef7914ec_t.jpg" alt="" border="0" /&gt;&lt;/a&gt;Dopo questa operazione mi è bastato completare il tutto creado nuovi poligoni e aggiustando la loro posizione.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3548/3634848749_a5501b1f10_o.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 100px; height: 59px;" src="http://farm4.static.flickr.com/3548/3634848749_7334dda5bc_t.jpg" alt="" border="0" /&gt;&lt;/a&gt;Un po' di suddivisione per arrotondare il tutto e il gioco è fatto.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Dopo la modellazione vera e propria è saltato fuori il vero ostacolo di tutto questo lavoro, e cioè creare lo scheletro della mano e "riggare" il tutto.&lt;br /&gt;Una sfida abbastanza ardua, dato che ci capisco poco...&lt;br /&gt;Non mi sono dato per vinto e ho cominciato col crearmi le varie mappe da associare alle ossa, le ossa, la gerarchia, gli oggetti per IK (la cinematica inversa) e il settaggio dei vari parametri.&lt;br /&gt;Dopo un po' di invocazioni di Divinità antiche e pagane, con conseguente tremolio della stanza (forse più dovuto al mal di testa che alle eresie...) sno riuscito a fare un lavoro decente con lo scheletro.&lt;br /&gt;Non sono completamente soddisfatto, dato che ci sono delle cose che non tornano, come piegatura dei poligoni che non vanno come devono andare, etc.&lt;br /&gt;Tutto sommato però è un passo avanti per me: ho assimilato abbastanza bene il meccanismo per la IK.&lt;br /&gt;Ecco i render finali di tutto ciò&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3337/3635658716_868732c610_o.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 100px; height: 75px;" src="http://farm4.static.flickr.com/3337/3635658716_1856cc7eac_t.jpg" alt="" border="0" /&gt;&lt;/a&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm3.static.flickr.com/2438/3635659188_91dac97b79_o.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 100px; height: 75px;" src="http://farm3.static.flickr.com/2438/3635659188_5ce049db75_t.jpg" border="0" alt="" /&gt;&lt;/a&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3305/3634848185_5592731da2_o.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 100px; height: 75px;" src="http://farm4.static.flickr.com/3305/3634848185_643e07d65a_t.jpg" border="0" alt="" /&gt;&lt;/a&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3375/3635658866_5b1f9cbb0c_o.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 100px; height: 75px;" src="http://farm4.static.flickr.com/3375/3635658866_364fbb4486_t.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Tempo di completamento di tutto il lavoro: circa 2 ore (e tante eresie quando le ossa non vogliono muoversi come gli dici tu!)&lt;br /&gt;&lt;br /&gt;Spero vi piaccia :D&lt;br /&gt;Alla prossima!&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-4610698263044639436?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/4610698263044639436/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=4610698263044639436' title='2 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/4610698263044639436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/4610698263044639436'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2009/06/fast-modelling.html' title='Fast Modelling 3 - Mano in LightWave'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3410/3635659224_fc711cef27_t.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-3491463901301340505</id><published>2009-06-16T10:00:00.000+02:00</published><updated>2009-06-16T10:36:51.015+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3D'/><category scheme='http://www.blogger.com/atom/ns#' term='Lavori'/><category scheme='http://www.blogger.com/atom/ns#' term='Lightwave'/><category scheme='http://www.blogger.com/atom/ns#' term='WIP'/><title type='text'>Work In Progress 2</title><content type='html'>Ho trovato il tempo di portare un poco avanti il modello che avevo cominciato qualche tempo fa, e che era rimasto fermo per mancaza di ispirazione.&lt;br /&gt;Oggi per una qualche strana coincidenza stellare e/o planetaria ho trovato un pizzico di ispirazione!&lt;br /&gt;&lt;br /&gt;Sono partito da quello che avevo lasciato &lt;a href="http://alessioausilio.blogspot.com/2009/06/fast-modelling-2.html"&gt;qua&lt;/a&gt; e &lt;a href="http://alessioausilio.blogspot.com/2009/06/work-in-progress-1.html"&gt;qua&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;Quello che ho fatto è stato completare il Gatling per dargli una forma un poco più consona alle mie esigenze. Dopo un po' di prove, di posizionamento dei manici, della forma, etc ho ottenuto questo:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3604/3629680235_532fee9b85_o.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 100px; height: 46px;" src="http://farm4.static.flickr.com/3604/3629680235_5b37b8951c_t.jpg" border="0" alt="" /&gt;&lt;/a&gt;Per ora sono abbastanza soddisfatto, sia della forma che della posizione dei componenti.&lt;br /&gt;Ciò non toglie che possa sempre fare qualche modifica in futuro se lo riterrò necessario.&lt;br /&gt;&lt;br /&gt;Ho poi ripreso in mano quell'omone rimasto li imbambolato.&lt;br /&gt;Ho dovuto studiarmi un po' di IK (Inverse Kinematics, cinematica inversa), un sistema con il quale posso muovere le ossa del mio personaggio posizionando le sole estremità invece che posizionare a mano tutte le singole ossa.&lt;br /&gt;Ho ancora parecchio da studiarci, ma intanto ho capito il concetto e questo è già un passo avanti.&lt;br /&gt;Dopo aver creato lo scheletro, aver messo assieme il Gating e il personaggio, aver posizionato il tutto in modo più o meno decente ho fatto un render di prova.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3610/3630472206_1a337e3803_o.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 100px; height: 80px;" src="http://farm4.static.flickr.com/3610/3630472206_4376553428_t.jpg" border="0" alt="" /&gt;&lt;/a&gt;Ho fatto qualche piccola aggiunta all'uomo, tanto per vedere come si comportavano in presenza dello scheletro, aggiunte che per ora ho deciso di lasciare dato che non ci stanno malissimo, e potrebbe portarmi a creare modificare il personaggio.&lt;br /&gt;&lt;br /&gt;Spero vi piaccia.&lt;br /&gt;Certo ancora è da completare ma mi pare di aver fatto qualche passo in avanti!&lt;br /&gt;&lt;br /&gt;A presto con altre nuove, sempre che non passi un pezzo senza avere ispirazione!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-3491463901301340505?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/3491463901301340505/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=3491463901301340505' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/3491463901301340505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/3491463901301340505'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2009/06/work-in-progress-2.html' title='Work In Progress 2'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3604/3629680235_5b37b8951c_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-2383320691894046223</id><published>2009-06-12T22:17:00.004+02:00</published><updated>2009-06-12T22:30:00.777+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Riflessioni strane'/><category scheme='http://www.blogger.com/atom/ns#' term='Riflessioni'/><category scheme='http://www.blogger.com/atom/ns#' term='Lamentazioni'/><title type='text'>Scriviamo bene il codice!</title><content type='html'>Il lavoro del programmatore è un lavoro faticoso.&lt;br /&gt;Devi strutturare bene il progetto su cui stai lavorando e che devi realizzare.&lt;br /&gt;Dopo una fase di progettazione si passa alla realizzazione.&lt;br /&gt;Quando tuttu funziona e consegni il lavoro sei soddisfatto e pensi "bene ora non ci voglio rimettere le mani".&lt;br /&gt;&lt;br /&gt;Ah ma è qui che mi casca l'asino.&lt;br /&gt;(poi perchè caschi l'asino non lo so... poraccio tutti con lui ce l'hanno...)&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;Si sa, è impossibile ricordarsi tutto quello che si fa, ricordarsi tutte le cose che abbiamo scritto o simili.&lt;br /&gt;Ecco, questo per un programmatore è una cosa orribile.&lt;br /&gt;&lt;br /&gt;Mi sta capitando in questo periodo di dover rileggere per motivi universitari, che non sto qua a spiegare, del codice che ho scritto circa 3 mesi fa oramai.&lt;br /&gt;Si tratta di alcuni file contenenti del codice C.&lt;br /&gt;Allora già io sono stronzo e commento poco il codice, e mi accorco ora che dovrei aggiunge più commenti.&lt;br /&gt;Il C è un linguaggio potente, ci puoi fare molte cose, ma se scrivi roba troppo compatta poi rischi di perdere 1 minuto a capire quello che fanno 3 righe di codice che hai scritto tu stesso. &lt;br /&gt;Oppure non vedi un "!" in una condizione e quindi ti cambia il significato del controllo che stai facendo.&lt;br /&gt;&lt;br /&gt;E il più delle volte sono delle cavolate quelle che creano più problemi di comprensione!&lt;br /&gt;&lt;br /&gt;Altro esempio, ho riletto verso Febbraio il listato di un progetto scritto in C che consegnai verso Ottobre...&lt;br /&gt;Piangevo per gli orrori che avevo commesso!&lt;br /&gt;Mi chiesi pure come aveva fatto il professore a considerare passabile una cosa simile (io mi sarei stroncato da solo). Puntatori non controllati, accesso ad aree di memoria ch forse potevano non esistre... Insomma un incubo!&lt;br /&gt;&lt;br /&gt;Dopo solo 6 mesi circa era completamente cambiato il mio modo di vedere ed affrontare le cose.&lt;br /&gt;Ho paura di come potrei essere tra qualche anno...&lt;br /&gt;&lt;br /&gt;A parte che la mentalità e le conoscenze di una persona cambiano, e per chi prgramma vuol dire anceh cambiare stile di programmazione, di scrittura e di approccio verso i problemi che gli vengono posti.&lt;br /&gt;&lt;br /&gt;La morale?&lt;br /&gt;Scrivete bene il vostro codice, commentate più che potete, e sopratutto sperate e pregate di non doverlo rileggere tutto completamente... è una cura per l'insonnia da paura.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-2383320691894046223?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/2383320691894046223/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=2383320691894046223' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/2383320691894046223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/2383320691894046223'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2009/06/scriviamo-bene-il-codice.html' title='Scriviamo bene il codice!'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-5789531745911529440</id><published>2009-06-11T09:45:00.005+02:00</published><updated>2009-06-17T15:25:49.789+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3D'/><category scheme='http://www.blogger.com/atom/ns#' term='Lavori'/><category scheme='http://www.blogger.com/atom/ns#' term='Fast Modelling'/><category scheme='http://www.blogger.com/atom/ns#' term='Lightwave'/><title type='text'>Fast Modelling 2 - Gatling in LightWave</title><content type='html'>Ogni tanto mi piglia il pazzo, e comincio a modellare alla "do coio coio".&lt;br /&gt;Qualche volta va bene ed esce fuori qualcosa di decente, qualche volta no.&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;Questa volta mi è andata bene.&lt;br /&gt;Cioè si può fare molto meglio lo so, ma per un qualcosa fatto in fretta e furia, mentre guardavo un filmaccio alla tv (mi pare Baby Birba o qualcosa del genere...ma quante volte lo avranno passato O_O), e mentre studicchiavo un po' (cioè ogni tanto staccavo la testa dal libro e facevo qualche modifica al modello) non mi posso lamentare più di tanto.&lt;br /&gt;Credo di averci messo si e no due ore (comprese tutte le distrazioni eh XD)&lt;br /&gt;Ecco a voi:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3307/3615587157_4a6222b477_o.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 100px; height: 56px;" src="http://farm4.static.flickr.com/3307/3615587157_8642b60efa_t.jpg" border="0" alt="" /&gt;&lt;/a&gt;Questa volta ho cercato di fare un Gatling. Mi hanno sempre ispirato violenza e potenza come armi. Certo ca migliorato, ma credo ci si possa tirar fuori qualcosa di bello :D&lt;br /&gt;Se poi riesco credo che unirò questo modello a quello del bestione che ho fatto qualche giorno fa...&lt;br /&gt;Chissà cosa potrei creare :P&lt;br /&gt;&lt;br /&gt;Alla prossima!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-5789531745911529440?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/5789531745911529440/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=5789531745911529440' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/5789531745911529440'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/5789531745911529440'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2009/06/fast-modelling-2.html' title='Fast Modelling 2 - Gatling in LightWave'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3307/3615587157_8642b60efa_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-4661654717198175897</id><published>2009-06-08T12:08:00.003+02:00</published><updated>2009-06-08T12:15:57.039+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3D'/><category scheme='http://www.blogger.com/atom/ns#' term='Lavori'/><category scheme='http://www.blogger.com/atom/ns#' term='Lightwave'/><category scheme='http://www.blogger.com/atom/ns#' term='WIP'/><title type='text'>Work In Progress 1</title><content type='html'>La mente è capace di partorire delle cose veramente strane.&lt;br /&gt;Alle volte mi capita di avere in mente un'idea precisa per un modello 3D e di non riuscire a realizzarlo.&lt;br /&gt;Ma il più delle volte riesco a tirare fuori i lavori più strani e meglio fatti quando parto da qualcosa di indefinito e vago.&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;Vi ricordate il testo del &lt;a href="http://alessioausilio.blogspot.com/2009/06/fast-modelling-1.html"&gt;Fast Modelling 1&lt;/a&gt;?&lt;br /&gt;Bè mica potevo lasciare quella povera testa a galleggiare per aria no?&lt;br /&gt;Lavoricchiando un po' questo è il risultato&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3308/3604488471_f687243f27_o.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 100px; height: 75px;" src="http://farm4.static.flickr.com/3308/3604488471_3030e669fe_t.jpg" border="0" alt="" /&gt;&lt;/a&gt;Credo di dover fare qualche modifica anatomica al collo, altrimenti per il resto sono abbastanza soddisfatto.&lt;br /&gt;La vaga idea che avevo in mente adesso sta prendendo una forma più dettagliata, quindi ora non mi resta che realizzarla in pratica, sperando di ottenere qualcosa di buono.&lt;br /&gt;Spero vi piaccia.&lt;br /&gt;&lt;br /&gt;Se qualcosa non vi torna o avete modifiche da proporre non fatevi problemi a dire quello che pensate!&lt;br /&gt;&lt;br /&gt;Alla prossima! :)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-4661654717198175897?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/4661654717198175897/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=4661654717198175897' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/4661654717198175897'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/4661654717198175897'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2009/06/work-in-progress-1.html' title='Work In Progress 1'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3308/3604488471_3030e669fe_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-1714492177897599324</id><published>2009-06-03T21:35:00.004+02:00</published><updated>2009-06-17T15:26:12.364+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3D'/><category scheme='http://www.blogger.com/atom/ns#' term='Lavori'/><category scheme='http://www.blogger.com/atom/ns#' term='Fast Modelling'/><category scheme='http://www.blogger.com/atom/ns#' term='Lightwave'/><title type='text'>Fast Modelling 1 - Testa in LightWave</title><content type='html'>C'è chi fa degli sketch su un foglio di carta.&lt;br /&gt;C'è chi gli piace scattare delle foto.&lt;br /&gt;Bhe io non ho ne le capacità per fare un bel disegno, ne ho la possibilità di fare delle foto quando mi pare.&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;Diciamo che questi sono i miei sketch.&lt;br /&gt;Ogni tanto mi capita di da un'occhiata alla cartella dove ho buttato le centinaia di immagini che ho raccolto in tanto tempo. &lt;br /&gt;Ci sono le cose più disparate, le più strane.&lt;br /&gt;Ogni tanto piglio spunto da qualcosa che è li dentro per tirarne fuori qualche lavoretto.&lt;br /&gt;Ecco quello che è uscito oggi:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3297/3593321562_9fb40c2620_o.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 95px; height: 100px;" src="http://farm4.static.flickr.com/3297/3593321562_ea719ca408_t.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ci avrò messo circa 2 ore e mezzo a fare il tutto. Proprio come uno sketch, solo un po' più lento.&lt;br /&gt;&lt;br /&gt;Spero vi piaccia.&lt;br /&gt;&lt;br /&gt;Alla prossima!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-1714492177897599324?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/1714492177897599324/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=1714492177897599324' title='2 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/1714492177897599324'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/1714492177897599324'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2009/06/fast-modelling-1.html' title='Fast Modelling 1 - Testa in LightWave'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3297/3593321562_ea719ca408_t.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-7989594892166643336</id><published>2009-06-02T11:00:00.003+02:00</published><updated>2009-06-02T11:32:56.540+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3D'/><category scheme='http://www.blogger.com/atom/ns#' term='Lavori'/><category scheme='http://www.blogger.com/atom/ns#' term='Lightwave'/><category scheme='http://www.blogger.com/atom/ns#' term='Gunblade'/><category scheme='http://www.blogger.com/atom/ns#' term='Final Fantasy'/><title type='text'>Gunblade Rebirth - The end</title><content type='html'>Finalmete il lavoro è giunto a termine.&lt;br /&gt;Non ci posso credere neanche io ma invece è così.&lt;br /&gt;E' completo e pronto per la produzione e vendita di massa!&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;Battute a parte il Gunblade è finito.&lt;br /&gt;Come avevo detto avevo ancora da aggiungere dei particolari, dei dettagli per completare il lavoro. &lt;br /&gt;Una cosa che ho voluto realizzare è stata la testa del Griever appesa alla catenina. La testa originale che c'era non mi piaceva più di tanto, però ricordavo che il Griever raffigurato nella collana (che ho :P) aveva una forma diversa, e che aveva una parte che somigliava ad una croce.&lt;br /&gt;Dopo aver cercato il disegno sul Web, e dopo un po' di lavoro ecco a voi il Griever!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3648/3588726788_41504a2783_o.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 100px; height: 80px;" src="http://farm4.static.flickr.com/3648/3588726788_468014d845_t.jpg" alt="" border="0" /&gt;&lt;/a&gt;Non ho voluto mettere troppi dettagli, anche perchè ce ne sarebbero tanti da mettere, ma ho preferito non esagerare. Già il mio povero pc ha fatto fatica a renderizzare queste immagini :(&lt;br /&gt;Mi si è anche spento diverse volte durante la fase di rendering (con bestemmie allegate da parte mia, se considerate che un render non mi durava mai meno di 10 minuti...)&lt;br /&gt;&lt;br /&gt;Dopo il Griever sono passato ai proiettili nel caricatore.&lt;br /&gt;Per questi è stato facile, in fondo sono solo dei cilindri ^_^&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3332/3588726500_db69aec1a3_b.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 100px; height: 75px;" src="http://farm4.static.flickr.com/3332/3588726500_db69aec1a3_t.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;E' stato più complicato impostare il render dei bossoli che crearli.&lt;br /&gt;Ma non pensate che faccia le cose a metà...&lt;br /&gt;I proiettili sono completi! Bossoli e testa dei proiettili! Bossoli dorati, proiettili cromati!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm3.static.flickr.com/2462/3587919745_8c4c59bfea_o.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 100px; height: 80px;" src="http://farm3.static.flickr.com/2462/3587919745_437f7dc1a9_t.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Bè, che dire ora...&lt;br /&gt;Il lavoro è finito. Mi sono divertito. H avuto una scusa per rimettere mano su un programma che per motivi di studio non riusavo da molto tempo.&lt;br /&gt;Ho bestemmiato contro il mio portatile per il fatto che non ce la faceva a fare il rendering. Infatti se notate qualche immagine non ha l'antialiasing.&lt;br /&gt;E ora vi lascio con le ultime 2 immagini!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3598/3587918149_e582cee229_b.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 75px; height: 100px;" src="http://farm4.static.flickr.com/3598/3587918149_e582cee229_t.jpg" alt="" border="0" /&gt;&lt;/a&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm3.static.flickr.com/2424/3588725974_c405ff53d4_b.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 100px; height: 88px;" src="http://farm3.static.flickr.com/2424/3588725974_c405ff53d4_t.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Spero vi piacciano :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Per l'immagine in alta risoluzione: &lt;a href="http://odino87.deviantart.com/art/Gunblade-124534637"&gt;Gunblade&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Se avete qualche altra idea da propormi sono qua.&lt;br /&gt;&lt;br /&gt;Ringrazio:&lt;br /&gt;&lt;a href="http://angelabondi.blogspot.com/"&gt;Angie&lt;/a&gt;, che dandomi dello sfaticato mi ha spinto a lavorare di nuovo!&lt;br /&gt;&lt;a href="http://www.rucamatsuo.net/"&gt;Ryuk&lt;/a&gt;, che mi ha dato l'idea iniziale di rifare il Gunblade!&lt;br /&gt;Mio cugino, che giocando ora a FF8 mi ha assillato con le sue domande e mi ha spinto ancora di più a lavorare!&lt;br /&gt;William Vaughan, per i suoi tutorial su Lightwave, i quali sono una fonte infinita di trucchi e insegnamenti!&lt;br /&gt;&lt;br /&gt;Alla prossima! :D&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6862936347949168466-7989594892166643336?l=alessioausilio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alessioausilio.blogspot.com/feeds/7989594892166643336/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6862936347949168466&amp;postID=7989594892166643336' title='3 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/7989594892166643336'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6862936347949168466/posts/default/7989594892166643336'/><link rel='alternate' type='text/html' href='http://alessioausilio.blogspot.com/2009/06/gunblade-rebirth-end.html' title='Gunblade Rebirth - The end'/><author><name>Odino</name><uri>http://www.blogger.com/profile/05339005661503346027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://4.bp.blogspot.com/_za7eav2F300/Sdjm_b2UGJI/AAAAAAAAABc/S1Pq37gGwok/S220/avatar2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3648/3588726788_468014d845_t.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6862936347949168466.post-5206487641832091964</id><published>2009-05-29T09:00:00.000+02:00</published><updated>2009-05-29T09:00:14.885+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3D'/><category scheme='http://www.blogger.com/atom/ns#' term='Lavori'/><category scheme='http://www.blogger.com/atom/ns#' term='Lightwave'/><
