<?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-8768285918186248163</id><updated>2011-04-21T14:12:48.692-07:00</updated><category term='Me'/><category term='XNA 1.0'/><category term='LINQ'/><category term='Project: Code posting tool'/><category term='Project: XNAMachine engine'/><category term='Project: Star Maze'/><category term='VB.NET Content Pipeline'/><category term='XNA 3.0'/><category term='Off topic'/><category term='Project: Touring'/><category term='Tips + Tricks'/><category term='XNA project template for VB'/><category term='Project: Wummer'/><category term='Project: Web Updater'/><category term='XNA 2.0'/><category term='Tutorials'/><category term='Project: 2D Camera'/><category term='Project: XNA Content Assistant'/><title type='text'>the xna machine</title><subtitle type='html'>&lt;b&gt;the xna machine&lt;/b&gt;</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Eric</name><uri>http://www.blogger.com/profile/07741298919536391130</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>58</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-748745185599516822</id><published>2008-10-14T11:27:00.000-07:00</published><updated>2008-10-14T12:50:37.595-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Me'/><title type='text'>The WPF Machine</title><content type='html'>Well I'm abandoning my XNA development efforts in favor of WPF/Silverlight.  Primary reasons being:&lt;ul&gt;&lt;br /&gt;&lt;li&gt;WPF/Silverlight does not have a language barrier (you can use VB, etc.)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The distribution agility of Silverlight vs. XNA is off the chart. The Silverlight plugin does not require Windows (let alone the .NET framework).  It's simply a browser plugin ala Flash, available for both Mac and Windows.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;XNA Click-once.  Very cool for C# XNA developers, but the prospect of creating a Click-once VB hack/workaround/replacement for VB XNA apps really ups the proverbial "is this really worth it" ante.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The basis of my 2D XNA engine (i.e. the matrix hierarchy, and a scripting engine (which I never covered, but basically it allows you to target any property of a specific data type and interpolate it over time)) this was all very cool indeed. And it all already exists, practically verbatim, in WPF*.&lt;br /&gt;&lt;br /&gt;&lt;font size=2&gt;*While it's a bit satisfying to see I came up with the same solution that Microsoft did for scripting any object with time-based animation, it's also a very major /facepalm to see I've been reinventing the wheel for the past several months!&lt;/font&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;WPF appears to be the future of Windows development, which I'd like to stay on top of for both my career and personal interest.  What's more, you can totally &lt;a href="http://silverlight.net/blogs/msnow/default.aspx" target="_new"&gt;make games with it&lt;/a&gt;.  You can even use &lt;a href="http://wpfwonderland.wordpress.com/2008/10/06/wpf-shader-effects-library-posted/" target="_new"&gt;GPU shaders&lt;/a&gt;.  No, it's not as powerful as XNA but you have to admit; the whole ordeal is rather neato.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;So someday a new blog might crop up somewhere with my WPF/Silverlight stuff on it (altho for now I'm still pretty green). I still have those game ideas tucked away waiting for implementation... someday.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-748745185599516822?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/748745185599516822/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=748745185599516822' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/748745185599516822'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/748745185599516822'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2008/10/wpf-machine.html' title='The WPF Machine'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-4383822768405662043</id><published>2008-06-20T03:18:00.000-07:00</published><updated>2008-06-20T14:11:38.178-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Off topic'/><category scheme='http://www.blogger.com/atom/ns#' term='Me'/><title type='text'>Off topic</title><content type='html'>As a potentially negative side-effect to now giving these blog posts more descriptive labels, there are now several non-XNA related topics on this blog.&lt;br /&gt;&lt;br /&gt;Namely, Off topic.&lt;br /&gt;&lt;br /&gt;Here are some Off topic links I highly suggest:&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.mozilla.com/en-US/firefox/" target="_new"&gt;FireFox 3&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.spore.com/trial" target="_new"&gt;Spore Creature Creator&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-4383822768405662043?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/4383822768405662043/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=4383822768405662043' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/4383822768405662043'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/4383822768405662043'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2008/06/off-topic.html' title='Off topic'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-4359733638102533893</id><published>2008-06-19T13:32:00.001-07:00</published><updated>2008-06-20T23:30:38.423-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LINQ'/><title type='text'>LINQ to SQL Server CE</title><content type='html'>In Visual Studio 2008, when trying to drag a local SQL Server CE database table onto your LINQ design surface, you receive the following error:&lt;br /&gt;&lt;br /&gt;"The selected object(s) use an unsupported data provider."&lt;br /&gt;&lt;br /&gt;This message is a little misleading, because you &lt;i&gt;can&lt;/i&gt; in fact LINQ over your SQL Server CE database; it's just the drag &amp;amp; drop LINQ design surface in Visual Studio that doesn't know how to interact with SQL CE.&lt;br /&gt;&lt;br /&gt;To work around this limitation of the IDE, you can call upon Microsoft's &lt;a href="http://msdn.microsoft.com/en-us/library/bb386987.aspx" target="_new"&gt;SqlMetal&lt;/a&gt; utility to create a .dbml file (aka, a new LINQ to SQL item) on your behalf.  Here's a reasonably simple way to accomplish it:&lt;br /&gt;&lt;br /&gt;In your project's solution explorer, right-click the node containing your .sdf (database) file and "Open Folder in Windows Explorer".  In the resultant window, create a new text document called MakeCeLINQ.bat and edit it, entering this command:&lt;br /&gt;&lt;br /&gt;C:\"Program Files\Microsoft SDKs\Windows\v6.0a\bin\sqlmetal.exe" /dbml:CeLINQ.dbml &lt;i&gt;Database&lt;/i&gt;.sdf&lt;br /&gt;&lt;br /&gt;Replace &lt;i&gt;Database&lt;/i&gt; with whatever your .sdf file is called.  It's important that this batch file be created in the same folder as your .sdf file, since the command is structured in such a way that assumes the .sdf file is sitting next to the batch file.  Close &amp;amp; save MakeCeLINQ.bat, and double-click to run it. SqlMetal will create CeLINQ.dbml.&lt;br /&gt;&lt;br /&gt;In Visual Studio, click the button to show all files for your project and include your newly created CeLINQ.dbml file.  Include the "MakeCeLINQ.bat" file, too - strictly speaking it's no longer required, but you may find it convenient to keep it with your project.&lt;br /&gt;&lt;br /&gt;So now you should have something like this:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i97.photobucket.com/albums/l223/emachine74/CeLINQ.png" /&gt;&lt;br /&gt;&lt;br /&gt;You can now work with the CeLINQ object within the IDE as normal (with the ever-present exception of drag &amp;amp; drop functionality).  If you change any of the schemas in your CE database, simply re-run the MakeCeLINQ.bat to update the CeLINQ object.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-4359733638102533893?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/4359733638102533893/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=4359733638102533893' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/4359733638102533893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/4359733638102533893'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2008/06/linq-to-sql-server-ce.html' title='LINQ to SQL Server CE'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-3646517731141495981</id><published>2008-06-17T03:12:00.000-07:00</published><updated>2008-06-20T03:07:41.281-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LINQ'/><title type='text'>LINQ</title><content type='html'>I did a little project for my wife this weekend and used LINQ for the first time.  Visual Basic's implementation of LINQ over XML is just about the greatest thing since sliced bread.&lt;br /&gt;&lt;br /&gt;Looking at my Web Updater, I get an xml file called the "wum" (web update manifest, which contains a list of server-side files to compare against a client for making decisions about which files to update).  To read these wum.xml files in my Web Updater, I was using an XMLReader to simply parse the file in a serial fashion.  Which worked fine, really; although there was not any "knowledge" of the xml document itself within the IDE or the Web Updater code, per se; the parsing routine was a bunch of XMLReader.Read statements, with the occasional variable assignment thrown in whenever certain nodes were reached.  Without any prior knowledge of the XML file in question, the parsing process is not exactly intuitive to behold, let alone modify/debug.&lt;br /&gt;&lt;br /&gt;With LINQ, this task of reading the wum.xml to determine which files on the disk require an update can be accomplished in a &lt;span style="font-style:italic;"&gt;radically&lt;/span&gt; different fashion.&lt;br /&gt;&lt;br /&gt;First of all, rather than simply associating a wum.xsd schema with the XMLReader's xml settings, you can drop said schema into the solution explorer / project itself and in doing so, define an XML &lt;span style="font-style:italic;"&gt;type&lt;/span&gt; much in the same way you'd define any given class.  With the xml schema now available to the compiler, VB provides you with "xml intellisense", allowing you to traverse an xml document in no less than xml statements such as objMyDocument.&amp;lt;customer&amp;gt;.&amp;lt;name&amp;gt;.&amp;lt;first&amp;gt;.Value and things of that nature.  It's a little strange at first but pretty fantastic.  This obviously injects a great deal more knowledge of the xml structure itself into the code - now someone viewing or even editing this code for the first time has a far less abstract situation on their hands.&lt;br /&gt;&lt;br /&gt;If that weren't enough of an improvement, I realized I didn't really have to serially process the wum.xml at all.  I can take that XMLReader I'd been using to create an Xml.Linq.XDocument.  An XDocument is basically an xml document instance but it's queryable by LINQ - so you can treat it like a database.  Now I can save literally dozens of XMLReader calls &amp; parsing effort by simply querying the XDocument Where Not IO.File.Exists OrElse IO.File.LastWriteTime &lt;&gt; (queryResult.LastWriteTime) and viola, an IEnumrable object of XElements matching the query are returned.  In addition, the query result can be stuffed into any given appropriate class of your choosing, so you don't even have to deal with XElements in the result set if you don't want to, and then ultimately .ToList(ed) into a generic List(Of &amp;lt;whatever&amp;gt;).&lt;br /&gt;&lt;br /&gt;It's all slightly mind-blowing the first time you sit down to use it, particularly when you consolidate 50 lines of mundane XML parsing into a single LINQ query in a matter of minutes, never even having used LINQ before.  Just imagine what you can do with this stuff once you actually know how to use it... pretty cool!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-3646517731141495981?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/3646517731141495981/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=3646517731141495981' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/3646517731141495981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/3646517731141495981'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2008/06/linq.html' title='LINQ'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-7660970733005147846</id><published>2008-06-14T16:36:00.001-07:00</published><updated>2008-06-20T03:07:41.282-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Project: Web Updater'/><category scheme='http://www.blogger.com/atom/ns#' term='Project: Wummer'/><title type='text'>Scope creep</title><content type='html'>I updated the graphics of this blog a little bit.  I'd been playing around with a VB/XNA logo hybrid in photoshop so I thought I'd use it for something.&lt;br /&gt;&lt;br /&gt;I've been working very hard on my Web Updater and Wummer applications over the past 2 weeks and I haven't been able to resist putting more and more functionality into them.  They're turning into things which may actually be quite useful.&lt;br /&gt;&lt;br /&gt;The Wummer will now let you split up the files you want to publish over however many different hosts you specify; so for instance if you have 3 hosts at your disposal but they're slow uploaders (eg., homebrew DSL &amp;amp; Cable broadband line hosting like I use for most things) the Wummer allows you to divide the publication of files amongst multiple hosts, and the manifest now groups files by host.&lt;br /&gt;&lt;br /&gt;You can also change the relative path binding of each file, so that any given number of remote URLs can map to the same local client install directory.  This all required a somewhat extensive storage system for the Wummer, so I chose to use an sql server ce database, which keeps track of all the projects and files and hosts etc. of every probject you've ever published using the Wummer.&lt;br /&gt;&lt;br /&gt;In addition to being able to react property to the new manifest files, the Web Updater will now also attempt to update &lt;span style="font-style:italic;"&gt;itself&lt;/span&gt; by temporarily cloning it's own executable and launching it with the Web Updater's own manifest file specified.  In this way the Web Updater sort of "cheats", using a copy of itself to update itself, which I thought was cute.&lt;br /&gt;&lt;br /&gt;There are a few small but important touches to add to the Web Updater before it's ready for prime time, right now I've got the XNA Content Assistant performing updates with it and it's working pretty well, it's just not quite as elegant as I would like yet (currently there is much shutting down and restarting of programs during an update process which, while automatic and not necessarily cumbersome to the user, is unprofessional looking and some of it can be avoided).&lt;br /&gt;&lt;br /&gt;At some point I would like to consolidate all this into an "xnamachine software portal" application, which installs the prerequisites &amp;amp; runtimes on your PC (such as the Visual C++ redist for XNA games, .net 3.5, sql server ce, and provide convenient links to the XNA redist &amp;amp; DirectX web installer, which are easier for the user to just run themselves at this time).  That way, there would only ever be 1 thing you would ever have to "install" from xnamachine.com in order to use anything I release.  The portal would be an updatable application launchpad that provides links to whatever I make available; the Wummer, the XNA Content Assistant, templates for Visual Studio, XNA games, whatever.  Such a thing would not be very difficult to make so I may go ahead with that as a software distribution plan, unless I think of some horrible drawback to doing it that way.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-7660970733005147846?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/7660970733005147846/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=7660970733005147846' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/7660970733005147846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/7660970733005147846'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2008/06/scope-creep.html' title='Scope creep'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-4931812155828074524</id><published>2008-05-24T02:24:00.000-07:00</published><updated>2008-06-20T03:06:54.524-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Project: Wummer'/><title type='text'>The wummer</title><content type='html'>The core of the Web Updater program is complete; it can now connect to web servers, obtain wum.xml files, validate them against a public wum schema, perform a differential check against the locally installed files on the client and download the obsolete/missing files.  After downloading it can now replace the files on the client via decompression (if the wummer tool had compressed them when publishing) or, just renaming them into place.  &lt;br /&gt;&lt;br /&gt;My "wummer" publishing tool is finished, save a few UI nuances, and so together they have created a functioning publish/update circuit.&lt;br /&gt;&lt;br /&gt;The Web Updater still needs a few more things; certain disaster recovery scenarios still must be accounted for, like if it can't access files it's trying to update or it's connection drops while downloading.  It also still needs the ability to accept command line arguments when it runs, and finally it needs the ability to re-launch the target application it's updated.  So I guess it's about 85% complete.  &lt;br /&gt;&lt;br /&gt;Here it is, dutifully "updating" a bunch of nonsense files.  I added the little treeview to it this evening, just for fun.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i97.photobucket.com/albums/l223/emachine74/wubeta.png" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-4931812155828074524?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/4931812155828074524/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=4931812155828074524' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/4931812155828074524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/4931812155828074524'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2008/05/wummer.html' title='The wummer'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-622577826736325303</id><published>2008-05-20T01:12:00.000-07:00</published><updated>2008-06-20T03:06:42.124-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Project: Web Updater'/><category scheme='http://www.blogger.com/atom/ns#' term='Project: Wummer'/><title type='text'>wum</title><content type='html'>So the XNA Content Assistant is largely finished and I wanted to distribute it using some kind of web update model, to make it easier for all of you to update the Assistant in the future. So I built a little update functionality into the Assistant under the Visual Studio ClickOnce model.&lt;br /&gt;&lt;br /&gt;ClickOnce is really neat and very easy to use, but unfortunately for the XNA Content Assistant it is unacceptable.  The problem is that you can't effectively launch a ClickOnce application from another program e.g. via Process.Start while passing command line arguments.  At best, you can submit a query string to a web-based application, but having the Assistant be entirely web based is not acceptable.  The Content Assistant must be installed on the local machine and must be callable via command line with arguments.&lt;br /&gt;&lt;br /&gt;Therefore I abandoned the ClickOnce model and for the past couple days I've been crafting a web update system.  This is something I will require anyway, to allow updates to my future XNA applications, so it's somewhat of an inevitable project.&lt;br /&gt;&lt;br /&gt;The Web Updater does its best to be somewhat generic; in a nutshell it just needs to know the URL of your application's "wum.xml" file (Web Updater Manifest), a simple xml file which describes the current files available on the update server (name, size, last update, etc).  The Web Updater grabs the wum and checks it against whatever application it's updating on the local machine, and updates files as necessary.&lt;br /&gt;&lt;br /&gt;To that end, &lt;span style="font-style:italic;"&gt;now&lt;/span&gt; I'm in the process of writing a companion tool for wum publishing called the Wummer.  The Wummer is for developers, we point it at our Release folder (or, whatever you want to publish), and the Wummer uses an IO.CompressionStream to publish your application to your web host as .gz files, creating the wum.xml file for you (an otherwise tedious task).&lt;br /&gt;&lt;br /&gt;So I've been pretty busy working on all this lately, juggling work and 3 of my own little mini-projects!  I believe these will all be helpful tools though and I hope to have them finished up pretty soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-622577826736325303?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/622577826736325303/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=622577826736325303' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/622577826736325303'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/622577826736325303'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2008/05/wum.html' title='wum'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-2205519702847068388</id><published>2008-05-14T16:46:00.000-07:00</published><updated>2008-06-20T03:05:53.094-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VB.NET Content Pipeline'/><category scheme='http://www.blogger.com/atom/ns#' term='Project: XNA Content Assistant'/><title type='text'>XNA Content Assistant</title><content type='html'>The logistics of how content gets built in the VB template will change when GS 3.0 is released.  Rather than hard-code all of the content building specifics into the VBContentManager class, this functionality has been moved into a stand-alone application, which will act as a bridge between a non-Game Studio project and the Content Pipeline.  This application is called the XNA Content Assistant, and is a Windows form application with a graphical interface.  However, it also supports being called from the command line in an invisible mode.&lt;br /&gt;&lt;br /&gt;I'm currently putting the XNA Content Assistant through beta, naturally I want to debug such an important component thoroughly.  It is functional at this time, and so here's a preview of what it looks like, and what it does:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i97.photobucket.com/albums/l223/emachine74/xnaca1.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;You start out by opening your game's Visual Studio or Visual Express project file.  (when running from a command line, you would supply this as an argument)&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i97.photobucket.com/albums/l223/emachine74/xnaca2.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;Based upon the location and contents of the specified project file, the XNA Content Assistant will automatically determine where your content folder is (even if you did not name it "content").  It will then automatically determine which XNA framework version your game is programmed against.  The XNA Content Assistant understands how to build content for Game Studio Express (1.0 Refresh) projects, Game Studio 2.0, and Game Studio 3.0 projects created in either VB or C# in Visual Studio 2005, 2008, and the Express editions.&lt;br /&gt;&lt;br /&gt;On the GUI, we can see the Assistant has successfully harvested content from my "Timeclock" application, and I am proceeding to select a platform (this would be the 2nd and final parameter you would need to supply via command line)&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i97.photobucket.com/albums/l223/emachine74/xnaca3.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;And lastly when we execute the build process, we can see that MSBuild's output is integrated nicely into the Assistant's UI, to help troubleshoot build issues such as missing fonts, etc.  It also exports a log and a copy of the content project submited to MSBuild in your project's folder for reference.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i97.photobucket.com/albums/l223/emachine74/xnaca4.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;As future XNA versions are released, XNA Content Assistant will be updated and your existing template can simply continue to utilize the updated Assistant, rather than requiring code changes to the template itself (i.e., the VBContentManager class, which will be largely obviated by the Assistant).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-2205519702847068388?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/2205519702847068388/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=2205519702847068388' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/2205519702847068388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/2205519702847068388'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2008/05/xna-content-assistant.html' title='XNA Content Assistant'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-1077518723430661943</id><published>2008-05-10T12:47:00.000-07:00</published><updated>2008-06-20T02:49:59.565-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XNA 3.0'/><title type='text'>XNA 3.0 CTP</title><content type='html'>The &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=DF4AF56A-58A7-474C-BFD0-7CF8ED3036A3&amp;displaylang=en" target="_new"&gt;XNA/GS 3.0 CTP is out&lt;/a&gt; and I'm in the process of updating the VBContentManager in preparation for the official release.&lt;br /&gt;&lt;br /&gt;XNA 3.0 content processing expects to use the .NET Framework v3.5 edition of MSBuild.  For those not interested or ready to move to XNA 3.0, XNA 2.0 compatibility will be retained in the VBContentManager.  &lt;br /&gt;&lt;br /&gt;To that end, the GS 3.0 release will mark a small change in how the VBContentManager works.  A version enumeration is now required by the VBContentManager class, and moving forward, the VBContentManager will be augmented with new version support (rather than replaced wholesale) so that future editions of the VBContentManager can target prior XNA versions (dating back to 2.0).  Just pass in which XNA version you're targeting, and it will process your content accordingly.&lt;br /&gt;&lt;br /&gt;The VBContentManager currently available for download was never updated with functional, XACT-based audio importing.  I do have this working in my "production" VBContentManager, and as part of the 3.0 update I will include this for backward compatibility with 2.0's XACT-based audio.  And of course the new audio importing for 3.0 will be available as well, which is what I'm working on now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-1077518723430661943?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/1077518723430661943/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=1077518723430661943' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/1077518723430661943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/1077518723430661943'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2008/05/xna-30-ctp.html' title='XNA 3.0 CTP'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-5411731507552145773</id><published>2008-05-10T00:22:00.000-07:00</published><updated>2008-06-19T16:06:53.138-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Off topic'/><title type='text'>Microsoft.VisualBaggage</title><content type='html'>Here's an interesting article on Paul Vick's blog (not exactly new, but it was to me): &lt;a href="http://www.panopticoncentral.net/archive/2007/05/31/20766.aspx" target="_new"&gt;VB Runtime agility, Orcas and new platforms&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-5411731507552145773?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/5411731507552145773/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=5411731507552145773' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/5411731507552145773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/5411731507552145773'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2008/05/microsoftvisualbaggage.html' title='Microsoft.VisualBaggage'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-3454954111302164942</id><published>2008-04-20T23:02:00.000-07:00</published><updated>2008-06-20T02:50:23.939-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Project: Touring'/><title type='text'>Touring</title><content type='html'>Someone asked the creator's club a question about writing a &lt;a href="http://en.wikipedia.org/wiki/Mille_Bornes" target="_new"&gt;Mille Bornes&lt;/a&gt; game.  I remember liking that game as a kid, but the first version of it I played was the older more simplistic game of &lt;a href="http://en.wikipedia.org/wiki/Touring_%28card_game%29"&gt;Touring&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I've been thinking of putting together a simple game to test the XNAMachine engine with, something a little more simple than Star Maze just to see what it's like to build something with it, and this seemed like the perfect thing.  So rather than &lt;span style="font-style:italic;"&gt;completely&lt;/span&gt; rip off that guy's idea of making Mille Bornes, I've been putting together a Touring card game (ok, so I'm &lt;span style="font-style:italic;"&gt;mostly&lt;/span&gt; ripping off his idea...)&lt;br /&gt;&lt;br /&gt;Making a 1-player Touring game would be a little "too easy" I think, so I'm building both server &amp; client programs to allow for multi-player sessions of Touring to be started by whomever wants to play.  If the engine proves to be a decent performer for this application I'll begin the process of "porting" what's completed of my Star Maze project over to the XNAMachine engine.&lt;br /&gt;&lt;br /&gt;At this point I've got most of the object structure done for Touring, the game logic is easy, and so now I'm writing the network code for the server.  There are no movement predictions or tight synchronizations to worry about here, the server &amp; client really just need to relay simple commands &amp; acknowledgments back &amp; forth so it's a really good starting place for network code I think.&lt;br /&gt;&lt;br /&gt;At the risk of enduring a copyright violation lecture I've obtained some rather pristine editions of old Touring games from eBay as texture sources, and I've been browsing around a neat little website called &lt;a href="http://www.soundsnap.com/" target="_new"&gt;soundsnap&lt;/a&gt;, which has a lot of nice free sounds &amp; music loops.&lt;br /&gt;&lt;br /&gt;This is something of an unexpected diversion but I guess that's typical; the hardest part about programming is finishing something, right?  No worries...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-3454954111302164942?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/3454954111302164942/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=3454954111302164942' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/3454954111302164942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/3454954111302164942'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2008/04/touring.html' title='Touring'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-7032641726675605961</id><published>2008-04-08T14:48:00.000-07:00</published><updated>2008-06-19T16:07:43.048-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Off topic'/><title type='text'>Vacation 2</title><content type='html'>I'm in Japan this week.  I don't speak or read Japanese so sometimes it feels a little crazy, but at least we haven't gotten lost yet.  The train system here was a challenge at first (especially to a foreigner from a small US town without any serious public transport in the first place).  But a lot of things are in English of course so it's not so bad.  Today we're in Kawaguchi which is a small country town just north of Mt. Fuji.  Just hanging out here, it's like a mountain resort type of place.&lt;br /&gt;&lt;br /&gt;I wanted to get some good work done on the XNAMachine engine on the 11 hour flight, but after a couple hours I realized I didn't have the right power adapter for the plane's weird DC plug.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-7032641726675605961?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/7032641726675605961/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=7032641726675605961' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/7032641726675605961'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/7032641726675605961'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2008/04/vacation-2.html' title='Vacation 2'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-6256680023854134895</id><published>2008-04-03T01:00:00.000-07:00</published><updated>2008-06-20T03:09:04.236-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Project: XNAMachine engine'/><title type='text'>The XNAMachine</title><content type='html'>I'm continuing to plug away at my new engine here and there, mainly by jotting ideas down into classes &amp; interfaces, and then shaping them into workable objects.  It's kind of like throwing lumps of clay down into the IDE &amp; then shaping them into recognizable things.  It's probably the world's most inefficient way to design something but I'm having fun with it.&lt;br /&gt;&lt;br /&gt;The XNAMachine (my obvious name for this new engine) has grown into 5 primary categories which I've split into as many Namespaces within the project.  The primary namespaces are, in no particular order&lt;ul&gt;&lt;li&gt;Core - this contains classes such as the base Game class, the VBContentManager, a static math helper class, all the primary singleton stuff&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Objects - the base game object is defined in here along with a base game component for including objects in the XNA Game's components collection.  Future items in here will be other common bases; screen, camera, and some sort of base spacial partitioning class either a grid or a quadtree or both&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Augments - a base class + various primitive implementations of game object expansion pieces&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Automations - this is the bit I've been working on the past couple of days, it's a system of rudimentary classes that primarily hold information which can be used to modify various properties of augments.  Automations are intended to be Augments, but it's such a big category of "stuff" that it got it's own namespace.  An example of an Automation Augment would be, for example, if you have a Transformation augment attached to a game object, the game object gains the ability to be transformed by a matrix.  You can then attach an automation augment to that game object, specify which element of the transformation object you want the automate, and this will allow for "scripting" various activities over pre-defined times &amp; destinations.  I have a system like this now, it's just not nearly half as elegant as this revision will hopefully be&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Augment Update Services - the way I'm experimenting/planning to update augments is to create a collection of service implementations that perform various tasks, each built to accept a single augment at a time.  Every single augment will have a reference to the service it uses to update itself, so when an augment wants to update, it simply passes itself in to it's service reference.&lt;/li&gt;&lt;/ul&gt;So that's kind of the gist of it so far, and I'm getting reasonably close to finishing up the classes in the Automation Namespace, but my wife is hardcore giving me the stink-eye so I better turn my laptop off before I get busted.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-6256680023854134895?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/6256680023854134895/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=6256680023854134895' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/6256680023854134895'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/6256680023854134895'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2008/04/xnamachine.html' title='The XNAMachine'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-8864661059828083894</id><published>2008-03-23T14:05:00.000-07:00</published><updated>2008-06-20T03:09:04.239-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Project: XNAMachine engine'/><title type='text'>Composition</title><content type='html'>Well I've been bitten by the Composition bug.  In a big way.  So to satiate my newfound curiosity, I must confess I've been spending time on an experimental clone of my 2D engine using a technique of dynamic &lt;a href="http://en.wikipedia.org/wiki/Object_composition" target="_new"&gt;Composition&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The Composition version of the engine is based around a single "Game Object" class.  This class is effectively nothing more than a collection of IAugmentation interfaces.&lt;br /&gt;&lt;br /&gt;In my existing engine, the Sprite class has become quite large; what's more, not all Sprites always utilize every member and feature of the class.  By partitioning this class into several different stand-alone "mini-classes" (all of which implement the IAugmentation interface), these mini-classes become "Augmentations".  From this, one can start with an empty game object and build it into anything by adding the appropriate behavioral and/or data Augmentations to it's IAugmentation collection.&lt;br /&gt;&lt;br /&gt;What's seductive about the Composition model is that this building process is not significantly different between design time and run time.  To me this is the primary advantage of using Composition over Inheritance, which AFAIK is largely static at run time.  I.e., once you define your class that inherits from &amp;lt;whatever&amp;gt;, you're stuck with that at run time.  With Composition, you could simply remove one Augment and add another.&lt;br /&gt;&lt;br /&gt;My only concern with what I've developed so far is that dictionary lookups are becoming somewhat frequent - i.e., I find myself querying whether or not a game object has been augmented with &amp;lt;augmentX&amp;gt;, and if so, retrieving that augment for use.  These queries don't exist so much in the Inheritance model, and this aspect may require some fine-tuning as things get progressively more complex.  But, we shall see.&lt;br /&gt;&lt;br /&gt;Fun stuff!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-8864661059828083894?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/8864661059828083894/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=8864661059828083894' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/8864661059828083894'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/8864661059828083894'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2008/03/composition.html' title='Composition'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-4974611940210340402</id><published>2008-03-11T21:41:00.000-07:00</published><updated>2008-06-20T02:53:26.646-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tips + Tricks'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA 2.0'/><title type='text'>PointAt v2.0</title><content type='html'>In Tutorial 6 (The PointAt method), I suggested a way one sprite can "point" at another, given totally arbitrary tree nesting / matrix transform between the two objects.  The code was:&lt;br /&gt;&lt;!-- BEGIN &lt;br /&gt;--&gt;&lt;style type="text/css"&gt;k{color:#0000FF;}c{color:#008000;}t{color:#A31515;}n{}.o{border-left:solid 1px grey;border-top:solid 1px grey;font-family:Courier New;vertical-align:top;font-size:10pt;text-align:left;color:#000000;}&lt;/style&gt;&lt;div class="o" style="width:auto;height:auto;overflow-x:visible;overflow-y:visible;"&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;summary&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;Point&amp;nbsp;one&amp;nbsp;sprite's&amp;nbsp;origin&amp;nbsp;at&amp;nbsp;another&amp;nbsp;sprite's&amp;nbsp;origin&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;/summary&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;PointAt(&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;thePointer&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Sprite,&amp;nbsp;&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;theTarget&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Sprite)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Dim&lt;/k&gt;&amp;nbsp;objTargetWorldPosition&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Vector2&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;If&lt;/k&gt;&amp;nbsp;theTarget.Parent&amp;nbsp;&lt;k&gt;IsNot&lt;/k&gt;&amp;nbsp;&lt;k&gt;Nothing&lt;/k&gt;&amp;nbsp;&lt;k&gt;Then&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;objTargetWorldPosition&amp;nbsp;=&amp;nbsp;Vector2.Transform(theTarget.Location,&amp;nbsp;theTarget.Parent.DrawMatrix)&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Else&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;objTargetWorldPosition&amp;nbsp;=&amp;nbsp;theTarget.Location&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;If&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;thePointer.Rotation&amp;nbsp;=&amp;nbsp;0&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;With&lt;/k&gt;&amp;nbsp;Vector2.Transform(objTargetWorldPosition,&amp;nbsp;Matrix.Invert(thePointer.DrawMatrix))&amp;nbsp;-&amp;nbsp;thePointer.Origin&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;thePointer.Rotation&amp;nbsp;=&amp;nbsp;&lt;k&gt;CSng&lt;/k&gt;(Math.Atan2(.Y,&amp;nbsp;.X)&amp;nbsp;+&amp;nbsp;(Math.PI&amp;nbsp;/&amp;nbsp;2))&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;With&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;/div&gt;&lt;!-- &lt;br /&gt;END --&gt;&lt;br /&gt;And that works, but I realized an alternative way to solve the same problem today.  I haven't compared the raw performance of this new way vs. the other, so I can't say if it's &lt;span style="font-style:italic;"&gt;faster&lt;/span&gt;... but I suspect it might be.&lt;br /&gt;&lt;br /&gt;&lt;!-- BEGIN &lt;br /&gt;--&gt;&lt;style type="text/css"&gt;k{color:#0000FF;}c{color:#008000;}t{color:#A31515;}n{}.o{border-left:solid 1px grey;border-top:solid 1px grey;font-family:Courier New;vertical-align:top;font-size:10pt;text-align:left;color:#000000;}&lt;/style&gt;&lt;div class="o" style="width:auto;height:auto;overflow-x:visible;overflow-y:visible;"&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;summary&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;Gets&amp;nbsp;the&amp;nbsp;radian&amp;nbsp;between&amp;nbsp;two&amp;nbsp;sprite&amp;nbsp;origins&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;/summary&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Function&lt;/k&gt;&amp;nbsp;PointAt(&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;thePointer&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Sprite,&amp;nbsp;&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;theTarget&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Sprite)&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;&lt;k&gt;Single&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Dim&lt;/k&gt;&amp;nbsp;a,&amp;nbsp;b,&amp;nbsp;c&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Vector2&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;Vector2.Transform(thePointer.Origin,&amp;nbsp;thePointer.DrawMatrix,&amp;nbsp;a)&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;Vector2.Transform(theTarget.Origin,&amp;nbsp;theTarget.DrawMatrix,&amp;nbsp;b)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;c&amp;nbsp;=&amp;nbsp;b&amp;nbsp;-&amp;nbsp;a&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Return&lt;/k&gt;&amp;nbsp;&lt;k&gt;CSng&lt;/k&gt;(Math.Atan2(c.Y,&amp;nbsp;c.X)&amp;nbsp;+&amp;nbsp;MathHelper.PiOver2)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Function&lt;/k&gt;&lt;br /&gt;&lt;/div&gt;&lt;!-- &lt;br /&gt;END --&gt;&lt;br /&gt;I made it a function that returns the radian value, so that you can do with it whatever you so choose - either assign it to the Rotation value of thePointer, or just query the angle between two things for whatever reason.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-4974611940210340402?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/4974611940210340402/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=4974611940210340402' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/4974611940210340402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/4974611940210340402'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2008/03/pointat-v20.html' title='PointAt v2.0'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-4092275984417299501</id><published>2008-03-07T12:37:00.001-08:00</published><updated>2008-06-20T02:53:36.461-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tips + Tricks'/><title type='text'>Uninventing some wheels - Stacks &amp; Dictionaries</title><content type='html'>You know the "Hashtable(Of Type)" class used by the VBContentManager?&lt;br /&gt;&lt;br /&gt;There's actually a &lt;a href="http://msdn2.microsoft.com/en-us/library/xfhwa508(VS.80).aspx" target="_new"&gt;generic Dictionary class&lt;/a&gt; in the .NET framework that serves the same purpose.&lt;br /&gt;&lt;br /&gt;The Dictionary class provides two type predicates, one for the key and one for the value, whereas my Hashtable class simply presumes the key to be of type String.  We could do away with the Hashtable(Of Type) class all together, and simply start using Dictionaries.&lt;br /&gt;&lt;br /&gt;The other thing I started messing with is the &lt;a href="http://msdn2.microsoft.com/en-us/library/3278tedw(VS.80).aspx" target="_new"&gt;generic Stack class&lt;/a&gt;.  My current ScreenManager class keeps track of Screen order via some rather sloppy and unnecessary list manipulation.  But all of that can be done away with and replaced with a Stack(Of Screen).  &lt;br /&gt;&lt;br /&gt;Stacks are a very convenient way to maintain Screen order within a ScreenManager, because there is a natural synchronization between the inherent nature of Stacks and the way we display Screens.  &lt;br /&gt;&lt;br /&gt;At the beginning of the program, push Screen1 onto the Stack.  When you transition away from that Screen1 to Screen47, pop the Stack (removing Screen1) and push Screen47 onto the Stack.  If you want to display Screen2 &lt;span style="font-style:italic;"&gt;over&lt;/span&gt; Screen47, simply push Screen2 onto the Stack.  Now Screen2 is above Screen47, which is exactly what we wanted to display.  When Screen2 is finished, pop it off the Stack, and Screen47 resumes the top position.  It's a very convenient way to maintain the order of Screens, and I will employ this technique in the Screen tutorial.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-4092275984417299501?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/4092275984417299501/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=4092275984417299501' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/4092275984417299501'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/4092275984417299501'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2008/03/uninventing-some-wheels-stacks.html' title='Uninventing some wheels - Stacks &amp; Dictionaries'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-2083115942257775189</id><published>2008-03-05T18:21:00.000-08:00</published><updated>2008-06-19T16:09:54.426-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Off topic'/><title type='text'>Obligatory update</title><content type='html'>I've been busier than usual for a while, doing some work on my car (painting wheels - my garage looks, and smells, like a paint shop) and also I'm going through a crunch phase at work, making a great big middle-tier ADO.NET engine which will &lt;span style="font-weight:bold;"&gt;really&lt;/span&gt; expedite creation of business objects &amp; UIs, which is rather cool.&lt;br /&gt;&lt;br /&gt;But anyway, I'll be up to my eyeballs in that for another week or so, after that I can get back to continuing with more XNA stuff.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-2083115942257775189?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/2083115942257775189/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=2083115942257775189' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/2083115942257775189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/2083115942257775189'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2008/03/obligatory-update.html' title='Obligatory update'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-7408459895360116541</id><published>2008-02-25T21:12:00.000-08:00</published><updated>2008-06-20T02:54:48.275-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Me'/><title type='text'>Tutorial schedule</title><content type='html'>While I've rambled on about Screens, Scenes and Cameras I haven't really put up any tutorials in 4 months since "Tutorial 8" and I'm getting a little bit ahead of myself.  &lt;br /&gt;&lt;br /&gt;So here's a rough TODO list, sort of making this for myself, but it's what I want to cover in detail before I get too off track here:&lt;ul&gt;&lt;li&gt;&lt;b&gt;Screens&lt;/b&gt; - a proper introduction to Screens, adding a base Screen class to the Engine&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Screen Manager&lt;/b&gt; - a simple little tool to help shuffle Screens around&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Scenes&lt;/b&gt; - like a Screen, but bigger - huge, even.  I may rename Scenes to... "Worlds" or "Levels" or, something.  Screens and Scenes are conceptually similar with similar names, kind of has an inherent confusion built into it&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;SceneCameras&lt;/b&gt; - this will be the in-depth tutorial on what I've been doing lately.  Cameras physically exist on Screens, and are used to peek inside of Scenes&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Automation&lt;/b&gt; - I have an automation system written, which I can actually take the opportunity to improve upon a little bit as I write it up here on the blog, which allows you to "script" change in game object properties over time.  Things like movement, rotation, alpha (fade in/out), changing texture, scaling, stuff like that.  This is a very useful for doing UI-ish tasks, like Screen transitions, but I use it for all sorts of other stuff&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;SceneGraph? QuadTrees?&lt;/b&gt; - In a big Scene with lots and lots of game objects, for efficiency sake we will need some way to make quick collision checks between potentially thousands of objects.  If a bullet is flying through a level of your game with 5,000 potential objects it could strike, you don't want to check for collision with all 5,000 objects if you can help it.  I haven't tackled this yet so it's coming up next on my R&amp;D list&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;AI&lt;/b&gt; - Another R&amp;D project&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Level Generation&lt;/b&gt; - I've been reading up a little on algorithms for creating random mazes, it's kind of interesting and thankfully not too complicated.  I'll use it in the Star Maze project&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Sound&lt;/b&gt; - I'm assuming this won't be too difficult to implement (famous last words)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Star Maze&lt;/b&gt; - take everything covered and use it to re-create a classic 2D game&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;And beyond that...&lt;/b&gt; - like most wanna-be game hobbyists I have an ambitious vaporware project I want to turn into a reality.  But first I'll create Star Maze, get some good practice there, and if all goes well we can start to tinker around with other things&lt;/li&gt;&lt;/ul&gt;So that's the plan.  There's no ETA :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-7408459895360116541?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/7408459895360116541/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=7408459895360116541' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/7408459895360116541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/7408459895360116541'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2008/02/tutorial-schedule.html' title='Tutorial schedule'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-8872601212279042343</id><published>2008-02-25T11:37:00.000-08:00</published><updated>2008-06-20T02:55:01.640-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Me'/><title type='text'>www.xnamachine.com</title><content type='html'>&lt;span style="font-weight:bold;"&gt;xnamachine.blogspot.com&lt;/span&gt; should now redirect you to &lt;span style="font-weight:bold;"&gt;www.xnamachine.com&lt;/span&gt;.  &lt;span style="font-weight:bold;"&gt;www.xnamachine.com&lt;/span&gt; is now the "official" address.&lt;br /&gt;&lt;br /&gt;Nothing else is different, I just decided a more succinct name would be cool.&lt;br /&gt;&lt;br /&gt;Well, ok I changed the layout just a little bit... just for fun (I don't know how IE-friendly it is yet).  I noticed my formatted code posts don't show up right in IE, so that's kind of a bummer.  I'll try to fix that... eventually.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-8872601212279042343?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/8872601212279042343/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=8872601212279042343' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/8872601212279042343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/8872601212279042343'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2008/02/wwwxnamachinecom.html' title='www.xnamachine.com'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-7688145324972774375</id><published>2008-02-17T05:35:00.000-08:00</published><updated>2008-06-20T02:55:29.154-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Project: 2D Camera'/><title type='text'>SceneCamera class nears completion</title><content type='html'>Here is a video demonstrating the features of the SceneCamera class as it nears completion:&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="350"&gt; &lt;param name="movie" value="http://www.youtube.com/v/nam-I_dLoDc"&gt; &lt;/param&gt; &lt;embed src="http://www.youtube.com/v/nam-I_dLoDc" type="application/x-shockwave-flash" width="425" height="350"&gt; &lt;/embed&gt; &lt;/object&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=nam-I_dLoDc" target="_new"&gt;direct link&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;All SceneCameras will by default perform a translation of the subject (e.g., follow it's X/Y position), and all SceneCameras  have the ability to scale (zoom in/out).  In addition to these two default behaviors there are two optional properties to specify camera style.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Rotate with subject&lt;/span&gt;: If this property is True, it causes the SceneCamera to lock rotation with its subject.  This creates a camera style whereby the subject appears fixed and the entire Scene rotates.  In the video, the SceneCamera on the right side rotates with it's subject.  The SceneCamera on the left side has this property set to False, creating an opposite effect (the Scene appears fixed and the subject rotates).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Clamp to Scene&lt;/span&gt;: If this property is True, the SceneCamera is not permitted to exit the perimeter of the Scene.  In the video, the left side has this property set to True, and it is False on the right side.&lt;br /&gt;&lt;br /&gt;Finally, there is a 3rd SceneCamera moving around the perimeter of the Screen to demonstrate the "game object" nature of SceneCameras.  Like a Sprite, a SceneCamera can easily be any size, and can move around the Screen without disturbing it's ability to view a subject.&lt;br /&gt;&lt;br /&gt;What I will be adding next is a property for &lt;span style="font-weight:bold;"&gt;Chase lag&lt;/span&gt;, so the SceneCamera can be given a variable amount of imprecision when following its subject.  Once this is done, the SceneCamera class should be adequately functional.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-7688145324972774375?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/7688145324972774375/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=7688145324972774375' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/7688145324972774375'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/7688145324972774375'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2008/02/2d-scenecamera-near-completion.html' title='SceneCamera class nears completion'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-6677260728488485447</id><published>2008-02-06T11:53:00.000-08:00</published><updated>2008-02-06T14:42:32.797-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VB.NET Content Pipeline'/><title type='text'>How to modify the VBContentManager to load other content types</title><content type='html'>Here's an example of how you can teach the VBContentManager to load other content types.&lt;br /&gt;&lt;br /&gt;This sample code below shows you what to add (in bold) in order to load .fbx models.  Please note that to actually display a 3D model, you'll have to write your own 3D rendering code - 3D is out of scope of my 2D engine blog.  This just demonstrates how you can teach the VBContentManager to load other content types, the example just happens to use .fbx models.&lt;br /&gt;&lt;br /&gt;&lt;!-- BEGIN &lt;br /&gt;--&gt;&lt;style type="text/css"&gt;k{color:#0000FF;}c{color:#008000;}t{color:#A31515;}n{}.o{border-left:solid 1px grey;border-top:solid 1px grey;font-family:Courier New;vertical-align:top;font-size:10pt;text-align:left;color:#000000;}&lt;/style&gt;&lt;div class="o" style="width:613px;height:613px;overflow-x:scroll;overflow-y:scroll;"&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Class&lt;/k&gt;&amp;nbsp;VBContentManager&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Inherits&lt;/k&gt;&amp;nbsp;ContentManager&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'Add&amp;nbsp;a&amp;nbsp;Hashtable(Of&amp;nbsp;Model)&amp;nbsp;called&amp;nbsp;Modles,&amp;nbsp;to&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'give&amp;nbsp;your&amp;nbsp;models&amp;nbsp;a&amp;nbsp;place&amp;nbsp;to&amp;nbsp;arrive&amp;nbsp;in&amp;nbsp;memory...&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;b&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;Models&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Hashtable(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;Model)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'Add&amp;nbsp;"intDupeModel"&amp;nbsp;variable&amp;nbsp;to&amp;nbsp;this&amp;nbsp;series...&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'This&amp;nbsp;allows&amp;nbsp;the&amp;nbsp;VBContentManager&amp;nbsp;to&amp;nbsp;append&amp;nbsp;a&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'unique&amp;nbsp;number&amp;nbsp;to&amp;nbsp;any&amp;nbsp;duplicate&amp;nbsp;filenames&amp;nbsp;it&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'may&amp;nbsp;encounter&amp;nbsp;when&amp;nbsp;loading&amp;nbsp;models&amp;nbsp;from&amp;nbsp;disk&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;intDupeSound,&amp;nbsp;intDupeTexture,&amp;nbsp;intDupeFont,&amp;nbsp;intDupeEffect,&amp;nbsp;&lt;b&gt;intDupeModel&lt;/b&gt;&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;&lt;k&gt;Integer&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'Add&amp;nbsp;"Models"&amp;nbsp;to&amp;nbsp;the&amp;nbsp;ContentTypes&amp;nbsp;enumeration,&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'and&amp;nbsp;make&amp;nbsp;it&amp;nbsp;the&amp;nbsp;next&amp;nbsp;available&amp;nbsp;value&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Enum&lt;/k&gt;&amp;nbsp;ContentTypes&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;Textures&amp;nbsp;=&amp;nbsp;0&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;Fonts&amp;nbsp;=&amp;nbsp;1&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;Sounds&amp;nbsp;=&amp;nbsp;2&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;Effects&amp;nbsp;=&amp;nbsp;3&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;b&gt;Models&amp;nbsp;=&amp;nbsp;4&lt;/b&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Enum&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'Add&amp;nbsp;"FbxImporter"&amp;nbsp;to&amp;nbsp;the&amp;nbsp;ImporterName&amp;nbsp;enumeration&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'Make&amp;nbsp;sure&amp;nbsp;it&amp;nbsp;has&amp;nbsp;the&amp;nbsp;same&amp;nbsp;value&amp;nbsp;as&amp;nbsp;Models&amp;nbsp;in&amp;nbsp;the&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'ContentTypes&amp;nbsp;enumeration...&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;&lt;k&gt;Enum&lt;/k&gt;&amp;nbsp;ImporterName&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;TextureImporter&amp;nbsp;=&amp;nbsp;0&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;FontDescriptionImporter&amp;nbsp;=&amp;nbsp;1&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;XactImporter&amp;nbsp;=&amp;nbsp;2&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;EffectImporter&amp;nbsp;=&amp;nbsp;3&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;b&gt;FbxImporter&amp;nbsp;=&amp;nbsp;4&lt;/b&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Enum&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'Add&amp;nbsp;"ModelProcessor"&amp;nbsp;to&amp;nbsp;the&amp;nbsp;ProcessorName&amp;nbsp;enumeration&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'Make&amp;nbsp;sure&amp;nbsp;it&amp;nbsp;has&amp;nbsp;the&amp;nbsp;same&amp;nbsp;value&amp;nbsp;as&amp;nbsp;Models&amp;nbsp;in&amp;nbsp;the&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'ContentTypes&amp;nbsp;enumeration.&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;&lt;k&gt;Enum&lt;/k&gt;&amp;nbsp;ProcessorName&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;TextureProcessor&amp;nbsp;=&amp;nbsp;0&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;FontDescriptionProcessor&amp;nbsp;=&amp;nbsp;1&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;XactProcessor&amp;nbsp;=&amp;nbsp;2&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;EffectProcessor&amp;nbsp;=&amp;nbsp;3&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;b&gt;ModelProcessor&amp;nbsp;=&amp;nbsp;4&lt;/b&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Enum&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'In&amp;nbsp;Public&amp;nbsp;Sub&amp;nbsp;New,&amp;nbsp;add&amp;nbsp;code&amp;nbsp;to&amp;nbsp;instantiate&amp;nbsp;the&amp;nbsp;Models&amp;nbsp;hashtable&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'you&amp;nbsp;added&amp;nbsp;above&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;&lt;k&gt;New&lt;/k&gt;(&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;ServiceProvider&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;IServiceProvider,&amp;nbsp;&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;ContentFolder&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;String)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'(existing&amp;nbsp;code&amp;nbsp;omitted)&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'Add&amp;nbsp;code&amp;nbsp;to&amp;nbsp;instantiate&amp;nbsp;the&amp;nbsp;models&amp;nbsp;hashtable&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;b&gt;&lt;k&gt;Me&lt;/k&gt;.Models&amp;nbsp;=&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;Hashtable(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;Model)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:16px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'In&amp;nbsp;LoadAllContent,&amp;nbsp;add&amp;nbsp;a&amp;nbsp;Try&amp;nbsp;block&amp;nbsp;for&amp;nbsp;Model&amp;nbsp;importing&amp;nbsp;in&amp;nbsp;the&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:16px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'Catch&amp;nbsp;block&amp;nbsp;for&amp;nbsp;Effects,&amp;nbsp;and&amp;nbsp;move&amp;nbsp;the&amp;nbsp;unknown&amp;nbsp;file&amp;nbsp;handler&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:16px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'to&amp;nbsp;the&amp;nbsp;catch&amp;nbsp;block&amp;nbsp;for&amp;nbsp;attempted&amp;nbsp;Model&amp;nbsp;load&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;LoadAllContent()&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'(existing&amp;nbsp;code&amp;nbsp;omitted)&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Try&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:216px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'Effect?&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:216px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;With&lt;/k&gt;&amp;nbsp;file.FullName.ToLower&lt;br /&gt;&lt;n style="padding-left:248px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.Effects.Add(file.Name.Replace(file.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;),&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.Load(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;Effect)(.Replace(&lt;k&gt;Me&lt;/k&gt;.strExecutingFolder&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"\"&lt;/t&gt;,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;).Replace(file.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&lt;br /&gt;&lt;n style="padding-left:216px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;With&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'Instead&amp;nbsp;of&amp;nbsp;giving&amp;nbsp;up&amp;nbsp;at&amp;nbsp;this&amp;nbsp;point,&amp;nbsp;catch&amp;nbsp;this&amp;nbsp;as&amp;nbsp;notAnEffect,&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'and&amp;nbsp;add&amp;nbsp;1&amp;nbsp;more&amp;nbsp;check&amp;nbsp;to&amp;nbsp;see&amp;nbsp;if&amp;nbsp;the&amp;nbsp;file&amp;nbsp;is&amp;nbsp;a&amp;nbsp;model...&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;b&gt;&lt;k&gt;Catch&lt;/k&gt;&amp;nbsp;notAnEffect&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Exception&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:216px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Try&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:248px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'Model?&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:248px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;With&lt;/k&gt;&amp;nbsp;file.FullName.ToLower&lt;br /&gt;&lt;n style="padding-left:280px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.Models.Add(file.Name.Replace(file.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;),&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.Load(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;Model)(.Replace(&lt;k&gt;Me&lt;/k&gt;.strExecutingFolder&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"\"&lt;/t&gt;,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;).Replace(file.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&lt;br /&gt;&lt;n style="padding-left:248px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;With&lt;/k&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:240px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'If&amp;nbsp;that&amp;nbsp;doesn't&amp;nbsp;work,&amp;nbsp;then&amp;nbsp;I've&amp;nbsp;run&amp;nbsp;out&amp;nbsp;of&amp;nbsp;things&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:240px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'to&amp;nbsp;try,&amp;nbsp;so...&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:216px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;b&gt;&lt;k&gt;Catch&lt;/k&gt;&amp;nbsp;unknown&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Exception&lt;br /&gt;&lt;n style="padding-left:248px;"&gt;&amp;nbsp;&lt;/n&gt;strUnknownFiles&amp;nbsp;&amp;=&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;file.FullName&lt;br /&gt;&lt;n style="padding-left:216px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Try&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Try&lt;/k&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:64px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'(existing&amp;nbsp;code&amp;nbsp;omitted)&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'In&amp;nbsp;HarvestContent,&amp;nbsp;add&amp;nbsp;code&amp;nbsp;to&amp;nbsp;search&amp;nbsp;for&amp;nbsp;.fbx&amp;nbsp;files.&amp;nbsp;&amp;nbsp;Also,&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'I'm&amp;nbsp;going&amp;nbsp;to&amp;nbsp;add&amp;nbsp;code&amp;nbsp;to&amp;nbsp;look&amp;nbsp;for&amp;nbsp;.tga&amp;nbsp;texture&amp;nbsp;files&amp;nbsp;as&amp;nbsp;well&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'in&amp;nbsp;case&amp;nbsp;I&amp;nbsp;need&amp;nbsp;those&amp;nbsp;too.&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;HarvestContent()&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'(existing&amp;nbsp;code&amp;nbsp;omitted)&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'Add&amp;nbsp;code&amp;nbsp;to&amp;nbsp;look&amp;nbsp;for&amp;nbsp;.tga&amp;nbsp;files...&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;b&gt;&lt;k&gt;For&lt;/k&gt;&amp;nbsp;&lt;k&gt;Each&lt;/k&gt;&amp;nbsp;texture&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;System.IO.FileInfo&amp;nbsp;&lt;k&gt;In&lt;/k&gt;&amp;nbsp;objRoot.GetFiles(&lt;t&gt;"*.tga"&lt;/t&gt;,&amp;nbsp;IO.SearchOption.AllDirectories)&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;If&lt;/k&gt;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.objContent.Contains(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Textures,&amp;nbsp;texture,&amp;nbsp;texture.Name.Replace(texture.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&amp;nbsp;&lt;k&gt;Then&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.intDupeTexture&amp;nbsp;+=&amp;nbsp;1&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objContent.Add(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Textures,&amp;nbsp;texture,&amp;nbsp;texture.Name.Replace(texture.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)&amp;nbsp;&amp;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.intDupeTexture.ToString))&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Else&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objContent.Add(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Textures,&amp;nbsp;texture,&amp;nbsp;texture.Name.Replace(texture.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;If&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Next&lt;/k&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'Add&amp;nbsp;code&amp;nbsp;to&amp;nbsp;look&amp;nbsp;for&amp;nbsp;.fbx&amp;nbsp;files...&amp;nbsp;these&amp;nbsp;are&amp;nbsp;similar&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'code&amp;nbsp;blocks,&amp;nbsp;just&amp;nbsp;change&amp;nbsp;the&amp;nbsp;ContentType&amp;nbsp;enumeration&amp;nbsp;and&amp;nbsp;the&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'extension&amp;nbsp;we&amp;nbsp;want&amp;nbsp;to&amp;nbsp;look&amp;nbsp;for&amp;nbsp;from&amp;nbsp;all&amp;nbsp;the&amp;nbsp;existing&amp;nbsp;ones&amp;nbsp;in&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'this&amp;nbsp;sub&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;b&gt;&lt;k&gt;For&lt;/k&gt;&amp;nbsp;&lt;k&gt;Each&lt;/k&gt;&amp;nbsp;model&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;System.IO.FileInfo&amp;nbsp;&lt;k&gt;In&lt;/k&gt;&amp;nbsp;objRoot.GetFiles(&lt;t&gt;"*.fbx"&lt;/t&gt;,&amp;nbsp;IO.SearchOption.AllDirectories)&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;If&lt;/k&gt;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.objContent.Contains(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Models,&amp;nbsp;model,&amp;nbsp;model.Name.Replace(model.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&amp;nbsp;&lt;k&gt;Then&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.intDupeModel&amp;nbsp;+=&amp;nbsp;1&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objContent.Add(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Models,&amp;nbsp;model,&amp;nbsp;model.Name.Replace(model.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)&amp;nbsp;&amp;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.intDupeModel.ToString))&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Else&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objContent.Add(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Models,&amp;nbsp;model,&amp;nbsp;model.Name.Replace(model.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;If&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Next&lt;/k&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;/div&gt;&lt;!-- &lt;br /&gt;END --&gt;&lt;br /&gt;&lt;br /&gt;The VBContentManager code should now be able to import .fbx files.  Create a folder called Models in your Content folder in the solution explorer, and put .fbx files in there:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i97.photobucket.com/albums/l223/emachine74/models.png" /&gt;&lt;br /&gt;&lt;br /&gt;Here I copied all the models (and textures) from the SpaceWar example, and they now compile &amp; load into the Models hashtable of the VBContentManager.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-6677260728488485447?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/6677260728488485447/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=6677260728488485447' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/6677260728488485447'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/6677260728488485447'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2008/02/how-to-modify-vbcontentmanager-to-load.html' title='How to modify the VBContentManager to load other content types'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-7192092096413503215</id><published>2008-02-02T02:19:00.000-08:00</published><updated>2008-06-20T02:55:46.713-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Project: 2D Camera'/><title type='text'>SceneCamera</title><content type='html'>I got a chance to get a little more camera work done over the past couple days.  What I've made is a 2D camera which is a game object (as such it can be placed onto a Screen just like anything else).  These cameras point at "Scenes", which are similar conceptually to Screens, but unlike Screens a Scene is not meant to "draw itself", it just sits in memory.  You use a SceneCamera to view a subset of the Scene.&lt;br /&gt;&lt;br /&gt;In this demonstration a Scene exists in memory, it's a simple repeating tile grid w/ a user-controlled ship.  Multiple SceneCameras are implemented to demonstrate the concept of viewing a Scene through a SceneCamera.  All of the SceneCameras are pointing at the same ship in the same Scene.  &lt;br /&gt;&lt;br /&gt;Pardon the obnoxious music, I was just having fun with &lt;a href="http://www.adobe.com/products/premiere/" target="_new"&gt;Premiere&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/a6BveT9K_Wo&amp;rel=1"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/a6BveT9K_Wo&amp;rel=1" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=a6BveT9K_Wo" target="_new"&gt;direct link&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It's still pretty beta-ish but it basically works, I'll do a write up after it becomes more properly solidified.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-7192092096413503215?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/7192092096413503215/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=7192092096413503215' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/7192092096413503215'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/7192092096413503215'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2008/02/cameras.html' title='SceneCamera'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-9071406508615768260</id><published>2008-01-28T18:53:00.000-08:00</published><updated>2008-06-20T02:55:55.780-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Off topic'/><title type='text'>Tell Microsoft you want VB support for GS</title><content type='html'>Microsoft is offering a &lt;a href="http://forums.xna.com/thread/42852.aspx"&gt;survey&lt;/a&gt; to XNA/Game Studio users for feedback on the XNA/Game Studio product.  There are one or two questions on the survey which give you the opportunity to suggest the support of other, non-C# .NET languages.  If you would like Game Studio to support VB, you should &lt;a href="http://forums.xna.com/thread/42852.aspx"&gt;fill out the survey&lt;/a&gt; and mention it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-9071406508615768260?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/9071406508615768260/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=9071406508615768260' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/9071406508615768260'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/9071406508615768260'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2008/01/tell-microsoft-you-want-vb-support-for.html' title='Tell Microsoft you want VB support for GS'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-5481403102728366588</id><published>2008-01-16T11:39:00.001-08:00</published><updated>2008-06-20T02:56:14.724-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tips + Tricks'/><title type='text'>Screens &amp; the Screen Manager</title><content type='html'>&lt;b&gt;Screens&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Screens are what I've been using, prior to implementing Cameras.  So they may change.  Here's how it all works now, and while the names may change in the future, the basic concept will probably remain mostly the same.&lt;br /&gt;&lt;br /&gt;In &lt;a href="http://xnamachine.blogspot.com/2007/11/tutorial-7-sprites-as-game-objects.html"&gt;Tutorial 7&lt;/a&gt; we defined custom game objects as separate classes in our project.  In doing so we abstracted a lot of detail out of our game class; not only the construction of the little ship &amp; turret tree, but also the Update code that moved a ship back and forth across the screen.  The primary focus on putting these things into a Ship class was to make them readily reusable - but did you notice it really helped tidy up the Game class?  In part there is a philosophical benefit to abstraction in that it simply helps to keep things looking tidy, if you're into that sort of thing.&lt;br /&gt;&lt;br /&gt;In the previous article &lt;a href="http://xnamachine.blogspot.com/2008/01/forest-for-your-trees.html"&gt;A forest for your trees&lt;/a&gt;, we simulated this strategy somewhat in a hypothetical Game class that defined some make-believe game objects as members:&lt;br /&gt;&lt;br /&gt;&lt;!-- BEGIN &lt;br /&gt;--&gt;&lt;style type="text/css"&gt;k{color:#0000FF;}c{color:#008000;}t{color:#A31515;}n{}.o{border-left:solid 1px grey;border-top:solid 1px grey;font-family:Courier New;vertical-align:top;font-size:10pt;text-align:left;color:#000000;}&lt;/style&gt;&lt;div class="o" style="width:auto;height:auto;overflow-x:visible;overflow-y:visible;"&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Class&lt;/k&gt;&amp;nbsp;MyGameTutorial&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Inherits&lt;/k&gt;&amp;nbsp;Game&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'Main&amp;nbsp;menu&amp;nbsp;stuff&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;objNewGame&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;NewGame&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;objGraphics&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Graphics&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;objQuit&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Quit&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;objContinue&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Sprite&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'Game&amp;nbsp;stuff&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;objShip1&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;BadGuyShip&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;objShip2&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;BadGuyShip&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;objPlayer&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;PlayerShip&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;objHighScore&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Sprite&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'Initialization,&amp;nbsp;etc.&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;/div&gt;&lt;!-- &lt;br /&gt;END --&gt;&lt;br /&gt;We ended up with 8 game objects or trees, like so:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i97.photobucket.com/albums/l223/emachine74/treemess1.png" /&gt;&lt;img src="http://i97.photobucket.com/albums/l223/emachine74/treemess2.png" /&gt;&lt;br /&gt;&lt;br /&gt;And in theory you would manage (update/draw) all 8 of them directly from within the game class.  That's not too bad, but, half of these objects are meant for the main menu game state, and the other half belong to the actual "playing the game" game state.  The only way to know which ones even belong to which state is to read the comments above the member declarations!  I'm no coding guru, but even I know that's turning into a sketchy situation.&lt;br /&gt;&lt;br /&gt;If we take the time to define custom Screens, just like we defined custom game objects in Tutorial 7, we can perform yet another level of abstraction that will not only help organize us, and help us maintain game state, it will again make our game class a more tidy, simple thing to work with.&lt;br /&gt;&lt;br /&gt;Tutorial 7 also walked us through creating custom game objects by deriving new classes from Sprite.  You do something like this...&lt;br /&gt;&lt;br /&gt;&lt;!-- BEGIN &lt;br /&gt;--&gt;&lt;style type="text/css"&gt;k{color:#0000FF;}c{color:#008000;}t{color:#A31515;}n{}.o{border-left:solid 1px grey;border-top:solid 1px grey;font-family:Courier New;vertical-align:top;font-size:10pt;text-align:left;color:#000000;}&lt;/style&gt;&lt;div class="o" style="width:auto;height:auto;overflow-x:visible;overflow-y:visible;"&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Class&lt;/k&gt;&amp;nbsp;MenuObject&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Inherits&lt;/k&gt;&amp;nbsp;Sprite&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;ChildOption1&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Sprite&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;ChildOption2&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Sprite&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;&lt;k&gt;New&lt;/k&gt;()&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:72px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.ChildOption1&amp;nbsp;=&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;Sprite()&lt;br /&gt;&lt;n style="padding-left:72px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.ChildOption2&amp;nbsp;=&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;Sprite()&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:72px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.AddChild(ChildOption1)&lt;br /&gt;&lt;n style="padding-left:72px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.AddChild(ChildOption2)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'Update,&amp;nbsp;Draw&amp;nbsp;etc.&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;/div&gt;&lt;!-- &lt;br /&gt;END --&gt;&lt;br /&gt;We can do the very same thing to create custom Screen objects from our base Screen class.  Let's build some hypothetical screens to abstract those 8 game objects into 2 screens representing their respective states.  First here's a pseudo Main Menu Screen class:&lt;br /&gt;&lt;br /&gt;&lt;!-- BEGIN &lt;br /&gt;--&gt;&lt;style type="text/css"&gt;k{color:#0000FF;}c{color:#008000;}t{color:#A31515;}n{}.o{border-left:solid 1px grey;border-top:solid 1px grey;font-family:Courier New;vertical-align:top;font-size:10pt;text-align:left;color:#000000;}&lt;/style&gt;&lt;div class="o" style="width:auto;height:auto;overflow-x:visible;overflow-y:visible;"&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Class&lt;/k&gt;&amp;nbsp;MainMenuScreen&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Inherits&lt;/k&gt;&amp;nbsp;Screen&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;NewGameChoice&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;MenuObject&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;ContinueChoice&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Sprite&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;GraphicSettings&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;MenuObject&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;Quit&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;MenuObject&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;&lt;k&gt;New&lt;/k&gt;()&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:72px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.NewGameChoice&amp;nbsp;=&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;MenuObject()&lt;br /&gt;&lt;n style="padding-left:72px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.ContinueChoice&amp;nbsp;=&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;MenuObject()&lt;br /&gt;&lt;n style="padding-left:72px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.GraphicSettings&amp;nbsp;=&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;MenuObject()&lt;br /&gt;&lt;n style="padding-left:72px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.Quit&amp;nbsp;=&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;MenuObject()&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:72px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.AddChild(NewGameChoice)&lt;br /&gt;&lt;n style="padding-left:72px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.AddChild(ContinueChoice)&lt;br /&gt;&lt;n style="padding-left:72px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.AddChild(GraphicSettings)&lt;br /&gt;&lt;n style="padding-left:72px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.AddChild(Quit)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'Update,&amp;nbsp;Draw&amp;nbsp;etc.&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;/div&gt;&lt;!-- &lt;br /&gt;END --&gt;&lt;br /&gt;It looks like this:&lt;br /&gt;&lt;img src="http://i97.photobucket.com/albums/l223/emachine74/organized1.png" /&gt;&lt;br /&gt;&lt;br /&gt;Now how about a pseudo game screen class:&lt;br /&gt;&lt;br /&gt;&lt;!-- BEGIN &lt;br /&gt;--&gt;&lt;style type="text/css"&gt;k{color:#0000FF;}c{color:#008000;}t{color:#A31515;}n{}.o{border-left:solid 1px grey;border-top:solid 1px grey;font-family:Courier New;vertical-align:top;font-size:10pt;text-align:left;color:#000000;}&lt;/style&gt;&lt;div class="o" style="width:auto;height:auto;overflow-x:visible;overflow-y:visible;"&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Class&lt;/k&gt;&amp;nbsp;TheGameItself&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Inherits&lt;/k&gt;&amp;nbsp;Screen&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;Ship1&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;BadGuyShip&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;Ship2&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;BadGuyShip&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;Player&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;PlayerShip&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;HighScore&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Sprite&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;&lt;k&gt;New&lt;/k&gt;()&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:72px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.Ship1&amp;nbsp;=&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;BadGuyShip()&lt;br /&gt;&lt;n style="padding-left:72px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.Ship2&amp;nbsp;=&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;BadGuyShip()&lt;br /&gt;&lt;n style="padding-left:72px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.Player&amp;nbsp;=&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;PlayerShip()&lt;br /&gt;&lt;n style="padding-left:72px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.HighScore&amp;nbsp;=&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;Sprite()&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:72px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.AddChild(Ship1)&lt;br /&gt;&lt;n style="padding-left:72px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.AddChild(Ship2)&lt;br /&gt;&lt;n style="padding-left:72px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.AddChild(Player)&lt;br /&gt;&lt;n style="padding-left:72px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.AddChild(HighScore)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'Update,&amp;nbsp;Draw&amp;nbsp;etc.&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;/div&gt;&lt;!-- &lt;br /&gt;END --&gt;&lt;br /&gt;There we go:&lt;br /&gt;&lt;img src="http://i97.photobucket.com/albums/l223/emachine74/organized2.png" /&gt;&lt;br /&gt;&lt;br /&gt;Nevermind the naming mis-match on the diagram; the "game" node represents the "TheGameItself".&lt;br /&gt;&lt;br /&gt;Now instead of adding 8 game objects to our game class and organizing them with code comments, we can use two Screens with names that convey their purpose:&lt;br /&gt;&lt;br /&gt;&lt;!-- BEGIN &lt;br /&gt;--&gt;&lt;style type="text/css"&gt;k{color:#0000FF;}c{color:#008000;}t{color:#A31515;}n{}.o{border-left:solid 1px grey;border-top:solid 1px grey;font-family:Courier New;vertical-align:top;font-size:10pt;text-align:left;color:#000000;}&lt;/style&gt;&lt;div class="o" style="width:auto;height:auto;overflow-x:visible;overflow-y:visible;"&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Class&lt;/k&gt;&amp;nbsp;MyGameTutorial&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Inherits&lt;/k&gt;&amp;nbsp;Game&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;MainMenu&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;MainMenuScreen&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;TheGameItself&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;GameScreen&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'Initialization,&amp;nbsp;etc.&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;/div&gt;&lt;!-- &lt;br /&gt;END --&gt;&lt;br /&gt;This gains us a few benefits.  With the addition of a Screen node, we can now transform (move rotate scale etc) an entire Screen of "stuff", be it the main menu or the game itself, something we couldn't do easily prior to implementing Screens.  This also gives us something of a "choke point" for state management - if we want to draw the Main Menu, we just tell the main menu screen to .Update or .Draw and thanks to the underlying Sprite class, the rest more or less runs itself.  All our Game really has to worry about now is calling the Update &amp; Draw methods of whichever Screen(s) are appropriate for the current Game State.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;XNA.Framework.Game.Components and the ScreenManager&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;This has all been very cute, but it seems that all we've done is shuffled the question of &lt;span style="font-weight:bold;"&gt;which&lt;/span&gt; Game Objects to draw to which Screens to draw.  What we've done so far helps organize us, but it hasn't helped us answered that important question.&lt;br /&gt;&lt;br /&gt;You may be pleased to know we can eliminate the need to ask this question all together.  We can simply update/draw whichever Screens happen to be Enabled and/or Visible at the moment.  For this, we will borrow upon the &lt;a href="http://msdn2.microsoft.com/en-us/library/microsoft.xna.framework.game.components.aspx" target="_new"&gt;Components member of the XNA.Framework.Game class&lt;/a&gt;.  &lt;br /&gt;&lt;br /&gt;In brief, XNA.Framework.Game has a built-in Components collection.  This collection is meant to hold objects which derive from &lt;a href="http://msdn2.microsoft.com/en-us/library/microsoft.xna.framework.gamecomponent.aspx" target="_new"&gt;GameComponent&lt;/a&gt; and/or &lt;a href="http://msdn2.microsoft.com/en-us/library/microsoft.xna.framework.drawablegamecomponent.aspx" target="_new"&gt;DrawableGameComponent&lt;/a&gt;, but in truth can hold any object which implements the IGameComponent/IUpdateable/IDrawable interface(s).  The Game.Components collection is handy because, similar to how our Sprite class was created to automatically draw &amp; update it's children (if any), XNA.Framework.Game understands that if it finds anything in it's Components collection, it should Update and Draw whatever it finds in there.  There are a few useful features of this which we're going to borrow upon:&lt;ul&gt;&lt;li&gt;The IUpdateable and IDrawable interfaces have UpdateOrder and DrawOrder properties, respectively.  When XNA.Framework.Game processes it's Components collection, it uses these values to determine which objects get Updated first and which ones get Drawn first&lt;/li&gt;&lt;li&gt;The IUpdateable interface has an Enabled property (Boolean).  The Game class will only Update components where Enabled=True&lt;/li&gt;&lt;li&gt;Similar to Enabled, the IDrawable interface has a Visible property and only objects which are Visible will be Drawn&lt;/li&gt;&lt;/ul&gt;This is a convenient little system to plug our Screens into.&lt;br /&gt;&lt;br /&gt;Now you may have noticed some Interfaces being included in the base Screen class in the previous article, let's get another look at that:&lt;br /&gt;&lt;br /&gt;&lt;!-- BEGIN &lt;br /&gt;--&gt;&lt;style type="text/css"&gt;k{color:#0000FF;}c{color:#008000;}t{color:#A31515;}n{}.o{border-left:solid 1px grey;border-top:solid 1px grey;font-family:Courier New;vertical-align:top;font-size:10pt;text-align:left;color:#000000;}&lt;/style&gt;&lt;div class="o" style="width:auto;height:auto;overflow-x:visible;overflow-y:visible;"&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;MustInherit&lt;/k&gt;&amp;nbsp;&lt;k&gt;Class&lt;/k&gt;&amp;nbsp;Screen&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Inherits&lt;/k&gt;&amp;nbsp;Sprite&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Implements&lt;/k&gt;&amp;nbsp;IGameComponent&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Implements&lt;/k&gt;&amp;nbsp;IDrawable&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Implements&lt;/k&gt;&amp;nbsp;IUpdateable&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'etc&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Class&lt;/k&gt;&lt;br /&gt;&lt;/div&gt;&lt;!-- &lt;br /&gt;END --&gt;&lt;br /&gt;Implementing these interfaces allows our Screen class to be "registered" or added to the Game.Component collection.  Alternatively, you could be dealing with classes that inherit from GameComponent or DrawableGameComponent, which Implement these interfaces for you.  Since our Screen inherits from Sprite, this hasn't been done for us so I'll just have the Screen class implement the necessary interfaces.&lt;br /&gt;&lt;br /&gt;The Screen Manager class is going to be our middle-man between our game code and the Screens stored in the Game.Components collection.  The Screen Manager is going to add our Screens to the Collection for us, set DrawOrder for us, set Enabled &amp; Visible for us, all that stuff.  We'll just use the "Add", "Load" and "Unload" methods of the Screen Manager, for the most part.  Here's the class, which I'll post for your amusement.  If I get around to making a video about this I can go into more detail:&lt;br /&gt;&lt;br /&gt;&lt;!-- BEGIN &lt;br /&gt;--&gt;&lt;style type="text/css"&gt;k{color:#0000FF;}c{color:#008000;}t{color:#A31515;}n{}.o{border-left:solid 1px grey;border-top:solid 1px grey;font-family:Courier New;vertical-align:top;font-size:10pt;text-align:left;color:#000000;}&lt;/style&gt;&lt;div class="o" style="width:613px;height:613px;overflow-x:scroll;overflow-y:scroll;"&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Class&lt;/k&gt;&amp;nbsp;ScreenManager&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Shared&lt;/k&gt;&amp;nbsp;Game&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;GameEngine&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Shared&lt;/k&gt;&amp;nbsp;Root&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Root&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;&lt;k&gt;Shared&lt;/k&gt;&amp;nbsp;NameToGameID&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;Hashtable(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;&lt;k&gt;Integer&lt;/k&gt;)&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;&lt;k&gt;Shared&lt;/k&gt;&amp;nbsp;GameIDArrangement&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;List(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;&lt;k&gt;Integer&lt;/k&gt;)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Shared&lt;/k&gt;&amp;nbsp;&lt;k&gt;ReadOnly&lt;/k&gt;&amp;nbsp;&lt;k&gt;Property&lt;/k&gt;&amp;nbsp;GetScreen(&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;ScreenName&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;String)&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Screen&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Get&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;If&lt;/k&gt;&amp;nbsp;NameToGameID.Contains(ScreenName)&amp;nbsp;&lt;k&gt;Then&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Return&lt;/k&gt;&amp;nbsp;&lt;k&gt;CType&lt;/k&gt;(Game.Components(NameToGameID(ScreenName)),&amp;nbsp;Screen)&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Else&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Return&lt;/k&gt;&amp;nbsp;&lt;k&gt;Nothing&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;If&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Get&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Property&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Shared&lt;/k&gt;&amp;nbsp;&lt;k&gt;ReadOnly&lt;/k&gt;&amp;nbsp;&lt;k&gt;Property&lt;/k&gt;&amp;nbsp;CurrentScreen()&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Screen&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Get&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Dim&lt;/k&gt;&amp;nbsp;objRet&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Screen&amp;nbsp;=&amp;nbsp;&lt;k&gt;Nothing&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;For&lt;/k&gt;&amp;nbsp;intX&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;&lt;k&gt;Integer&lt;/k&gt;&amp;nbsp;=&amp;nbsp;GameIDArrangement.Count&amp;nbsp;-&amp;nbsp;1&amp;nbsp;&lt;k&gt;To&lt;/k&gt;&amp;nbsp;0&amp;nbsp;Step&amp;nbsp;-1&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;If&lt;/k&gt;&amp;nbsp;&lt;k&gt;CType&lt;/k&gt;(Game.Components(GameIDArrangement(intX)),&amp;nbsp;Screen).Enabled&amp;nbsp;&lt;k&gt;Then&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;objRet&amp;nbsp;=&amp;nbsp;&lt;k&gt;CType&lt;/k&gt;(Game.Components(GameIDArrangement(intX)),&amp;nbsp;Screen)&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Exit&lt;/k&gt;&amp;nbsp;&lt;k&gt;For&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;If&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Next&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Return&lt;/k&gt;&amp;nbsp;objRet&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Get&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Property&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Shared&lt;/k&gt;&amp;nbsp;&lt;k&gt;ReadOnly&lt;/k&gt;&amp;nbsp;&lt;k&gt;Property&lt;/k&gt;&amp;nbsp;IsScreen(&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;ScreenName&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;String)&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;&lt;k&gt;Boolean&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Get&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Return&lt;/k&gt;&amp;nbsp;NameToGameID.Contains(ScreenName)&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Get&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Property&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Shared&lt;/k&gt;&amp;nbsp;&lt;k&gt;Function&lt;/k&gt;&amp;nbsp;CreateRoot(&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;YourGame&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;GameEngine,&amp;nbsp;&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;objRootSize&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Vector2,&amp;nbsp;&lt;k&gt;Optional&lt;/k&gt;&amp;nbsp;&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;strTextureName&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;String&amp;nbsp;=&amp;nbsp;&lt;t&gt;""&lt;/t&gt;,&amp;nbsp;&lt;k&gt;Optional&lt;/k&gt;&amp;nbsp;&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;strTextureNameItem&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;String&amp;nbsp;=&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Root&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Dim&lt;/k&gt;&amp;nbsp;objRetVal&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Root&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'make&amp;nbsp;a&amp;nbsp;new&amp;nbsp;root&amp;nbsp;object&amp;nbsp;of&amp;nbsp;the&amp;nbsp;specified&amp;nbsp;size&amp;nbsp;at&amp;nbsp;0,0&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;objRetVal&amp;nbsp;=&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;Root(YourGame,&amp;nbsp;&lt;k&gt;Nothing&lt;/k&gt;,&amp;nbsp;&lt;t&gt;"root"&lt;/t&gt;,&amp;nbsp;&lt;k&gt;True&lt;/k&gt;,&amp;nbsp;&lt;k&gt;True&lt;/k&gt;,&amp;nbsp;strTextureName,&amp;nbsp;strTextureNameItem)&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;objRetVal.Size&amp;nbsp;=&amp;nbsp;objRootSize&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Return&lt;/k&gt;&amp;nbsp;objRetVal&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Function&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;summary&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;Adds&amp;nbsp;a&amp;nbsp;screen&amp;nbsp;to&amp;nbsp;the&amp;nbsp;screen&amp;nbsp;manager.&amp;nbsp;Adds&amp;nbsp;to&amp;nbsp;the&amp;nbsp;top&amp;nbsp;of&amp;nbsp;the&amp;nbsp;stack&amp;nbsp;by&amp;nbsp;default,&amp;nbsp;but&amp;nbsp;does&amp;nbsp;not&amp;nbsp;alter&amp;nbsp;Enabled&amp;nbsp;or&amp;nbsp;Visible&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;/summary&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;param&amp;nbsp;name="obj"&amp;gt;&amp;lt;/param&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;remarks&amp;gt;&amp;lt;/remarks&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Shared&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;AddScreen(&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;obj&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Screen)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;Root.AddScreen(obj)&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;Game.Components.Add(obj)&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;NameToGameID.Add(obj.Name,&amp;nbsp;Game.Components.Count&amp;nbsp;-&amp;nbsp;1)&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;GameIDArrangement.Add(Game.Components.Count&amp;nbsp;-&amp;nbsp;1)&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;obj.Initialize()&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;summary&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;Sends&amp;nbsp;the&amp;nbsp;specified&amp;nbsp;screen&amp;nbsp;to&amp;nbsp;the&amp;nbsp;bottom&amp;nbsp;of&amp;nbsp;the&amp;nbsp;stack&amp;nbsp;and&amp;nbsp;excludes&amp;nbsp;it&amp;nbsp;from&amp;nbsp;the&amp;nbsp;update/draw&amp;nbsp;loop&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;/summary&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;remarks&amp;gt;&amp;lt;/remarks&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Overloads&lt;/k&gt;&amp;nbsp;&lt;k&gt;Shared&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;Unload(&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;intScreenID&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;&lt;k&gt;Integer&lt;/k&gt;)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'Remove&amp;nbsp;this&amp;nbsp;screenID&amp;nbsp;the&amp;nbsp;update/draw&amp;nbsp;loop&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;With&lt;/k&gt;&amp;nbsp;&lt;k&gt;CType&lt;/k&gt;(Game.Components(intScreenID),&amp;nbsp;Screen)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;.SetVisiblity(&lt;k&gt;False&lt;/k&gt;)&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;.SetEnabled(&lt;k&gt;False&lt;/k&gt;)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;.IsModal&amp;nbsp;=&amp;nbsp;&lt;k&gt;False&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;With&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;summary&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;Brings&amp;nbsp;the&amp;nbsp;specified&amp;nbsp;screen&amp;nbsp;to&amp;nbsp;the&amp;nbsp;front&amp;nbsp;of&amp;nbsp;the&amp;nbsp;stack&amp;nbsp;and&amp;nbsp;includes&amp;nbsp;it&amp;nbsp;in&amp;nbsp;the&amp;nbsp;update/draw&amp;nbsp;loop&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;/summary&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;remarks&amp;gt;&amp;lt;/remarks&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Overloads&lt;/k&gt;&amp;nbsp;&lt;k&gt;Shared&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;Load(&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;intScreenID&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;&lt;k&gt;Integer&lt;/k&gt;,&amp;nbsp;&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;Modal&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;&lt;k&gt;Boolean&lt;/k&gt;,&amp;nbsp;&lt;k&gt;Optional&lt;/k&gt;&amp;nbsp;&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;TransitionIn&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;&lt;k&gt;Boolean&lt;/k&gt;&amp;nbsp;=&amp;nbsp;&lt;k&gt;True&lt;/k&gt;)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Dim&lt;/k&gt;&amp;nbsp;ModalScreen&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Screen&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Dim&lt;/k&gt;&amp;nbsp;tex&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Texture&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'Bring&amp;nbsp;to&amp;nbsp;the&amp;nbsp;front&amp;nbsp;of&amp;nbsp;the&amp;nbsp;stack&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;ScreenManager.BringToFront(intScreenID)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'that&amp;nbsp;changes&amp;nbsp;the&amp;nbsp;gameIDArrangement&amp;nbsp;(this&amp;nbsp;screenID&amp;nbsp;is&amp;nbsp;now&amp;nbsp;at&amp;nbsp;.Count-1&amp;nbsp;and&amp;nbsp;all&amp;nbsp;others&amp;nbsp;have&amp;nbsp;been&amp;nbsp;pushed&amp;nbsp;-1)&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'Include&amp;nbsp;this&amp;nbsp;screenID&amp;nbsp;the&amp;nbsp;update/draw&amp;nbsp;loop&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;With&lt;/k&gt;&amp;nbsp;&lt;k&gt;CType&lt;/k&gt;(Game.Components(intScreenID),&amp;nbsp;Screen)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;.SetVisiblity(&lt;k&gt;True&lt;/k&gt;)&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;.SetEnabled(&lt;k&gt;True&lt;/k&gt;)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'Set&amp;nbsp;modal&amp;nbsp;state&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;.IsModal&amp;nbsp;=&amp;nbsp;Modal&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;If&lt;/k&gt;&amp;nbsp;TransitionIn&amp;nbsp;&lt;k&gt;Then&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;.TransitionIn()&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;If&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;With&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'Now&amp;nbsp;if&amp;nbsp;we&amp;nbsp;have&amp;nbsp;just&amp;nbsp;shown&amp;nbsp;something&amp;nbsp;modal,&amp;nbsp;we&amp;nbsp;need&amp;nbsp;to&amp;nbsp;stay&amp;nbsp;in&amp;nbsp;a&amp;nbsp;loop&amp;nbsp;here&amp;nbsp;so&amp;nbsp;the&amp;nbsp;calling&amp;nbsp;code&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'can&amp;nbsp;resume&amp;nbsp;when&amp;nbsp;the&amp;nbsp;screen&amp;nbsp;gets&amp;nbsp;hidden.&amp;nbsp;&amp;nbsp;For&amp;nbsp;as&amp;nbsp;long&amp;nbsp;as&amp;nbsp;we&amp;nbsp;are&amp;nbsp;modal,&amp;nbsp;this&amp;nbsp;loop&amp;nbsp;continues&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;ModalScreen&amp;nbsp;=&amp;nbsp;&lt;k&gt;CType&lt;/k&gt;(Game.Components(GameIDArrangement(GameIDArrangement.Count&amp;nbsp;-&amp;nbsp;1)),&amp;nbsp;Screen)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;If&lt;/k&gt;&amp;nbsp;ModalScreen.IsModal&amp;nbsp;&lt;k&gt;Then&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;While&lt;/k&gt;&amp;nbsp;ModalScreen.IsModal&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;Game.Tick()&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;While&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;Game.GraphicsDevice.Textures(0)&amp;nbsp;=&amp;nbsp;tex&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;If&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;summary&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;Brings&amp;nbsp;the&amp;nbsp;screen&amp;nbsp;to&amp;nbsp;the&amp;nbsp;top&amp;nbsp;of&amp;nbsp;the&amp;nbsp;render&amp;nbsp;stack.&amp;nbsp;Does&amp;nbsp;not&amp;nbsp;change&amp;nbsp;Enabled&amp;nbsp;or&amp;nbsp;Visible&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;/summary&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;remarks&amp;gt;&amp;lt;/remarks&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Overloads&lt;/k&gt;&amp;nbsp;&lt;k&gt;Shared&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;BringToFront(&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;intScreenID&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;&lt;k&gt;Integer&lt;/k&gt;)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'If&amp;nbsp;this&amp;nbsp;screen&amp;nbsp;is&amp;nbsp;already&amp;nbsp;in&amp;nbsp;the&amp;nbsp;show&amp;nbsp;stack,&amp;nbsp;remove&amp;nbsp;it&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;If&lt;/k&gt;&amp;nbsp;GameIDArrangement.Contains(intScreenID)&amp;nbsp;&lt;k&gt;Then&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;GameIDArrangement.Remove(intScreenID)&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;If&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'Put&amp;nbsp;this&amp;nbsp;screen&amp;nbsp;at&amp;nbsp;the&amp;nbsp;top&amp;nbsp;of&amp;nbsp;the&amp;nbsp;show&amp;nbsp;stack&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;GameIDArrangement.Add(intScreenID)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;ScreenManager.SetDrawOrders()&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;summary&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;Syncs&amp;nbsp;the&amp;nbsp;draw&amp;nbsp;orders&amp;nbsp;of&amp;nbsp;the&amp;nbsp;screens&amp;nbsp;with&amp;nbsp;their&amp;nbsp;positions&amp;nbsp;in&amp;nbsp;the&amp;nbsp;show&amp;nbsp;stack&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;/summary&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;remarks&amp;gt;&amp;lt;/remarks&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;&lt;k&gt;Shared&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;SetDrawOrders()&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;For&lt;/k&gt;&amp;nbsp;intX&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;&lt;k&gt;Integer&lt;/k&gt;&amp;nbsp;=&amp;nbsp;0&amp;nbsp;&lt;k&gt;To&lt;/k&gt;&amp;nbsp;GameIDArrangement.Count&amp;nbsp;-&amp;nbsp;1&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;CType&lt;/k&gt;(Game.Components(GameIDArrangement(intX)),&amp;nbsp;Screen).SetDrawOrder(intX)&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Next&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;summary&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;Sends&amp;nbsp;the&amp;nbsp;screen&amp;nbsp;to&amp;nbsp;the&amp;nbsp;bottom&amp;nbsp;of&amp;nbsp;the&amp;nbsp;render&amp;nbsp;stack&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;/summary&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;remarks&amp;gt;&amp;lt;/remarks&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Overloads&lt;/k&gt;&amp;nbsp;&lt;k&gt;Shared&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;SendToBack(&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;intScreenID&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;&lt;k&gt;Integer&lt;/k&gt;)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'If&amp;nbsp;this&amp;nbsp;screen&amp;nbsp;is&amp;nbsp;already&amp;nbsp;in&amp;nbsp;the&amp;nbsp;show&amp;nbsp;stack,&amp;nbsp;remove&amp;nbsp;it&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;If&lt;/k&gt;&amp;nbsp;GameIDArrangement.Contains(intScreenID)&amp;nbsp;&lt;k&gt;Then&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;GameIDArrangement.Remove(intScreenID)&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;If&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'Put&amp;nbsp;this&amp;nbsp;screen&amp;nbsp;at&amp;nbsp;the&amp;nbsp;bottom&amp;nbsp;of&amp;nbsp;the&amp;nbsp;show&amp;nbsp;stack&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;GameIDArrangement.Insert(0,&amp;nbsp;intScreenID)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;ScreenManager.SetDrawOrders()&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Overloads&lt;/k&gt;&amp;nbsp;&lt;k&gt;Shared&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;Load(&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;ScreenName&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;String,&amp;nbsp;&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;Modal&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;&lt;k&gt;Boolean&lt;/k&gt;,&amp;nbsp;&lt;k&gt;Optional&lt;/k&gt;&amp;nbsp;&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;TransitionIn&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;&lt;k&gt;Boolean&lt;/k&gt;&amp;nbsp;=&amp;nbsp;&lt;k&gt;True&lt;/k&gt;)&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;Load(NameToGameID(ScreenName),&amp;nbsp;Modal,&amp;nbsp;TransitionIn)&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Overloads&lt;/k&gt;&amp;nbsp;&lt;k&gt;Shared&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;Unload(&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;ScreenName&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;String)&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;Unload(NameToGameID(ScreenName))&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Overloads&lt;/k&gt;&amp;nbsp;&lt;k&gt;Shared&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;BringToFront(&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;ScreenName&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;String)&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;BringToFront(NameToGameID(ScreenName))&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Overloads&lt;/k&gt;&amp;nbsp;&lt;k&gt;Shared&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;SendToBack(&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;ScreenName&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;String)&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;SendToBack(NameToGameID(ScreenName))&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Class&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;!-- &lt;br /&gt;END --&gt;&lt;br /&gt;You'll see some funky oddities in there but it's not too scary.&lt;br /&gt;&lt;br /&gt;Let's sum this situation up here before I get carpel tunnel:&lt;ul&gt;&lt;li&gt;Sprites are the building blocks - they contain the code to invoke the Matrix cascade and contain the code necessary to facilitate the creation of tree nodes.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Game Objects are reusable custom Sprite classes, typically with their own custom Update code and usually contain other child sprites to create small trees.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Screens are the building blocks of State management.  They derive from Sprite but typically don't require a texture, per se.  They mainly exist to act as parent nodes so that we can graft related Game Objects and Sprites together into a Game State context.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;We use the Screen Manager to Register screens with the Component collection.  We use the "Load" and "Unload" methods of the Screen Manager to basically set the DrawOrder, Enabled and Visible properties of Screens, which in turn causes the Component collection to change their order, start/stop Updating, or start/stop Drawing them.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Game State is defined by whatever the state of our Enabled/Visible properties are on the Screens in the component collection - when a game starts, it registers it's Screens through the Screen Manager and Loads the Main Menu Screen.  The Game State simply remains on the Main Menu Screen until changed, leaving no real need to question Game State (we simply allow all Enabled/Visible components in the Game.Component collection to Update &amp; Draw as per their Enabled/Visible properties).&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Once you've got this in place and you make a game, add some screens with the screen manager and Load one, you essentially Update and Draw your game by calling MyBase.Update and MyBase.Draw from your game class.  This will trigger the underlying XNA.Framework.Game to Draw &amp; Update, which will cause it to process it's Components collection where your Screens live.  In the end, you remove all Update and Draw calls to custom objects &amp; screens from your game class and just let the underlying XNA Game process it's Components collection, using the Screen Manager to control which Screens in the collection end up getting Updated &amp; Drawn.&lt;br /&gt;&lt;br /&gt;My apologies for the verbosity, I guess it's a lot to cover.  There's still more to come...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-5481403102728366588?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/5481403102728366588/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=5481403102728366588' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/5481403102728366588'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/5481403102728366588'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2008/01/screens-screen-manager.html' title='Screens &amp; the Screen Manager'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-9065103555460808360</id><published>2008-01-14T13:28:00.000-08:00</published><updated>2008-06-20T02:56:14.725-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tips + Tricks'/><title type='text'>A forest for your trees</title><content type='html'>&lt;b&gt;Trees&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The "parent/child" relationship afforded by the Sprite class can be thought of as an unordered &lt;a href="http://en.wikipedia.org/wiki/Tree_%28data_structure%29" target="_new"&gt;tree structure&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f7/Binary_tree.svg/180px-Binary_tree.svg.png" /&gt;&lt;br /&gt;&lt;br /&gt;In Star Maze, I've got a game object called PlayerShip.  Like all game objects it inherits from Sprite:&lt;br /&gt;&lt;br /&gt;&lt;!-- BEGIN &lt;br /&gt;--&gt;&lt;style type="text/css"&gt;k{color:#0000FF;}c{color:#008000;}t{color:#A31515;}n{}.o{border-left:solid 1px grey;border-top:solid 1px grey;font-family:Courier New;vertical-align:top;font-size:10pt;text-align:left;color:#000000;}&lt;/style&gt;&lt;div class="o" style="width:auto;height:auto;overflow-x:visible;overflow-y:visible;"&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Class&lt;/k&gt;&amp;nbsp;PlayerShip&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Inherits&lt;/k&gt;&amp;nbsp;Sprite&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'Update,&amp;nbsp;Draw,&amp;nbsp;etc.&lt;/c&gt;&lt;br /&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Class&lt;/k&gt;&lt;br /&gt;&lt;/div&gt;&lt;!-- &lt;br /&gt;END --&gt;&lt;br /&gt;Considering Sprites to be tree nodes, any class inheriting from Sprite (including PlayerShip) becomes a valid tree node and can be diagrammed as such:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i97.photobucket.com/albums/l223/emachine74/playership.png" /&gt;&lt;br /&gt;&lt;br /&gt;It's not much to look at on it's own so let's use the AddChild method of the PlayerShip to attach a Turret sprite:&lt;br /&gt;&lt;br /&gt;&lt;!-- BEGIN &lt;br /&gt;--&gt;&lt;style type="text/css"&gt;k{color:#0000FF;}c{color:#008000;}t{color:#A31515;}n{}.o{border-left:solid 1px grey;border-top:solid 1px grey;font-family:Courier New;vertical-align:top;font-size:10pt;text-align:left;color:#000000;}&lt;/style&gt;&lt;div class="o" style="width:auto;height:auto;overflow-x:visible;overflow-y:visible;"&gt;PlayerShip.AddChild(Turret)&lt;br /&gt;&lt;/div&gt;&lt;!-- &lt;br /&gt;END --&gt;&lt;br /&gt;&lt;img src="http://i97.photobucket.com/albums/l223/emachine74/shiptree.png" /&gt;&lt;br /&gt;&lt;br /&gt;The thrusters for the player's ship are separate game objects.  Like the PlayerShip (and like all game objects we'll make with this engine), a Thruster is another game object derived from Sprite:&lt;br /&gt;&lt;br /&gt;&lt;!-- BEGIN &lt;br /&gt;--&gt;&lt;style type="text/css"&gt;k{color:#0000FF;}c{color:#008000;}t{color:#A31515;}n{}.o{border-left:solid 1px grey;border-top:solid 1px grey;font-family:Courier New;vertical-align:top;font-size:10pt;text-align:left;color:#000000;}&lt;/style&gt;&lt;div class="o" style="width:auto;height:auto;overflow-x:visible;overflow-y:visible;"&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Class&lt;/k&gt;&amp;nbsp;Thruster&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Inherits&lt;/k&gt;&amp;nbsp;Sprite&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'Update,&amp;nbsp;Draw,&amp;nbsp;etc.&lt;/c&gt;&lt;br /&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Class&lt;/k&gt;&lt;br /&gt;&lt;/div&gt;&lt;!-- &lt;br /&gt;END --&gt;&lt;br /&gt;We'll add a couple afterburner sprites to the Thruster,&lt;br /&gt;&lt;br /&gt;&lt;!-- BEGIN &lt;br /&gt;--&gt;&lt;style type="text/css"&gt;k{color:#0000FF;}c{color:#008000;}t{color:#A31515;}n{}.o{border-left:solid 1px grey;border-top:solid 1px grey;font-family:Courier New;vertical-align:top;font-size:10pt;text-align:left;color:#000000;}&lt;/style&gt;&lt;div class="o" style="width:auto;height:auto;overflow-x:visible;overflow-y:visible;"&gt;Thruster.AddChild(YellowAfterburner)&lt;br /&gt;Thruster.AddChild(BlueAfterburner)&lt;br /&gt;&lt;/div&gt;&lt;!-- &lt;br /&gt;END --&gt;&lt;br /&gt;and here's the resultant tree diagram for the Thruster object:&lt;br /&gt;&lt;img src="http://i97.photobucket.com/albums/l223/emachine74/thrustertree.png" /&gt;&lt;br /&gt;&lt;br /&gt;Now we've got two different game objects, both of which inherit from Sprite: "Ship" and "Thruster".  You can also interpret this as having two sprite trees: the PlayerShip tree and the Thruster tree:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i97.photobucket.com/albums/l223/emachine74/shiptree.png" /&gt;&lt;img src="http://i97.photobucket.com/albums/l223/emachine74/thrustertree.png" /&gt;&lt;br /&gt;&lt;br /&gt;So far in the tutorials we've been using the AddChild method to append simple "leaf" nodes to sprites, but we can also do something slightly more profound, and that is to graft one entire tree onto another:&lt;br /&gt;&lt;br /&gt;&lt;!-- BEGIN &lt;br /&gt;--&gt;&lt;style type="text/css"&gt;k{color:#0000FF;}c{color:#008000;}t{color:#A31515;}n{}.o{border-left:solid 1px grey;border-top:solid 1px grey;font-family:Courier New;vertical-align:top;font-size:10pt;text-align:left;color:#000000;}&lt;/style&gt;&lt;div class="o" style="width:auto;height:auto;overflow-x:visible;overflow-y:visible;"&gt;PlayerShip.AddChild(Thruster)&lt;br /&gt;&lt;/div&gt;&lt;!-- &lt;br /&gt;END --&gt;&lt;br /&gt;&lt;img src="http://i97.photobucket.com/albums/l223/emachine74/playershiptree.png" /&gt;&lt;br /&gt;&lt;br /&gt;By adding the root node of the Thruster tree as a child of PlayerShip, the entire Thruster tree is grafted to the PlayerShip.&lt;br /&gt;&lt;br /&gt;Thinking about Sprites as tree nodes just gives us an alternate way to describe or illustrate the "parent/child" system Sprites employ.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Trees in a Forest&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The "games" created in the tutorials thus far are simple programs meant to demonstrate classes like Sprite and VBContentManager (et al).  None of the tutorials have put much thought into organizational techniques yet.  A typical tutorial is structured like this:&lt;br /&gt;&lt;br /&gt;&lt;!-- BEGIN &lt;br /&gt;--&gt;&lt;style type="text/css"&gt;k{color:#0000FF;}c{color:#008000;}t{color:#A31515;}n{}.o{border-left:solid 1px grey;border-top:solid 1px grey;font-family:Courier New;vertical-align:top;font-size:10pt;text-align:left;color:#000000;}&lt;/style&gt;&lt;div class="o" style="width:auto;height:auto;overflow-x:visible;overflow-y:visible;"&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Class&lt;/k&gt;&amp;nbsp;MyGameTutorial&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Inherits&lt;/k&gt;&amp;nbsp;Game&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;GameObject1&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;SpriteTree1&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;GameObject2&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;SpriteTree2&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'etc.&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Protected&lt;/k&gt;&amp;nbsp;&lt;k&gt;Overrides&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;Update()&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:72px;"&gt;&amp;nbsp;&lt;/n&gt;GameObject1.Update()&lt;br /&gt;&lt;n style="padding-left:72px;"&gt;&amp;nbsp;&lt;/n&gt;GameObject2.Update()&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:72px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'etc.&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Protected&lt;/k&gt;&amp;nbsp;&lt;k&gt;Overrides&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;Draw()&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:72px;"&gt;&amp;nbsp;&lt;/n&gt;GameObject1.Draw()&lt;br /&gt;&lt;n style="padding-left:72px;"&gt;&amp;nbsp;&lt;/n&gt;GameObject2.Draw()&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:72px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'etc.&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;/div&gt;&lt;!-- &lt;br /&gt;END --&gt;&lt;br /&gt;There may be some game object classes defined somewhere, but the general structure so far has been to create instances of game objects as private members of the Game class, and then simply Update &amp; Draw them from within the Game's Update and Draw methods.  Which is fine for a quick tutorials dealing with a limited number of sprites and game objects.  But when we eventually get to the point where we're creating an actual game, we're going to end up with a lot more than just "a limited number of sprites &amp; game objects".  Our lack of organization will turn into a problem.&lt;br /&gt;&lt;br /&gt;Consider a tiny, theoretical game with 1 player, 2 bad guys, and a high score. This game starts up on a "main menu" with various options (new game, continue, quit, graphic settings).  You can assume game object types such as BadGuyShip and PlayerShip (etc) to be irrelevant, all that matters is they derived from Sprite and are therefore valid tree structures of some kind:&lt;br /&gt;&lt;br /&gt;&lt;!-- BEGIN &lt;br /&gt;--&gt;&lt;style type="text/css"&gt;k{color:#0000FF;}c{color:#008000;}t{color:#A31515;}n{}.o{border-left:solid 1px grey;border-top:solid 1px grey;font-family:Courier New;vertical-align:top;font-size:10pt;text-align:left;color:#000000;}&lt;/style&gt;&lt;div class="o" style="width:auto;height:auto;overflow-x:visible;overflow-y:visible;"&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Class&lt;/k&gt;&amp;nbsp;MyGameTutorial&lt;br /&gt;&lt;n&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Inherits&lt;/k&gt;&amp;nbsp;Game&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'Main&amp;nbsp;menu&amp;nbsp;stuff&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;objNewGame&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;NewGame&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;objGraphics&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Graphics&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;objQuit&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Quit&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;objContinue&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Sprite&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'Game&amp;nbsp;stuff&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;objShip1&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;BadGuyShip&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;objShip2&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;BadGuyShip&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;objPlayer&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;PlayerShip&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;objHighScore&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Sprite&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'Initialization,&amp;nbsp;etc.&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Protected&lt;/k&gt;&amp;nbsp;&lt;k&gt;Overrides&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;Update()&lt;br /&gt;&lt;n style="padding-left:72px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'Which&amp;nbsp;ones&amp;nbsp;do&amp;nbsp;I&amp;nbsp;update?&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Protected&lt;/k&gt;&amp;nbsp;&lt;k&gt;Overrides&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;Draw()&lt;br /&gt;&lt;n style="padding-left:72px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'Which&amp;nbsp;ones&amp;nbsp;do&amp;nbsp;I&amp;nbsp;draw?&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:32px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;/div&gt;&lt;!-- &lt;br /&gt;END --&gt;&lt;br /&gt;Here's all of our game objects, in tree view.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i97.photobucket.com/albums/l223/emachine74/treemess1.png" /&gt;&lt;img src="http://i97.photobucket.com/albums/l223/emachine74/treemess2.png" /&gt;&lt;br /&gt;&lt;br /&gt;When this game runs and the update cycle comes around... which game objects do we update?  High Score?  BadGuy #2?  The "Quit" menu item?  We're now having to ask ourselves a new question: "Where am I?".&lt;br /&gt;&lt;br /&gt;There's a few ways to answer this question; you could just define a string called WhereAmI and if WhereAmI = "MainMenu" then you update/draw main menu stuff, and if WhereAmI = "PlayingTheGame" you update/draw the game stuff.  And that would work, but as you add new features and possible "places" you could potentially be in the program (main menu, the game, the inventory screen, the game over screen, any of those but paused, etc) it becomes apparent that there may be better approaches.&lt;br /&gt;&lt;br /&gt;First of all, we need to get organized.  We need a better method of organization for our game objects.  Knowing where we are, ergo what to update &amp; draw, will tie closely into our organizational strategy.&lt;br /&gt;&lt;br /&gt;Ironically enough one path to organization can be found in adding more Sprites. Not just any Sprite though; a special game object which is a bit of a Sprite hack, to tell the truth.  It's called a Screen:&lt;br /&gt;&lt;br /&gt;&lt;!-- BEGIN &lt;br /&gt;--&gt;&lt;style type="text/css"&gt;k{color:#0000FF;}c{color:#008000;}t{color:#A31515;}n{}.o{border-left:solid 1px grey;border-top:solid 1px grey;font-family:Courier New;vertical-align:top;font-size:10pt;text-align:left;color:#000000;}&lt;/style&gt;&lt;div class="o" style="width:auto;height:auto;overflow-x:visible;overflow-y:visible;"&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;MustInherit&lt;/k&gt;&amp;nbsp;&lt;k&gt;Class&lt;/k&gt;&amp;nbsp;Screen&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Inherits&lt;/k&gt;&amp;nbsp;Sprite&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Implements&lt;/k&gt;&amp;nbsp;IGameComponent&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Implements&lt;/k&gt;&amp;nbsp;IDrawable&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Implements&lt;/k&gt;&amp;nbsp;IUpdateable&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'etc&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Class&lt;/k&gt;&lt;br /&gt;&lt;/div&gt;&lt;!-- &lt;br /&gt;END --&gt;&lt;br /&gt;Screens are going to help us turn this:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i97.photobucket.com/albums/l223/emachine74/treemess1.png" /&gt;&lt;img src="http://i97.photobucket.com/albums/l223/emachine74/treemess2.png" /&gt;&lt;br /&gt;&lt;br /&gt;Into this:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i97.photobucket.com/albums/l223/emachine74/organized1.png" /&gt;&lt;br /&gt;&lt;img src="http://i97.photobucket.com/albums/l223/emachine74/organized2.png" /&gt;&lt;br /&gt;&lt;br /&gt;Once you're comfortable with the idea of Sprites as tree nodes, this is pretty simple; you define a MainMenu Screen and then just graft all your main menu game objects via MainMenu.AddChild().  A Screen is basically a container, a bucket into which we can toss game objects; it's the forest of our trees.&lt;br /&gt;&lt;br /&gt;Now anything we do to the Screen node - position, rotation, scale - the matrix cascade is going to apply that to every single attached child as well.  This is our secret weapon that will let us make fancy screen transitions without too much of a problem.&lt;br /&gt;&lt;br /&gt;Ok this is just the beginning of what I want to get into with this, but it's taken me 2 days just to get this much done so I'm going to publish this and start working on part 2 - the Screen Manager, which is what we'll use to show / hide / order screens, we can even use it to show screens &amp; dialogs "modal", continuing to update and draw our game but without loosing our place in code.  And then, the great paradigm shift: Cameras, which may change all of it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-9065103555460808360?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/9065103555460808360/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=9065103555460808360' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/9065103555460808360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/9065103555460808360'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2008/01/forest-for-your-trees.html' title='A forest for your trees'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-89844180797736341</id><published>2008-01-03T12:32:00.000-08:00</published><updated>2008-06-20T02:56:48.529-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Project: 2D Camera'/><title type='text'>Not Vacation</title><content type='html'>Back from vacation and busy at work.  Working on ADO stuff mostly, I've got this 5+ year project ahead of me here and, like most programs now, it's just a big sprawling database front end.  I'm building some good base classes for presenting, editing, and saving SQL data, with generic concurrency checking &amp; error handling, irrespective of database or interface.  Kind of a generic data access layer "engine" (well, sort of).  It'll really help automate the tedium of dealing with database records &amp; concurrency etc., which is super important for this job (medical records, medical billing - you don't want to screw this stuff up) but the reality is, be it a database of medical records or a database of high scores, it's always the same ADO issues no matter what the columns happen to be or what the tables are named.  So as per usual, the stuff I'm working on now will eventually help me somewhere else on the XNA side.  Which is always cool to think about.&lt;br /&gt;&lt;br /&gt;And speaking of XNA I've been thinking about how exactly I want to implement that 2D camera class into the engine.  It's all well and good to just have camera code that "works", but now I want it to be simple to use.  I want to have a Camera object abstracted to the point where I just define it, add it to the game, and "there you go".&lt;br /&gt;&lt;br /&gt;That's going to be a little trickier than I first thought.  Possible, just tricky (for me anyway).  If you've read along with half the tutorials here you know the gist of the engine - game objects are in a parent/child relationship, their matrices multiply together and that's basically how stuff is put on the screen.  I want Cameras to be a "game object" as well, so I can put a camera here or there just as easily as I could put a sprite here or there.&lt;br /&gt;&lt;br /&gt;What's tricky is that you can't necessarily make a game object (like say, the player's ship) a child of a Camera.  What if the ship needs to show up in 2 Cameras at once?  But then, if game objects aren't children of Cameras, how then could the game object be automatically influenced by the Camera's matrix ala the parent/child matrix cascade?&lt;br /&gt;&lt;br /&gt;I don't really know yet - but one of the fundamental changes to the engine I'm considering is to say that a Screen holds a set of game objects - for instance, the Game screen holds a players ship, the bad guys, the bullets, all that crap in it's child collection.  And then, Cameras are also in the Screen's child collection.  The change would be that when a Screen is told to draw, it only draws it's Cameras; and the actual drawing of objects is performed by the Camera, rather than by the Screen.  So the Screen becomes something of a Camera manager... or &lt;span style="font-style:italic;"&gt;something&lt;/span&gt; like that.  I haven't actually sat down with it yet, this is mostly mental fragments pieced together while driving to work or falling asleep at night.&lt;br /&gt;&lt;br /&gt;The Camera is going to be a significant component of the engine and may play a very important role in how the engine renders sprites onto the screen, so I want to take care to approach it in a somewhat methodical manner.  Under the thumb of bad weather here on the US west coast, perhaps this weekend I'll have nothing better to do.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-89844180797736341?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/89844180797736341/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=89844180797736341' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/89844180797736341'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/89844180797736341'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2008/01/busy.html' title='Not Vacation'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-4946442297149526696</id><published>2007-12-22T11:05:00.000-08:00</published><updated>2008-06-19T16:09:54.427-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Off topic'/><title type='text'>Vacation</title><content type='html'>Taking a break for a week or so, going to fly down south, hang out with my in-laws.  Speaking of airports &amp; in-laws, here's a good book to read when you're bored:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.google.com/search?q=The+Design+of+Everyday+Things&amp;ie=utf-8&amp;oe=utf-8&amp;aq=t&amp;rls=org.mozilla:en-US:official&amp;client=firefox-a" target="_new"&gt;&lt;img src="http://i97.photobucket.com/albums/l223/emachine74/everyday.jpg" width="25%" height="25%" border="0" align="left" style="padding-right:5px;" /&gt;&lt;/a&gt;"The Design of Everyday Things" is probably the best non-programming book a programmer can read.&lt;br /&gt;&lt;br /&gt;As programmers it's our job is to construct systems that make life easier (or just more fun) for someone else.  When a user launches our program for the first time, they do so without any knowledge of how it works, or any knowledge of how we &lt;span style="font-style:italic;"&gt;expected them to use it&lt;/span&gt;.  "The Design of Everyday Things" focuses on that moment of initial user interaction, exploring the reasons for a users "success" or "failure" with systems, both foreign and familiar.  It mainly boils down to the user interface, and that's what this book is about - building user interfaces that make sense.&lt;br /&gt;&lt;br /&gt;Using familiar things like telephones and refrigerators, the author demonstrates how common things, even simple things we have a lot of experience with, can be rendered confusing by an interface that does not convey proper usage to the user.  Ever been stopped short by pushing a door that must be pulled?  Sometimes stupid mistakes are just stupid mistakes, but sometimes they're actually encouraged by devices that don't naturally convey their proper use.&lt;br /&gt;&lt;br /&gt;It's an interesting book that contains lots of useful concepts for anyone who designs anything for other people to use.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-4946442297149526696?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/4946442297149526696/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=4946442297149526696' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/4946442297149526696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/4946442297149526696'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2007/12/vacation.html' title='Vacation'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-3031637256792747899</id><published>2007-12-15T01:18:00.000-08:00</published><updated>2008-06-20T02:57:00.519-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Project: 2D Camera'/><title type='text'>2D camera progress</title><content type='html'>I got to play with this some more tonight.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/2GM0ZWqaCfc"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/2GM0ZWqaCfc" type="application/x-shockwave-flash" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=2GM0ZWqaCfc" target="_new"&gt;direct link&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Tonight, my goal was to simply make sure I could occlude tiles correctly using the technique illustrated in the &lt;a href="http://xnamachine.blogspot.com/2007/12/2d-camera.html" target="_new"&gt;2D camera&lt;/a&gt; article.&lt;br /&gt;&lt;br /&gt;A 200 x 200 tile grid of tiles is defined, each tile is 64x64 pixels.  A 320x240 camera is affixed to the player's ship (you can see it's white outline in the video), and as the ship moves around, the camera position is transformed, a bounding box is created around the transformed camera, this bounding box is "snapped" to the grid, and a subset of the grid is readily obtained for drawing.  I ended up using even less / more simplistic math than I had assumed it would require, you don't really have to use mod arithmetic to do this, you can just mix &amp; match Math.Clamp, .Floor &amp; .Ceiling  and pretty much get your array indexes straight away (there will be a fully verbose tutorial on all this when it's done, skip the details for now).&lt;br /&gt;&lt;br /&gt;Now that the occlusion works, hopefully I'll get a chance to finish this tomorrow by adding the necessary transforms to make it behave like a camera (ship stays in the center of the screen, game world scrolls, that sort of thing).  I think I'll need to use a viewport object to physically clip the excess, although I'm not sure yet.  Lots of fun stuff to learn still.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-3031637256792747899?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/3031637256792747899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=3031637256792747899' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/3031637256792747899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/3031637256792747899'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2007/12/2d-camera-progress.html' title='2D camera progress'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-4822840011276623170</id><published>2007-12-14T11:40:00.000-08:00</published><updated>2008-06-20T02:57:40.123-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XNA 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='VB.NET Content Pipeline'/><title type='text'>VB.NET XNA Project Template updated for Game Studio 2.0</title><content type='html'>The &lt;a href="http://xnamachine.blogspot.com/search/label/XNA%20VB.NET%20project%20template"&gt;VB.NET XNA Project Template&lt;/a&gt; for Visual Studio has been updated to include the latest version of the VBContentManager.&lt;br /&gt;&lt;br /&gt;If you have previously placed the VB.NET XNA Project Template into your Visual Studio templates folder, after installing &lt;a href="http://creators.xna.com/Education/GettingStarted.aspx" target="_new"&gt;Game Studio 2.0&lt;/a&gt; you should overwrite the older template .zip file with &lt;a href="http://xnamachine.blogspot.com/search/label/XNA%20VB.NET%20project%20template"&gt;the newer version now available&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-4822840011276623170?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/4822840011276623170/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=4822840011276623170' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/4822840011276623170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/4822840011276623170'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2007/12/vbnet-xna-project-template-updated-for.html' title='VB.NET XNA Project Template updated for Game Studio 2.0'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-6411438957978647006</id><published>2007-12-14T10:34:00.001-08:00</published><updated>2008-06-20T02:57:20.594-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XNA 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='VB.NET Content Pipeline'/><title type='text'>VB.NET XNA Content Pipeline for Game Studio 2.0</title><content type='html'>&lt;font color="grey"&gt;[GS 2.0]&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Game Studio 2.0 beta has ended and &lt;a href="http://forums.xna.com/thread/36646.aspx" target="_new"&gt;Game Studio 2.0 has been officially released&lt;/a&gt;.  There are breaking changes in the ContentPipeline.targets file, so I've updated the VBContentManager class to generate a Content.contentproj file that works within the new parameters.  The usage of the class remains the same.&lt;ul&gt;&lt;li&gt;Works with Game Studio 2.0&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Now outputs content to the appropriate Visual Studio bin location (i.e., bin\Debug or bin\Release, whichever you've set Visual Studio to)&lt;/li&gt;&lt;/ul&gt;&lt;!-- BEGIN &lt;br /&gt;--&gt;&lt;style type="text/css"&gt;k{color:#0000FF;}c{color:#008000;}t{color:#A31515;}n{}.o{border-left:solid 1px grey;border-top:solid 1px grey;font-family:Courier New;vertical-align:top;font-size:10pt;text-align:left;color:#000000;}&lt;/style&gt;&lt;div class="o" style="width:613px;height:613px;overflow-x:scroll;overflow-y:scroll;"&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Class&lt;/k&gt;&amp;nbsp;VBContentManager&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Inherits&lt;/k&gt;&amp;nbsp;ContentManager&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;Fonts&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Hashtable(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;SpriteFont)&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;Textures&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Hashtable(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;Texture2D)&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;SubTextures&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Hashtable(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;Hashtable(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;Rectangle))&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;Sounds&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Hashtable(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;SoundBank)&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;Effects&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Hashtable(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;Effect)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;strContentprojFile,&amp;nbsp;strProjectFolder,&amp;nbsp;strExecutingFolder,&amp;nbsp;strContentFolder&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;String&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;objContent&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;List(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;ContentFile)&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;intDupeSound,&amp;nbsp;intDupeTexture,&amp;nbsp;intDupeFont,&amp;nbsp;intDupeEffect&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;&lt;k&gt;Integer&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Enum&lt;/k&gt;&amp;nbsp;Platform&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;Windows&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;XBox360&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Enum&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Enum&lt;/k&gt;&amp;nbsp;ContentTypes&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;Textures&amp;nbsp;=&amp;nbsp;0&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;Fonts&amp;nbsp;=&amp;nbsp;1&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;Sounds&amp;nbsp;=&amp;nbsp;2&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;Effects&amp;nbsp;=&amp;nbsp;3&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Enum&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;&lt;k&gt;Enum&lt;/k&gt;&amp;nbsp;ImporterName&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;TextureImporter&amp;nbsp;=&amp;nbsp;0&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;FontDescriptionImporter&amp;nbsp;=&amp;nbsp;1&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;XactImporter&amp;nbsp;=&amp;nbsp;2&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;EffectImporter&amp;nbsp;=&amp;nbsp;3&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Enum&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;&lt;k&gt;Enum&lt;/k&gt;&amp;nbsp;ProcessorName&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;TextureProcessor&amp;nbsp;=&amp;nbsp;0&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;FontDescriptionProcessor&amp;nbsp;=&amp;nbsp;1&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;XactProcessor&amp;nbsp;=&amp;nbsp;2&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;EffectProcessor&amp;nbsp;=&amp;nbsp;3&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Enum&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Structure&lt;/k&gt;&amp;nbsp;ContentFile&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;ContentType&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;ContentTypes&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;File&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;System.IO.FileInfo&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;Name&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;String&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;&lt;k&gt;New&lt;/k&gt;(&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;ContentType&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;ContentTypes,&amp;nbsp;&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;ContentFile&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;System.IO.FileInfo,&amp;nbsp;&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;Name&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;String)&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.ContentType&amp;nbsp;=&amp;nbsp;ContentType&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.File&amp;nbsp;=&amp;nbsp;ContentFile&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.Name&amp;nbsp;=&amp;nbsp;Name&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Structure&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;summary&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;Creates&amp;nbsp;a&amp;nbsp;new&amp;nbsp;ContentManager&amp;nbsp;which&amp;nbsp;has&amp;nbsp;been&amp;nbsp;extended&amp;nbsp;with&amp;nbsp;functionality&amp;nbsp;to&amp;nbsp;support&amp;nbsp;a&amp;nbsp;Visual&amp;nbsp;Basic&amp;nbsp;(or&amp;nbsp;other&amp;nbsp;non-C#)&amp;nbsp;project&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;/summary&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;param&amp;nbsp;name="ServiceProvider"&amp;gt;Your&amp;nbsp;game&amp;nbsp;has&amp;nbsp;a&amp;nbsp;.Services&amp;nbsp;property;&amp;nbsp;send&amp;nbsp;that&amp;nbsp;in&amp;nbsp;here.&amp;lt;/param&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;param&amp;nbsp;name="ContentFolder"&amp;gt;Your&amp;nbsp;content&amp;nbsp;folder&amp;nbsp;(a&amp;nbsp;relative&amp;nbsp;path,&amp;nbsp;from&amp;nbsp;your&amp;nbsp;game's&amp;nbsp;Project&amp;nbsp;node&amp;nbsp;as&amp;nbsp;it&amp;nbsp;appears&amp;nbsp;in&amp;nbsp;the&amp;nbsp;Solution&amp;nbsp;Explorer)&amp;lt;/param&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;remarks&amp;gt;&amp;lt;/remarks&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;&lt;k&gt;New&lt;/k&gt;(&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;ServiceProvider&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;IServiceProvider,&amp;nbsp;&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;ContentFolder&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;String)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;MyBase&lt;/k&gt;.New(ServiceProvider)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;With&lt;/k&gt;&amp;nbsp;System.Reflection.Assembly.GetEntryAssembly.Location&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.strExecutingFolder&amp;nbsp;=&amp;nbsp;.Substring(0,&amp;nbsp;.LastIndexOf(&lt;t&gt;"\"&lt;/t&gt;))&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;With&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;With&lt;/k&gt;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.strExecutingFolder&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;With&lt;/k&gt;&amp;nbsp;.Substring(0,&amp;nbsp;.LastIndexOf(&lt;t&gt;"\"&lt;/t&gt;)&amp;nbsp;-&amp;nbsp;1)&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.strProjectFolder&amp;nbsp;=&amp;nbsp;.Substring(0,&amp;nbsp;.LastIndexOf(&lt;t&gt;"\"&lt;/t&gt;))&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;With&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;With&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.strContentFolder&amp;nbsp;=&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.strProjectFolder&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"\"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;ContentFolder&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.Fonts&amp;nbsp;=&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;Hashtable(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;SpriteFont)&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.Textures&amp;nbsp;=&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;Hashtable(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;Texture2D)&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.SubTextures&amp;nbsp;=&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;Hashtable(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;Hashtable(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;Rectangle))&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.Sounds&amp;nbsp;=&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;Hashtable(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;SoundBank)&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.Effects&amp;nbsp;=&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;Hashtable(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;Effect)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;summary&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;Attempts&amp;nbsp;to&amp;nbsp;load&amp;nbsp;all&amp;nbsp;assets&amp;nbsp;which&amp;nbsp;have&amp;nbsp;been&amp;nbsp;compiled&amp;nbsp;by&amp;nbsp;the&amp;nbsp;Content&amp;nbsp;Pipeline.&amp;nbsp;Assets&amp;nbsp;are&amp;nbsp;placed&amp;nbsp;into&amp;nbsp;the&amp;nbsp;respective&amp;nbsp;Hash&amp;nbsp;table&amp;nbsp;(Fonts,&amp;nbsp;Textures,&amp;nbsp;et&amp;nbsp;al)&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;/summary&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;remarks&amp;gt;&amp;lt;/remarks&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;LoadAllContent()&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Dim&lt;/k&gt;&amp;nbsp;objCompiledContent&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;List(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;IO.FileInfo)&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Dim&lt;/k&gt;&amp;nbsp;strUnknownFiles&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;String&amp;nbsp;=&amp;nbsp;&lt;t&gt;""&lt;/t&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;For&lt;/k&gt;&amp;nbsp;&lt;k&gt;Each&lt;/k&gt;&amp;nbsp;file&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;IO.FileInfo&amp;nbsp;&lt;k&gt;In&lt;/k&gt;&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;IO.DirectoryInfo(&lt;k&gt;Me&lt;/k&gt;.strExecutingFolder).GetFiles(&lt;t&gt;"*.xnb"&lt;/t&gt;,&amp;nbsp;IO.SearchOption.AllDirectories)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Try&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'Font?&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;With&lt;/k&gt;&amp;nbsp;file.FullName.ToLower&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.Fonts.Add(file.Name.Replace(file.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;),&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.Load(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;SpriteFont)(.Replace(&lt;k&gt;Me&lt;/k&gt;.strExecutingFolder&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"\"&lt;/t&gt;,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;).Replace(file.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;With&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Catch&lt;/k&gt;&amp;nbsp;notAFont&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Exception&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Try&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'Texture2D?&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;With&lt;/k&gt;&amp;nbsp;file.FullName&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.Textures.Add(file.Name.Replace(file.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;),&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.Load(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;Texture2D)(.Replace(&lt;k&gt;Me&lt;/k&gt;.strExecutingFolder&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"\"&lt;/t&gt;,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;).Replace(file.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;With&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'Is&amp;nbsp;this&amp;nbsp;a&amp;nbsp;sheet&amp;nbsp;w/&amp;nbsp;a&amp;nbsp;rectangle&amp;nbsp;map?&amp;nbsp;&amp;nbsp;If&amp;nbsp;so,&amp;nbsp;load&amp;nbsp;the&amp;nbsp;rectangle&amp;nbsp;map&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;If&lt;/k&gt;&amp;nbsp;IO.File.Exists(file.FullName.Replace(file.Extension,&amp;nbsp;&lt;t&gt;".map"&lt;/t&gt;))&amp;nbsp;&lt;k&gt;Then&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.LoadMap(file.Name.Replace(file.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;),&amp;nbsp;file.FullName.Replace(file.Extension,&amp;nbsp;&lt;t&gt;".map"&lt;/t&gt;))&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;If&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Catch&lt;/k&gt;&amp;nbsp;notATexture2D&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Exception&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Try&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'Sound?&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;With&lt;/k&gt;&amp;nbsp;file.FullName.ToLower&lt;br /&gt;&lt;n style="padding-left:216px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.Sounds.Add(file.Name.Replace(file.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;),&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.Load(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;SoundBank)(.Replace(&lt;k&gt;Me&lt;/k&gt;.strExecutingFolder&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"\"&lt;/t&gt;,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;).Replace(file.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;With&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Catch&lt;/k&gt;&amp;nbsp;notASoundBank&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Exception&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Try&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:216px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'Effect?&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:216px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;With&lt;/k&gt;&amp;nbsp;file.FullName.ToLower&lt;br /&gt;&lt;n style="padding-left:248px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.Effects.Add(file.Name.Replace(file.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;),&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.Load(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;Effect)(.Replace(&lt;k&gt;Me&lt;/k&gt;.strExecutingFolder&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"\"&lt;/t&gt;,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;).Replace(file.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&lt;br /&gt;&lt;n style="padding-left:216px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;With&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Catch&lt;/k&gt;&amp;nbsp;unknown&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Exception&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:216px;"&gt;&amp;nbsp;&lt;/n&gt;strUnknownFiles&amp;nbsp;&amp;=&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;file.FullName&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Try&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Try&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Try&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Try&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Next&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;If&lt;/k&gt;&amp;nbsp;strUnknownFiles&amp;nbsp;&lt;&gt;&amp;nbsp;&lt;t&gt;""&lt;/t&gt;&amp;nbsp;&lt;k&gt;Then&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;MsgBox(&lt;t&gt;"The&amp;nbsp;VBContentManager&amp;nbsp;was&amp;nbsp;unable&amp;nbsp;to&amp;nbsp;determine&amp;nbsp;the&amp;nbsp;correct&amp;nbsp;loader&amp;nbsp;for:"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;strUnknownFiles&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;t&gt;"Unless&amp;nbsp;loaded&amp;nbsp;by&amp;nbsp;something&amp;nbsp;else,&amp;nbsp;the&amp;nbsp;above&amp;nbsp;content&amp;nbsp;won't&amp;nbsp;be&amp;nbsp;available&amp;nbsp;at&amp;nbsp;runtime."&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;t&gt;"This&amp;nbsp;application&amp;nbsp;may&amp;nbsp;become&amp;nbsp;unstable&amp;nbsp;as&amp;nbsp;a&amp;nbsp;result."&lt;/t&gt;)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;If&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;LoadMap(&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;strTextureNameName&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;String,&amp;nbsp;&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;strMapFile&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;String)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Dim&lt;/k&gt;&amp;nbsp;objReader&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;IO.StreamReader&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Dim&lt;/k&gt;&amp;nbsp;strMapData&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;String&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Dim&lt;/k&gt;&amp;nbsp;strLine()&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;String&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Dim&lt;/k&gt;&amp;nbsp;strItem()&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;String&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;objReader&amp;nbsp;=&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;IO.StreamReader(strMapFile)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.SubTextures.Add(strTextureNameName,&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;Hashtable(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;Rectangle))&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;strMapData&amp;nbsp;=&amp;nbsp;objReader.ReadToEnd&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;objReader.Close()&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;objReader.Dispose()&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;strLine&amp;nbsp;=&amp;nbsp;strMapData.Split(vbCrLf.ToCharArray,&amp;nbsp;System.StringSplitOptions.RemoveEmptyEntries)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;For&lt;/k&gt;&amp;nbsp;&lt;k&gt;Each&lt;/k&gt;&amp;nbsp;strMapItem&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;String&amp;nbsp;&lt;k&gt;In&lt;/k&gt;&amp;nbsp;strLine&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;strItem&amp;nbsp;=&amp;nbsp;strMapItem.Split(&lt;t&gt;","&lt;/t&gt;.ToCharArray,&amp;nbsp;System.StringSplitOptions.RemoveEmptyEntries)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.SubTextures(strTextureNameName).Add(strItem(0),&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;Rectangle(&lt;k&gt;CInt&lt;/k&gt;(strItem(1)),&amp;nbsp;&lt;k&gt;CInt&lt;/k&gt;(strItem(2)),&amp;nbsp;&lt;k&gt;CInt&lt;/k&gt;(strItem(3)),&amp;nbsp;&lt;k&gt;CInt&lt;/k&gt;(strItem(4))))&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Next&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;summary&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;Compiles&amp;nbsp;the&amp;nbsp;VB&amp;nbsp;Content&amp;nbsp;Pipeline&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;/summary&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;param&amp;nbsp;name="stealth"&amp;gt;Hide/Show&amp;nbsp;the&amp;nbsp;MSBuild&amp;nbsp;window&amp;nbsp;during&amp;nbsp;the&amp;nbsp;compile&amp;nbsp;process&amp;lt;/param&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;param&amp;nbsp;name="platform"&amp;gt;If&amp;nbsp;there's&amp;nbsp;a&amp;nbsp;way&amp;nbsp;the&amp;nbsp;Xbox360&amp;nbsp;will&amp;nbsp;work&amp;nbsp;with&amp;nbsp;VB,&amp;nbsp;you&amp;nbsp;could&amp;nbsp;pass&amp;nbsp;in&amp;nbsp;the&amp;nbsp;Xbox&amp;nbsp;parameter&amp;nbsp;as&amp;nbsp;a&amp;nbsp;target&amp;nbsp;platform&amp;nbsp;to&amp;nbsp;MSBuild.&amp;nbsp;&amp;nbsp;But&amp;nbsp;it's&amp;nbsp;Windows&amp;nbsp;by&amp;nbsp;default.&amp;lt;/param&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;remarks&amp;gt;&amp;lt;/remarks&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;CompileContent(&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;stealth&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;&lt;k&gt;Boolean&lt;/k&gt;,&amp;nbsp;&lt;k&gt;Optional&lt;/k&gt;&amp;nbsp;&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;platform&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Platform&amp;nbsp;=&amp;nbsp;VBContentManager.Platform.Windows)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Dim&lt;/k&gt;&amp;nbsp;objProcess&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Process&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Dim&lt;/k&gt;&amp;nbsp;objPSI&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;Diagnostics.ProcessStartInfo&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objContent&amp;nbsp;=&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;List(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;ContentFile)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.HarvestContent()&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;If&lt;/k&gt;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.objContent.Count&amp;nbsp;&gt;&amp;nbsp;0&amp;nbsp;&lt;k&gt;Then&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.BuildContentProj(platform)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Try&lt;/k&gt;&amp;nbsp;'to&amp;nbsp;write&amp;nbsp;the&amp;nbsp;content&amp;nbsp;project&amp;nbsp;file&amp;nbsp;to&amp;nbsp;disk&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Using&lt;/k&gt;&amp;nbsp;TempStreamWriter&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;System.IO.StreamWriter&amp;nbsp;=&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;System.IO.StreamWriter(&lt;k&gt;Me&lt;/k&gt;.strProjectFolder&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"\Content.contentproj"&lt;/t&gt;,&amp;nbsp;&lt;k&gt;False&lt;/k&gt;)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;With&lt;/k&gt;&amp;nbsp;TempStreamWriter&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;.Write(&lt;k&gt;Me&lt;/k&gt;.strContentprojFile)&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;.Close()&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;With&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Using&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Try&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;With&lt;/k&gt;&amp;nbsp;objPSI&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;.FileName&amp;nbsp;=&amp;nbsp;Environment.GetEnvironmentVariable(&lt;t&gt;"Windir"&lt;/t&gt;)&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe"&lt;/t&gt;&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;.Arguments&amp;nbsp;=&amp;nbsp;&lt;t&gt;""&lt;/t&gt;&lt;t&gt;""&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.strProjectFolder&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"\Content.contentproj"&lt;/t&gt;&lt;t&gt;""&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;t&gt;"&amp;nbsp;/verbosity:normal"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;t&gt;"&amp;nbsp;/l:FileLogger,Microsoft.Build.Engine;logfile="&lt;/t&gt;&lt;t&gt;""&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.strProjectFolder&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"\Content.log"&lt;/t&gt;&lt;t&gt;""&lt;/t&gt;&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;If&lt;/k&gt;&amp;nbsp;stealth&amp;nbsp;&lt;k&gt;Then&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:216px;"&gt;&amp;nbsp;&lt;/n&gt;.Arguments&amp;nbsp;&amp;=&amp;nbsp;&lt;t&gt;"&amp;nbsp;/noconsolelogger"&lt;/t&gt;&lt;br /&gt;&lt;n style="padding-left:216px;"&gt;&amp;nbsp;&lt;/n&gt;.WindowStyle&amp;nbsp;=&amp;nbsp;ProcessWindowStyle.Hidden&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;If&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;With&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'give&amp;nbsp;the&amp;nbsp;.contentproj&amp;nbsp;file&amp;nbsp;to&amp;nbsp;MSBuild&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;objProcess&amp;nbsp;=&amp;nbsp;System.Diagnostics.Process.Start(objPSI)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;While&lt;/k&gt;&amp;nbsp;&lt;k&gt;Not&lt;/k&gt;&amp;nbsp;objProcess.HasExited&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;Threading.Thread.Sleep(100)&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;While&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Catch&lt;/k&gt;&amp;nbsp;ex&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Exception&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;MsgBox(&lt;t&gt;"When&amp;nbsp;building&amp;nbsp;the&amp;nbsp;pipeline,&amp;nbsp;trying&amp;nbsp;to&amp;nbsp;run&amp;nbsp;MSBuild.exe&amp;nbsp;resulted&amp;nbsp;in:&amp;nbsp;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;ex.Message)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Try&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Catch&lt;/k&gt;&amp;nbsp;ex&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Exception&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;MsgBox(&lt;t&gt;"When&amp;nbsp;building&amp;nbsp;the&amp;nbsp;pipeline,&amp;nbsp;trying&amp;nbsp;to&amp;nbsp;create&amp;nbsp;the&amp;nbsp;Content.contentproj&amp;nbsp;file&amp;nbsp;"&lt;/t&gt;&lt;t&gt;""&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.strProjectFolder&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"\Content.contentproj"&lt;/t&gt;&lt;t&gt;"&amp;nbsp;resulted&amp;nbsp;in:&amp;nbsp;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;ex.Message)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Try&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;If&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;HarvestContent()&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Dim&lt;/k&gt;&amp;nbsp;objRoot&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;System.IO.DirectoryInfo&amp;nbsp;=&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;System.IO.DirectoryInfo(&lt;k&gt;Me&lt;/k&gt;.strContentFolder)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;For&lt;/k&gt;&amp;nbsp;&lt;k&gt;Each&lt;/k&gt;&amp;nbsp;sound&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;System.IO.FileInfo&amp;nbsp;&lt;k&gt;In&lt;/k&gt;&amp;nbsp;objRoot.GetFiles(&lt;t&gt;"*.xab"&lt;/t&gt;,&amp;nbsp;IO.SearchOption.AllDirectories)&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;If&lt;/k&gt;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.objContent.Contains(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Sounds,&amp;nbsp;sound,&amp;nbsp;sound.Name.Replace(sound.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&amp;nbsp;&lt;k&gt;Then&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.intDupeSound&amp;nbsp;+=&amp;nbsp;1&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objContent.Add(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Sounds,&amp;nbsp;sound,&amp;nbsp;sound.Name.Replace(sound.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)&amp;nbsp;&amp;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.intDupeSound.ToString))&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Else&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objContent.Add(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Sounds,&amp;nbsp;sound,&amp;nbsp;sound.Name.Replace(sound.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;If&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Next&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;For&lt;/k&gt;&amp;nbsp;&lt;k&gt;Each&lt;/k&gt;&amp;nbsp;texture&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;System.IO.FileInfo&amp;nbsp;&lt;k&gt;In&lt;/k&gt;&amp;nbsp;objRoot.GetFiles(&lt;t&gt;"*.png"&lt;/t&gt;,&amp;nbsp;IO.SearchOption.AllDirectories)&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;If&lt;/k&gt;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.objContent.Contains(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Textures,&amp;nbsp;texture,&amp;nbsp;texture.Name.Replace(texture.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&amp;nbsp;&lt;k&gt;Then&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.intDupeTexture&amp;nbsp;+=&amp;nbsp;1&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objContent.Add(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Textures,&amp;nbsp;texture,&amp;nbsp;texture.Name.Replace(texture.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)&amp;nbsp;&amp;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.intDupeTexture.ToString))&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Else&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objContent.Add(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Textures,&amp;nbsp;texture,&amp;nbsp;texture.Name.Replace(texture.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;If&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Next&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;For&lt;/k&gt;&amp;nbsp;&lt;k&gt;Each&lt;/k&gt;&amp;nbsp;texture&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;System.IO.FileInfo&amp;nbsp;&lt;k&gt;In&lt;/k&gt;&amp;nbsp;objRoot.GetFiles(&lt;t&gt;"*.jpg"&lt;/t&gt;,&amp;nbsp;IO.SearchOption.AllDirectories)&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;If&lt;/k&gt;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.objContent.Contains(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Textures,&amp;nbsp;texture,&amp;nbsp;texture.Name.Replace(texture.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&amp;nbsp;&lt;k&gt;Then&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.intDupeTexture&amp;nbsp;+=&amp;nbsp;1&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objContent.Add(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Textures,&amp;nbsp;texture,&amp;nbsp;texture.Name.Replace(texture.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)&amp;nbsp;&amp;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.intDupeTexture.ToString))&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Else&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objContent.Add(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Textures,&amp;nbsp;texture,&amp;nbsp;texture.Name.Replace(texture.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;If&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Next&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;For&lt;/k&gt;&amp;nbsp;&lt;k&gt;Each&lt;/k&gt;&amp;nbsp;texture&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;System.IO.FileInfo&amp;nbsp;&lt;k&gt;In&lt;/k&gt;&amp;nbsp;objRoot.GetFiles(&lt;t&gt;"*.gif"&lt;/t&gt;,&amp;nbsp;IO.SearchOption.AllDirectories)&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;If&lt;/k&gt;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.objContent.Contains(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Textures,&amp;nbsp;texture,&amp;nbsp;texture.Name.Replace(texture.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&amp;nbsp;&lt;k&gt;Then&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.intDupeTexture&amp;nbsp;+=&amp;nbsp;1&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objContent.Add(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Textures,&amp;nbsp;texture,&amp;nbsp;texture.Name.Replace(texture.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)&amp;nbsp;&amp;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.intDupeTexture.ToString))&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Else&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objContent.Add(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Textures,&amp;nbsp;texture,&amp;nbsp;texture.Name.Replace(texture.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;If&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Next&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;For&lt;/k&gt;&amp;nbsp;&lt;k&gt;Each&lt;/k&gt;&amp;nbsp;font&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;System.IO.FileInfo&amp;nbsp;&lt;k&gt;In&lt;/k&gt;&amp;nbsp;objRoot.GetFiles(&lt;t&gt;"*.spritefont"&lt;/t&gt;,&amp;nbsp;IO.SearchOption.AllDirectories)&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;If&lt;/k&gt;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.objContent.Contains(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Fonts,&amp;nbsp;font,&amp;nbsp;font.Name.Replace(font.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&amp;nbsp;&lt;k&gt;Then&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.intDupeFont&amp;nbsp;+=&amp;nbsp;1&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objContent.Add(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Fonts,&amp;nbsp;font,&amp;nbsp;font.Name.Replace(font.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)&amp;nbsp;&amp;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.intDupeFont.ToString))&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Else&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objContent.Add(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Fonts,&amp;nbsp;font,&amp;nbsp;font.Name.Replace(font.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;If&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Next&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;For&lt;/k&gt;&amp;nbsp;&lt;k&gt;Each&lt;/k&gt;&amp;nbsp;effect&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;System.IO.FileInfo&amp;nbsp;&lt;k&gt;In&lt;/k&gt;&amp;nbsp;objRoot.GetFiles(&lt;t&gt;"*.fx"&lt;/t&gt;,&amp;nbsp;IO.SearchOption.AllDirectories)&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;If&lt;/k&gt;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.objContent.Contains(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Effects,&amp;nbsp;effect,&amp;nbsp;effect.Name.Replace(effect.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&amp;nbsp;&lt;k&gt;Then&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.intDupeEffect&amp;nbsp;+=&amp;nbsp;1&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objContent.Add(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Effects,&amp;nbsp;effect,&amp;nbsp;effect.Name.Replace(effect.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)&amp;nbsp;&amp;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.intDupeEffect.ToString))&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Else&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objContent.Add(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Effects,&amp;nbsp;effect,&amp;nbsp;effect.Name.Replace(effect.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;If&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Next&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;BuildContentProj(&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;platform&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Platform)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Dim&lt;/k&gt;&amp;nbsp;strPlatform&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;String&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Select&lt;/k&gt;&amp;nbsp;&lt;k&gt;Case&lt;/k&gt;&amp;nbsp;platform&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Case&lt;/k&gt;&amp;nbsp;VBContentManager.Platform.XBox360&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;strPlatform&amp;nbsp;=&amp;nbsp;&lt;t&gt;"Xbox&amp;nbsp;360"&lt;/t&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Case&lt;/k&gt;&amp;nbsp;&lt;k&gt;Else&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;strPlatform&amp;nbsp;=&amp;nbsp;&lt;t&gt;"Windows"&lt;/t&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Select&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.strContentprojFile&amp;nbsp;=&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;t&gt;"&amp;lt;Project&amp;nbsp;xmlns="&lt;/t&gt;&lt;t&gt;"http://schemas.microsoft.com/developer/msbuild/2003"&lt;/t&gt;&lt;t&gt;"&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;Import&amp;nbsp;Project="&lt;/t&gt;&lt;t&gt;"$(MSBuildExtensionsPath)\Microsoft\XNA&amp;nbsp;Game&amp;nbsp;Studio\v2.0\Microsoft.Xna.GameStudio.ContentPipeline.targets"&lt;/t&gt;&lt;t&gt;"&amp;nbsp;/&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;PropertyGroup&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;OutputType&amp;gt;Library&amp;lt;/OutputType&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;XnaFrameworkVersion&amp;gt;v2.0&amp;lt;/XnaFrameworkVersion&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;ProjectDir&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.strProjectFolder&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"\&amp;lt;/ProjectDir&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;ParentOutputDir&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.strExecutingFolder&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;/ParentOutputDir&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;ContentRootDirectory&amp;gt;\&amp;lt;/ContentRootDirectory&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;XNAContentPipelineTargetPlatform&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;strPlatform&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;/XNAContentPipelineTargetPlatform&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;OutputPath&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.strExecutingFolder&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"\&amp;lt;/OutputPath&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;OutputDirectory&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.strExecutingFolder&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"\&amp;lt;/OutputDirectory&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;/PropertyGroup&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;ItemGroup&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;Reference&amp;nbsp;Include="&lt;/t&gt;&lt;t&gt;"Microsoft.Xna.Framework.Content.Pipeline.EffectImporter,&amp;nbsp;Version=2.0.0.0,&amp;nbsp;Culture=neutral,&amp;nbsp;PublicKeyToken=6d5c3888ef60e27d,&amp;nbsp;processorArchitecture=MSIL"&lt;/t&gt;&lt;t&gt;"&amp;nbsp;/&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;Reference&amp;nbsp;Include="&lt;/t&gt;&lt;t&gt;"Microsoft.Xna.Framework.Content.Pipeline.FBXImporter,&amp;nbsp;Version=2.0.0.0,&amp;nbsp;Culture=neutral,&amp;nbsp;PublicKeyToken=6d5c3888ef60e27d,&amp;nbsp;processorArchitecture=MSIL"&lt;/t&gt;&lt;t&gt;"&amp;nbsp;/&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;Reference&amp;nbsp;Include="&lt;/t&gt;&lt;t&gt;"Microsoft.Xna.Framework.Content.Pipeline.TextureImporter,&amp;nbsp;Version=2.0.0.0,&amp;nbsp;Culture=neutral,&amp;nbsp;PublicKeyToken=6d5c3888ef60e27d,&amp;nbsp;processorArchitecture=MSIL"&lt;/t&gt;&lt;t&gt;"&amp;nbsp;/&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;Reference&amp;nbsp;Include="&lt;/t&gt;&lt;t&gt;"Microsoft.Xna.Framework.Content.Pipeline.XImporter,&amp;nbsp;Version=2.0.0.0,&amp;nbsp;Culture=neutral,&amp;nbsp;PublicKeyToken=6d5c3888ef60e27d,&amp;nbsp;processorArchitecture=MSIL"&lt;/t&gt;&lt;t&gt;"&amp;nbsp;/&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;/ItemGroup&amp;gt;"&lt;/t&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;For&lt;/k&gt;&amp;nbsp;&lt;k&gt;Each&lt;/k&gt;&amp;nbsp;content&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;ContentFile&amp;nbsp;&lt;k&gt;In&lt;/k&gt;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.objContent&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.strContentprojFile&amp;nbsp;&amp;=&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;ItemGroup&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;Compile&amp;nbsp;Include="&lt;/t&gt;&lt;t&gt;""&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;content.File.FullName&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;""&lt;/t&gt;&lt;t&gt;"&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;vbTab&amp;nbsp;&amp;&amp;nbsp;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;Name&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;content.Name&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;/Name&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;vbTab&amp;nbsp;&amp;&amp;nbsp;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;Importer&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;&lt;k&gt;CType&lt;/k&gt;(content.ContentType,&amp;nbsp;ImporterName).ToString&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;/Importer&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;vbTab&amp;nbsp;&amp;&amp;nbsp;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;Processor&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;&lt;k&gt;CType&lt;/k&gt;(content.ContentType,&amp;nbsp;ProcessorName).ToString&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;/Processor&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;/Compile&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;/ItemGroup&amp;gt;"&lt;/t&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;If&lt;/k&gt;&amp;nbsp;content.ContentType&amp;nbsp;=&amp;nbsp;ContentTypes.Textures&amp;nbsp;&lt;k&gt;Then&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'If&amp;nbsp;this&amp;nbsp;texture&amp;nbsp;is&amp;nbsp;a&amp;nbsp;sheet&amp;nbsp;w/&amp;nbsp;a&amp;nbsp;map,&amp;nbsp;copy&amp;nbsp;it's&amp;nbsp;map&amp;nbsp;out&amp;nbsp;in&amp;nbsp;the&amp;nbsp;executable&amp;nbsp;area&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'along&amp;nbsp;side&amp;nbsp;the&amp;nbsp;existing&amp;nbsp;or&amp;nbsp;eventual&amp;nbsp;compiled&amp;nbsp;texture&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;If&lt;/k&gt;&amp;nbsp;IO.File.Exists(content.File.FullName.Replace(content.File.Extension,&amp;nbsp;&lt;t&gt;".map"&lt;/t&gt;))&amp;nbsp;&lt;k&gt;Then&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Try&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;IO.File.Copy(content.File.FullName.Replace(content.File.Extension,&amp;nbsp;&lt;t&gt;".map"&lt;/t&gt;),&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:216px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.strExecutingFolder&amp;nbsp;&amp;&amp;nbsp;content.File.FullName.Replace(&lt;k&gt;Me&lt;/k&gt;.strProjectFolder,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;).Replace(content.File.Extension,&amp;nbsp;&lt;t&gt;".map"&lt;/t&gt;),&amp;nbsp;&lt;k&gt;True&lt;/k&gt;)&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Catch&lt;/k&gt;&amp;nbsp;ex&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Exception&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'I'm&amp;nbsp;going&amp;nbsp;to&amp;nbsp;be&amp;nbsp;optimistic&amp;nbsp;and&amp;nbsp;assume&amp;nbsp;that&amp;nbsp;if&amp;nbsp;I&amp;nbsp;can't&amp;nbsp;copy&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'it's&amp;nbsp;because&amp;nbsp;the&amp;nbsp;file&amp;nbsp;is&amp;nbsp;already&amp;nbsp;there,&amp;nbsp;and&amp;nbsp;life&amp;nbsp;is&amp;nbsp;just&amp;nbsp;fine&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Try&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;If&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;If&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Next&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.strContentprojFile&amp;nbsp;&amp;=&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;!--&amp;nbsp;To&amp;nbsp;modify&amp;nbsp;your&amp;nbsp;build&amp;nbsp;process,&amp;nbsp;add&amp;nbsp;your&amp;nbsp;task&amp;nbsp;inside&amp;nbsp;one&amp;nbsp;of&amp;nbsp;the&amp;nbsp;targets&amp;nbsp;below&amp;nbsp;and&amp;nbsp;uncomment&amp;nbsp;it.&amp;nbsp;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Other&amp;nbsp;similar&amp;nbsp;extension&amp;nbsp;points&amp;nbsp;exist,&amp;nbsp;see&amp;nbsp;Microsoft.Common.targets."&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;Target&amp;nbsp;Name="&lt;/t&gt;&lt;t&gt;"BeforeBuild"&lt;/t&gt;&lt;t&gt;"&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;/Target&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;Target&amp;nbsp;Name="&lt;/t&gt;&lt;t&gt;"AfterBuild"&lt;/t&gt;&lt;t&gt;"&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;/Target&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"--&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;t&gt;"&amp;lt;/Project&amp;gt;"&lt;/t&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Class&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;!-- &lt;br /&gt;END --&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-6411438957978647006?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/6411438957978647006/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=6411438957978647006' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/6411438957978647006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/6411438957978647006'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2007/12/vbnet-content-pipeline-for-game-studio.html' title='VB.NET XNA Content Pipeline for Game Studio 2.0'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-1425342420906738169</id><published>2007-12-12T21:01:00.000-08:00</published><updated>2008-06-20T02:57:00.520-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Project: 2D Camera'/><title type='text'>2D Camera</title><content type='html'>This is the idea:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i97.photobucket.com/albums/l223/emachine74/2d-camera-theory.png" /&gt;&lt;br /&gt;&lt;br /&gt;Create a "bounding box" (orange) around the camera (blue), snap that bounding box to the grid on all sides (moving outwards, in all directions from the bounding box, until you hit a grid line - green).  Then just divide the corners of the green square by tilesize, you should end up with actual grid array element positions to fetch tiles with.  &lt;br /&gt;&lt;br /&gt;There's a little slop when the camera is rotated (you'll pick up extra tiles you don't really need to draw &amp; update) but, on the other hand, you don't have to scan around or perform any intersect tests, so hopefully the net result is reasonably quick.&lt;br /&gt;&lt;br /&gt;If this doesn't work I'm screwed, because I can't think of any other way to do it!  Now I just have to write it...&lt;br /&gt;&lt;br /&gt;Update: I got about half way through it this evening and figured I'd run it just to see what happens.  Here's some "unexpected results" for you:&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/B5QDCGJgDgo&amp;rel=1"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/B5QDCGJgDgo&amp;rel=1" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=B5QDCGJgDgo" target="_new"&gt;direct link&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Yea it's not quite done yet :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-1425342420906738169?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/1425342420906738169/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=1425342420906738169' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/1425342420906738169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/1425342420906738169'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2007/12/2d-camera.html' title='2D Camera'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-8462979877501892779</id><published>2007-12-11T09:59:00.001-08:00</published><updated>2008-06-20T14:08:14.383-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tips + Tricks'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA 2.0'/><title type='text'>A thruster component</title><content type='html'>&lt;font color="grey"&gt;[GS 2.0 Beta]&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;One of the things I want to feature in &lt;a href="http://xnamachine.blogspot.com/2007/11/star-maze.html" target="_new"&gt;Star Maze&lt;/a&gt; are ship upgrades, allowing you to attach different thrusters &amp; weapons to your ship.&lt;br /&gt;&lt;br /&gt;Given the parent/child system, we know that we can "attach" one sprite to another, like what we did in &lt;a href="http://xnamachine.blogspot.com/2007/11/tutorial-7-sprites-as-game-objects.html" target="_new"&gt;Tutorial 7&lt;/a&gt;.  And since our game objects are nothing more than "sprites with a brain", we can actually attach one game object to another.  So after incorporating the psuedo-physics parameters &amp; processing to the sprite class, I created a game component meant soley to be a child of another; a thruster module which can be attached to anything to make it move.  This is the base thruster class from which you derive to create a custom thruster object:&lt;br /&gt;&lt;br /&gt;&lt;!-- BEGIN &lt;br /&gt;--&gt;&lt;style type="text/css"&gt;k{color:#0000FF;}c{color:#008000;}t{color:#A31515;}n{}.o{border-left:solid 1px grey;border-top:solid 1px grey;font-family:Courier New;vertical-align:top;font-size:10pt;text-align:left;color:#000000;}&lt;/style&gt;&lt;div class="o" style="width:613px;height:auto;overflow-x:scroll;overflow-y:scroll;"&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Interface&lt;/k&gt;&amp;nbsp;IThruster&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;StopThrusterAnim()&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;StartThrusterAnim()&lt;br /&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Interface&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;MustInherit&lt;/k&gt;&amp;nbsp;&lt;k&gt;Class&lt;/k&gt;&amp;nbsp;BaseThruster&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Inherits&lt;/k&gt;&amp;nbsp;Sprite&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Implements&lt;/k&gt;&amp;nbsp;IThruster&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Protected&lt;/k&gt;&amp;nbsp;sngForce&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;&lt;k&gt;Single&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Protected&lt;/k&gt;&amp;nbsp;enumKey&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Keys&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Protected&lt;/k&gt;&amp;nbsp;bolIsOn&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;&lt;k&gt;Boolean&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Protected&lt;/k&gt;&amp;nbsp;enumType&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;ThrusterType&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;MustOverride&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;StopThrusterAnim()&amp;nbsp;&lt;k&gt;Implements&lt;/k&gt;&amp;nbsp;IThruster.StopThrusterAnim&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;MustOverride&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;StartThrusterAnim()&amp;nbsp;&lt;k&gt;Implements&lt;/k&gt;&amp;nbsp;IThruster.StartThrusterAnim&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Property&lt;/k&gt;&amp;nbsp;Force()&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;&lt;k&gt;Single&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Get&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Return&lt;/k&gt;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.sngForce&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Get&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Set&lt;/k&gt;(&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;value&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;&lt;k&gt;Single&lt;/k&gt;)&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.sngForce&amp;nbsp;=&amp;nbsp;value&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Set&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Property&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Enum&lt;/k&gt;&amp;nbsp;ThrusterType&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;Linear&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;Rotational&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Enum&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Overrides&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;Update()&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Dim&lt;/k&gt;&amp;nbsp;quant&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Quaternion&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Dim&lt;/k&gt;&amp;nbsp;direction&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Vector2&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;If&lt;/k&gt;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.Game.KeyboardState.IsKeyDown(&lt;k&gt;Me&lt;/k&gt;.enumKey)&amp;nbsp;&lt;k&gt;Then&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;If&lt;/k&gt;&amp;nbsp;&lt;k&gt;Not&lt;/k&gt;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.bolIsOn&amp;nbsp;&lt;k&gt;Then&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.StartThrusterAnim()&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.bolIsOn&amp;nbsp;=&amp;nbsp;&lt;k&gt;True&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;If&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Select&lt;/k&gt;&amp;nbsp;&lt;k&gt;Case&lt;/k&gt;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.enumType&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Case&lt;/k&gt;&amp;nbsp;ThrusterType.Linear&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.WorldMatrix.Decompose(&lt;k&gt;Nothing&lt;/k&gt;,&amp;nbsp;quant,&amp;nbsp;&lt;k&gt;Nothing&lt;/k&gt;)&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;Vector2.Transform(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;Vector2(Math.Sin(&lt;k&gt;CDbl&lt;/k&gt;(&lt;k&gt;Me&lt;/k&gt;.sngRotation)),&amp;nbsp;-Math.Cos(&lt;k&gt;CDbl&lt;/k&gt;(&lt;k&gt;Me&lt;/k&gt;.sngRotation))),&amp;nbsp;Matrix.CreateFromQuaternion(quant),&amp;nbsp;direction)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.Parent.ApplyForce((direction&amp;nbsp;*&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.sngForce)&amp;nbsp;*&amp;nbsp;(&lt;k&gt;Me&lt;/k&gt;.Game.GameTime.ElapsedGameTime.TotalMilliseconds&amp;nbsp;/&amp;nbsp;1000))&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Case&lt;/k&gt;&amp;nbsp;ThrusterType.Rotational&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.Parent.ApplyRotationalForce(&lt;k&gt;Me&lt;/k&gt;.sngForce&amp;nbsp;*&amp;nbsp;(&lt;k&gt;Me&lt;/k&gt;.Game.GameTime.ElapsedGameTime.TotalMilliseconds&amp;nbsp;/&amp;nbsp;1000))&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Select&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;ElseIf&lt;/k&gt;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.bolIsOn&amp;nbsp;&lt;k&gt;Then&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.StopThrusterAnim()&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.bolIsOn&amp;nbsp;=&amp;nbsp;&lt;k&gt;False&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;If&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;MyBase&lt;/k&gt;.Update()&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;&lt;k&gt;New&lt;/k&gt;(&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;parent&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Ship,&amp;nbsp;&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;type&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;ThrusterType,&amp;nbsp;&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;key&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Keys,&amp;nbsp;&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;name&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;String,&amp;nbsp;&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;force&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;&lt;k&gt;Single&lt;/k&gt;,&amp;nbsp;&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;containerSize&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Vector2)&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;MyBase&lt;/k&gt;.New(Program.StarMaze,&amp;nbsp;parent,&amp;nbsp;name,&amp;nbsp;&lt;k&gt;True&lt;/k&gt;,&amp;nbsp;&lt;k&gt;True&lt;/k&gt;,&amp;nbsp;containerSize)&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.sngForce&amp;nbsp;=&amp;nbsp;force&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.enumKey&amp;nbsp;=&amp;nbsp;key&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.enumType&amp;nbsp;=&amp;nbsp;type&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;&lt;k&gt;New&lt;/k&gt;(&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;parent&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Ship,&amp;nbsp;&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;type&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;ThrusterType,&amp;nbsp;&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;key&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Keys,&amp;nbsp;&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;name&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;String,&amp;nbsp;&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;force&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;&lt;k&gt;Single&lt;/k&gt;,&amp;nbsp;&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;sheet&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;String,&amp;nbsp;&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;subtexture&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;String)&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;MyBase&lt;/k&gt;.New(Program.StarMaze,&amp;nbsp;parent,&amp;nbsp;name,&amp;nbsp;&lt;k&gt;True&lt;/k&gt;,&amp;nbsp;&lt;k&gt;True&lt;/k&gt;,&amp;nbsp;sheet,&amp;nbsp;subtexture)&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.sngForce&amp;nbsp;=&amp;nbsp;force&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.enumKey&amp;nbsp;=&amp;nbsp;key&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.enumType&amp;nbsp;=&amp;nbsp;type&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Class&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;!-- &lt;br /&gt;END --&gt;&lt;br /&gt;With the base thruster class you can create a rotational thruster for spinning around or a linear thruster for vector movement.  A keyboard key parameter will be monitored by the thruster to turn itself on and off, and there's a parameter to hold how much force the thruster applies to it's parent (whatever it's attached to).  &lt;br /&gt;&lt;br /&gt;When it Updates, it calls the ApplyForce or ApplyRotationalForce methods of it's parent, and the system moves accordingly.&lt;br /&gt;&lt;br /&gt;A simple interface defines two routines, StopThrusterAnim &amp; StartThrusterAnim, which provides the implementor with a place &amp; time to perform graphical feedback as it relates to the thruster entering an On or Off state.&lt;br /&gt;&lt;br /&gt;Using this base thruster class I created 4 different game components; custom thrusters which I can attach to the player's ship.  Two different aft thrusters (linear), a port thruster (clockwise rotational), and a starboard thruster (counterclockwise rotational).  &lt;br /&gt;&lt;br /&gt;The player's ship object can now be defined very simply, by creating instances of these thrusters and attaching whichever ones we want accordingly:&lt;br /&gt;&lt;br /&gt;&lt;!-- BEGIN &lt;br /&gt;--&gt;&lt;style type="text/css"&gt;k{color:#0000FF;}c{color:#008000;}t{color:#A31515;}n{}.o{border-left:solid 1px grey;border-top:solid 1px grey;font-family:Courier New;vertical-align:top;font-size:10pt;text-align:left;color:#000000;}&lt;/style&gt;&lt;div class="o" style="width:613px;height:auto;overflow-x:scroll;overflow-y:scroll;"&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Class&lt;/k&gt;&amp;nbsp;Ship&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Inherits&lt;/k&gt;&amp;nbsp;Sprite&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Protected&lt;/k&gt;&amp;nbsp;aftThruster,&amp;nbsp;portThruster,&amp;nbsp;starboardThruster&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;BaseThruster&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;&lt;k&gt;New&lt;/k&gt;()&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;MyBase&lt;/k&gt;.New(Program.StarMaze,&amp;nbsp;&lt;k&gt;Nothing&lt;/k&gt;,&amp;nbsp;&lt;t&gt;"playership"&lt;/t&gt;,&amp;nbsp;&lt;k&gt;True&lt;/k&gt;,&amp;nbsp;&lt;k&gt;True&lt;/k&gt;,&amp;nbsp;&lt;t&gt;"starmaze"&lt;/t&gt;,&amp;nbsp;&lt;t&gt;"playership"&lt;/t&gt;)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.Origin&amp;nbsp;=&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;Vector2(54,&amp;nbsp;82)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.sngMass&amp;nbsp;=&amp;nbsp;1&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.sngFriction&amp;nbsp;=&amp;nbsp;25&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.aftThruster&amp;nbsp;=&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;AftThruster2(&lt;k&gt;Me&lt;/k&gt;)&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.portThruster&amp;nbsp;=&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;PortThruster1(&lt;k&gt;Me&lt;/k&gt;)&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.starboardThruster&amp;nbsp;=&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;StarboardThruster1(&lt;k&gt;Me&lt;/k&gt;)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.AddChild(&lt;k&gt;Me&lt;/k&gt;.aftThruster)&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.AddChild(&lt;k&gt;Me&lt;/k&gt;.portThruster)&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.AddChild(&lt;k&gt;Me&lt;/k&gt;.starboardThruster)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Class&lt;/k&gt;&lt;br /&gt;&lt;/div&gt;&lt;!-- &lt;br /&gt;END --&gt;  &lt;br /&gt;Here's a quick lo-fi vid of this in action:&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/cUCiJibFin8&amp;rel=1"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/cUCiJibFin8&amp;rel=1" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=cUCiJibFin8&amp;eurl=http://xnamachine.blogspot.com/" target="_new"&gt;(direct link to youtube)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In the video I start out using one of two aft thruster classes which derive from base thruster (the green one, it produces 500 pixels per second (pps) of linear force).  When the app stops and I go into the IDE, I swap out the green 500pps thruster for a different thruster class, a red one that produces 250 pps of linear force.  You my also be able to see the tiny little port and starboard thrusters applying the counter- and clockwise rotational forces as well.&lt;br /&gt;&lt;br /&gt;As you can see from the Ship class code above, the ship itself has no inherit way to move itself; it's just a hull that doesn't handle keyboard input or anything of the sort.  To make it move, we simply attach thruster components.  The neat part about this system is that you can attach any thruster you want to any game object you want. You can put thrusters on the player's ship, on enemy AI ships, you can stick one on a bowling ball if you want.  The thruster component is a somewhat generic way to apply force, to any game object.&lt;br /&gt;&lt;br /&gt;My laptop was lagging for unrelated reasons when I recorded this, so the fps is kinda low, but in an otherwise normal environment the code runs quite nicely.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-8462979877501892779?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/8462979877501892779/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=8462979877501892779' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/8462979877501892779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/8462979877501892779'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2007/12/thruster-component.html' title='A thruster component'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-7098680086085051463</id><published>2007-12-09T14:52:00.001-08:00</published><updated>2008-06-20T14:08:14.384-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tips + Tricks'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA 2.0'/><title type='text'>Fun with (very basic) physics</title><content type='html'>&lt;font color="grey"&gt;[GS 2.0 Beta]&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;So in developing a new system of sprite movement, I decided to try a little bit of really basic physics.  Adding a few simple members to the sprite class to store values relating to velocity, momentum &amp; friction:&lt;br /&gt;&lt;br /&gt;&lt;!-- BEGIN &lt;br /&gt;--&gt;&lt;style type="text/css"&gt;k{color:#0000FF;}c{color:#008000;}t{color:#A31515;}n{}.o{border-left:solid 1px grey;border-top:solid 1px grey;font-family:Courier New;vertical-align:top;font-size:10pt;text-align:left;color:#000000;}&lt;/style&gt;&lt;div class="o" style="width:auto;height:auto;overflow-x:visible;overflow-y:visible;"&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Protected&lt;/k&gt;&amp;nbsp;objVelocity&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Vector2&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Protected&lt;/k&gt;&amp;nbsp;sngFriction,&amp;nbsp;sngMass&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;&lt;k&gt;Single&lt;/k&gt;&lt;br /&gt;&lt;/div&gt;&lt;!-- &lt;br /&gt;END --&gt;&lt;br /&gt;and then, adding method called ApplyForce:&lt;br /&gt;&lt;br /&gt;&lt;!-- BEGIN &lt;br /&gt;--&gt;&lt;style type="text/css"&gt;k{color:#0000FF;}c{color:#008000;}t{color:#A31515;}n{}.o{border-left:solid 1px grey;border-top:solid 1px grey;font-family:Courier New;vertical-align:top;font-size:10pt;text-align:left;color:#000000;}&lt;/style&gt;&lt;div class="o" style="width:auto;height:auto;overflow-x:visible;overflow-y:visible;"&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;ApplyForce(&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;force&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Vector2)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;If&lt;/k&gt;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.sngMass&amp;nbsp;&gt;&amp;nbsp;0&amp;nbsp;&lt;k&gt;Then&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objVelocity&amp;nbsp;+=&amp;nbsp;(force&amp;nbsp;/&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.sngMass)&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Else&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objVelocity&amp;nbsp;+=&amp;nbsp;force&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;If&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;/div&gt;&lt;!-- &lt;br /&gt;END --&gt;&lt;br /&gt;and finally, processing this information during update:&lt;br /&gt;&lt;br /&gt;&lt;!-- BEGIN &lt;br /&gt;--&gt;&lt;style type="text/css"&gt;k{color:#0000FF;}c{color:#008000;}t{color:#A31515;}n{}.o{border-left:solid 1px grey;border-top:solid 1px grey;font-family:Courier New;vertical-align:top;font-size:10pt;text-align:left;color:#000000;}&lt;/style&gt;&lt;div class="o" style="width:auto;height:auto;overflow-x:visible;overflow-y:visible;"&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;UpdatePhysics()&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Dim&lt;/k&gt;&amp;nbsp;time&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;&lt;k&gt;Single&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Dim&lt;/k&gt;&amp;nbsp;negX,&amp;nbsp;negY&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;&lt;k&gt;Boolean&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'Our&amp;nbsp;unit&amp;nbsp;of&amp;nbsp;measure&amp;nbsp;is&amp;nbsp;pixles&amp;nbsp;per&amp;nbsp;second&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;time&amp;nbsp;=&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.Game.GameTime.ElapsedGameTime.TotalMilliseconds&amp;nbsp;/&amp;nbsp;1000&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'If&amp;nbsp;there&amp;nbsp;is&amp;nbsp;any&amp;nbsp;velocity...&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;If&lt;/k&gt;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.objVelocity&amp;nbsp;&lt;&gt;&amp;nbsp;Vector2.Zero&amp;nbsp;&lt;k&gt;Then&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'before&amp;nbsp;we&amp;nbsp;apply&amp;nbsp;friction,&amp;nbsp;let's&amp;nbsp;remember&amp;nbsp;whether&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'or&amp;nbsp;not&amp;nbsp;we&amp;nbsp;started&amp;nbsp;out&amp;nbsp;with&amp;nbsp;positive&amp;nbsp;or&amp;nbsp;negative&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'velocity&amp;nbsp;value,&amp;nbsp;for&amp;nbsp;both&amp;nbsp;x&amp;nbsp;and&amp;nbsp;y,&amp;nbsp;by&amp;nbsp;setting&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'"wasNegativeX/Y"&amp;nbsp;booleans&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;negX&amp;nbsp;=&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.objVelocity.X&amp;nbsp;&lt;&amp;nbsp;0&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;negY&amp;nbsp;=&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.objVelocity.Y&amp;nbsp;&lt;&amp;nbsp;0&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'simulate&amp;nbsp;some&amp;nbsp;psuedo-friction&amp;nbsp;by&amp;nbsp;normalizing&amp;nbsp;the&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'velocity&amp;nbsp;vector&amp;nbsp;and&amp;nbsp;multiplying&amp;nbsp;it&amp;nbsp;by&amp;nbsp;the&amp;nbsp;friction&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'value.&amp;nbsp;&amp;nbsp;This&amp;nbsp;gives&amp;nbsp;us&amp;nbsp;an&amp;nbsp;amount&amp;nbsp;to&amp;nbsp;"push"&amp;nbsp;the&amp;nbsp;object&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'in&amp;nbsp;the&amp;nbsp;exact&amp;nbsp;opposite&amp;nbsp;direction.&amp;nbsp;&amp;nbsp;Multiplied&amp;nbsp;by&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'time&amp;nbsp;to&amp;nbsp;do&amp;nbsp;just&amp;nbsp;enough&amp;nbsp;for&amp;nbsp;this&amp;nbsp;frame&amp;nbsp;only.&amp;nbsp;&amp;nbsp;Subtract&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'the&amp;nbsp;result&amp;nbsp;from&amp;nbsp;the&amp;nbsp;object's&amp;nbsp;velocity,&amp;nbsp;to&amp;nbsp;slow&amp;nbsp;it&amp;nbsp;down.&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objVelocity&amp;nbsp;-=&amp;nbsp;(Vector2.Normalize(&lt;k&gt;Me&lt;/k&gt;.objVelocity)&amp;nbsp;*&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.sngFriction)&amp;nbsp;*&amp;nbsp;time&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'Because&amp;nbsp;friction&amp;nbsp;is&amp;nbsp;simulated&amp;nbsp;by&amp;nbsp;pushing&amp;nbsp;the&amp;nbsp;object&amp;nbsp;in&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'the&amp;nbsp;opposite&amp;nbsp;direction,&amp;nbsp;towards&amp;nbsp;the&amp;nbsp;end&amp;nbsp;when&amp;nbsp;the&amp;nbsp;object&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'is&amp;nbsp;almost&amp;nbsp;stopped&amp;nbsp;we&amp;nbsp;don't&amp;nbsp;want&amp;nbsp;the&amp;nbsp;psuedo-friction&amp;nbsp;to&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'start&amp;nbsp;pushing&amp;nbsp;the&amp;nbsp;object&amp;nbsp;backwards;&amp;nbsp;at&amp;nbsp;most,&amp;nbsp;friction&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'stops&amp;nbsp;something,&amp;nbsp;but&amp;nbsp;it&amp;nbsp;shouldn't&amp;nbsp;ever&amp;nbsp;move&amp;nbsp;it.&amp;nbsp;&amp;nbsp;So&amp;nbsp;using&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'or&amp;nbsp;cached&amp;nbsp;"whether&amp;nbsp;or&amp;nbsp;not&amp;nbsp;it&amp;nbsp;was&amp;nbsp;negative"&amp;nbsp;booleans,&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'check&amp;nbsp;to&amp;nbsp;see&amp;nbsp;if&amp;nbsp;the&amp;nbsp;polarity&amp;nbsp;of&amp;nbsp;our&amp;nbsp;X/Y&amp;nbsp;velocity&amp;nbsp;changed&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'due&amp;nbsp;to&amp;nbsp;friction.&amp;nbsp;&amp;nbsp;If&amp;nbsp;it&amp;nbsp;did,&amp;nbsp;snap&amp;nbsp;the&amp;nbsp;velocity&amp;nbsp;of&amp;nbsp;that&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'value&amp;nbsp;to&amp;nbsp;0.&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;If&lt;/k&gt;&amp;nbsp;(negX&amp;nbsp;&lt;k&gt;And&lt;/k&gt;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.objVelocity.X&amp;nbsp;&gt;&amp;nbsp;0)&amp;nbsp;&lt;k&gt;Or&lt;/k&gt;&amp;nbsp;(&lt;k&gt;Not&lt;/k&gt;&amp;nbsp;negX&amp;nbsp;&lt;k&gt;And&lt;/k&gt;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.objVelocity.X&amp;nbsp;&lt;&amp;nbsp;0)&amp;nbsp;&lt;k&gt;Then&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objVelocity.X&amp;nbsp;=&amp;nbsp;0&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;If&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;If&lt;/k&gt;&amp;nbsp;(negY&amp;nbsp;&lt;k&gt;And&lt;/k&gt;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.objVelocity.Y&amp;nbsp;&gt;&amp;nbsp;0)&amp;nbsp;&lt;k&gt;Or&lt;/k&gt;&amp;nbsp;(&lt;k&gt;Not&lt;/k&gt;&amp;nbsp;negY&amp;nbsp;&lt;k&gt;And&lt;/k&gt;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.objVelocity.Y&amp;nbsp;&lt;&amp;nbsp;0)&amp;nbsp;&lt;k&gt;Then&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objVelocity.Y&amp;nbsp;=&amp;nbsp;0&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;If&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'increment&amp;nbsp;the&amp;nbsp;object's&amp;nbsp;position&amp;nbsp;by&amp;nbsp;the&amp;nbsp;amount&amp;nbsp;of&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'velocity&amp;nbsp;appropriate&amp;nbsp;for&amp;nbsp;this&amp;nbsp;frame&amp;nbsp;by&amp;nbsp;multiplying&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'by&amp;nbsp;the&amp;nbsp;time&amp;nbsp;value.&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.Position&amp;nbsp;+=&amp;nbsp;(&lt;k&gt;Me&lt;/k&gt;.objVelocity&amp;nbsp;*&amp;nbsp;time)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;If&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;/div&gt;&lt;!-- &lt;br /&gt;END --&gt;&lt;br /&gt;I haven't really discussed my existing system for movement on the blog yet; we'll get to that eventually, but I was amused by this velocity/friction/mass approach and it's probably more relevant to the needs of gaming anyway.&lt;br /&gt;&lt;br /&gt;This is far from an actual simulator, I'm only using mass to resist initial force and not really applying it to friction but that's ok.  This is supposed to be simple, and the results aren't too shabby.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Idi4xSeHyD0&amp;rel=1"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/Idi4xSeHyD0&amp;rel=1" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;In the video, just the new "physics" values introduced are being used to move the spaceship around.  While the player holds down the thrust key, the current orientation of the ship * some thrust value determines a parameter for ApplyForce.  Using a PlayerShip game object (as described in previous tutorials, it just inherits from sprite), I created a ThrusterOn method.  As long as the user holds the truster key down, I call PlayerShip.ThrusterOn&lt;br /&gt;&lt;br /&gt;&lt;!-- BEGIN &lt;br /&gt;--&gt;&lt;style type="text/css"&gt;k{color:#0000FF;}c{color:#008000;}t{color:#A31515;}n{}.o{border-left:solid 1px grey;border-top:solid 1px grey;font-family:Courier New;vertical-align:top;font-size:10pt;text-align:left;color:#000000;}&lt;/style&gt;&lt;div class="o" style="width:613px;height:auto;overflow-x:scroll;overflow-y:scroll;"&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;ThrusterOn()&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Dim&lt;/k&gt;&amp;nbsp;time&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;&lt;k&gt;Single&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;time&amp;nbsp;=&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.Game.GameTime.ElapsedGameTime.TotalMilliseconds&amp;nbsp;/&amp;nbsp;1000&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.ApplyForce((Vector2.Normalize(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;Vector2(Math.Sin(&lt;k&gt;CDbl&lt;/k&gt;(&lt;k&gt;Me&lt;/k&gt;.sngRotation)),&amp;nbsp;-Math.Cos(&lt;k&gt;CDbl&lt;/k&gt;(&lt;k&gt;Me&lt;/k&gt;.sngRotation))))&amp;nbsp;*&amp;nbsp;250)&amp;nbsp;*&amp;nbsp;time)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;/div&gt;&lt;!-- &lt;br /&gt;END --&gt;&lt;br /&gt;&lt;br /&gt;The ship has a little mass to it, so it resists force somewhat (this gives you a way to tweak acceleration curve vs. thruster power), and the ship's psuedo-friction value constantly pulls it's velocity toward zero.  This example was built using my "real" 2D engine (which is a little further along than what the blog has covered so far, i.e. there's keyboard handling &amp; debugging &amp; screen management, etc.), but the movement you see is achieved through the simple additions described above.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-7098680086085051463?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/7098680086085051463/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=7098680086085051463' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/7098680086085051463'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/7098680086085051463'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2007/12/fun-with-very-basic-physics.html' title='Fun with (very basic) physics'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-1303444541788794709</id><published>2007-12-08T12:48:00.000-08:00</published><updated>2008-06-20T02:59:28.488-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Me'/><title type='text'>Velocity, distance and time</title><content type='html'>The first animation system I created, which I currently use, was designed with UI components in mind.  Things like buttons, windows, forms &amp; controls, stuff like that.  The current animation system I have for this is very good at moving something from one predefined point to another: from A to B.  Or from rotation value X to rotation value Y.  But always from one finite value to another finite value.&lt;br /&gt;&lt;br /&gt;I'll keep this around, because it's useful, but games are not so rigidly constructed as UIs.  I'm forming the opinion that it's better to not rely on knowledge of predefined points when moving game objects, but rather rely on movement values such as velocity and direction, and just react accordingly to those values over time.  So in consuming yet more R&amp;D time before I put any more tutorials out, I'm going to construct such a thing.  I have a few ideas I want to play with which may prove very useful.&lt;br /&gt;&lt;br /&gt;I'm also working on a grid object which can be incorporated into the parent/child system so that at any point, a grid w/ a camera can be arbitrarily put anywhere &amp; globally transformed by it's parent.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-1303444541788794709?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/1303444541788794709/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=1303444541788794709' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/1303444541788794709'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/1303444541788794709'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2007/12/velocity-distance-and-time.html' title='Velocity, distance and time'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-5460186497316504589</id><published>2007-12-03T14:25:00.000-08:00</published><updated>2008-06-19T16:09:54.427-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Off topic'/><title type='text'>Ramble</title><content type='html'>I've been surprised by how much GPU power it takes to run a pixel shader over a scene.  The 2-pass Gaussian blur I've been testing with pushes my laptop's GPU pretty hard (a &lt;a href="http://ati.amd.com/products/Mobilityfireglv5200/index.html" target="_new"&gt;Mobility FireGL V5200&lt;/a&gt;; not exactly an uber GPU). Initially I attributed the performance I was seeing to my code being inefficient, but after comparing performance with the post processing samples on the Creator's Club site (which I presume to be well formed) I don't think I'm doing anything "wrong" - I'm just a little bit brainwashed by the performance of modern CPUs.  &lt;br /&gt;&lt;br /&gt;A modern CPU (like an Intel core duo 2.0Ghz processor) can perform mathematical operations so fast as to be &lt;a href="http://en.wikipedia.org/wiki/Clarke's_three_laws" target="_new"&gt;indistinguishable from magic&lt;/a&gt;.  But I was forgetting that the modern GPU hasn't had as much time as the CPU to mature &amp; advance as a technology.  GPUs are fast, but they still have plenty of room to grow.  In thinking my code was inefficient, in truth I was overestimating the ability of my laptop's GPU.&lt;br /&gt;&lt;br /&gt;So the shader business is basically done.  I've got a system of renderTargets built into the engine to handle arbitrary scene processing at arbitrary points in the parent/child hierarchy, which accomplishes the goal.  Now all I need to do is steal my wife's 8800GTX out of her gaming rig and cram it into my laptop with a vice.  Yea, that should work.&lt;br /&gt;&lt;br /&gt;My job has me somewhat diverted from this blog, although, the stuff I'm tasked with at work is vicariously related.  In my current project, a "mostly complete" version of this 2D engine is used to create an XNA application.  But I'm a "regular" programmer, not a "game developer", and so the goal of this 2D engine is to create a really user-friendly, neato touch-screen interface in an attempt to delude all who use it into believing their job is not quite as boring and mundane as it is.  Which is not such a bad thing to do for people, really.&lt;br /&gt;&lt;br /&gt;This app at work likes to get real chummy with a SQL database to conduct important workly business.  About a 3rd of this chummy relationship is facilitated through the DataAdapter.Fill method, mainly because I have a small ADO engine with some built in concurrency checking features etc which I'm reusing in the XNA app.  What's particularly problematic about using DataAdapter.Fill with an XNA application is the fact that DataAdapter.Fill is a synchronous method: this means DataAdapter.Fill "blocks the calling thread" while it's grabbing data out of SQL.  I'm no game industry veteran by any means, but I can guess blocking the main thread of a game probably ranks in the top 3 "worst design features of all time".  While it just so happens I can get away with this over the LAN, deploying this app over a VPN is obviously not going to work.  &lt;br /&gt;&lt;br /&gt;So currently I'm devising an async system for DataAdapter.Fill and just basically making all the changes I have to make to get this done, it's a little extensive because I'm revamping an entire remote access system, just a little.  To be honest it's something I've always known I should do, I just never had a real critical reason to do it.  Kind of a hassle but certainly for the best.&lt;br /&gt;&lt;br /&gt;But this relates partly to my 2D engine / game programming hobby in that I'll end up with a model whereby the game loop submits requests for remote data, then continues to render normally while it polls for the result to complete.  I would assume this sort of model will be handy for a networking layer to a multiplayer game, like for sending requests to a game server or peer client and awaiting the response.  So, mundane as it is, this sort of thing should prove reasonably useful in the future.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-5460186497316504589?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/5460186497316504589/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=5460186497316504589' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/5460186497316504589'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/5460186497316504589'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2007/12/ramble.html' title='Ramble'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-416376489066870646</id><published>2007-11-30T21:01:00.000-08:00</published><updated>2008-06-20T02:59:59.992-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Project: Star Maze'/><title type='text'>Star Maze</title><content type='html'>When I was a kid, my dad, in a uncharacteristic fit of runaway consumerism, came home one afternoon with an Apple IIe rig.  Monochrome green monitor, dual disk drives and a really big molded plastic desk to house it all.  Expensive, cutting-edge technology that no one in my family really knew what to do with - including dad.  But it was pretty awesome anyway.&lt;br /&gt;&lt;br /&gt;I wouldn't become interested in programming for another decade or more (long after the Apple IIe was gone), but I have a lot of good memories of the unique &amp; quirky games I played back on the Apple.  So a few years ago when I discovered the &lt;a href="http://applewin.berlios.de" target="_new"&gt;AppleWin&lt;/a&gt; emulator project and the impressive &lt;a href="ftp://ftp.apple.asimov.net/pub/apple_II/images" target="_new"&gt;ftp.apple.asimov.net&lt;/a&gt; disk image repository, I was stoked.&lt;br /&gt;&lt;br /&gt;The vast array of software available in the asimov repository can be a blessing and a curse; it's comprehensive, but it quickly turns into a proverbial haystack when you can't remember the name of that one game you played 25 years ago.  Last night I was pretty thrilled to &lt;span style="font-weight:bold;"&gt;finally&lt;/span&gt; reunite a vague memory of "that one gem collecting space game" with &lt;a href="ftp://ftp.apple.asimov.net/pub/apple_II/images/games/action/star_maze.dsk.gz" target="_new"&gt;Star Maze&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;img src="http://i97.photobucket.com/albums/l223/emachine74/starmaze.png" /&gt;&lt;br /&gt;&lt;i&gt;Star Maze running in AppleWin&lt;/i&gt;&lt;/center&gt;&lt;br /&gt;Since I've been building this 2D engine in XNA, there's been something of a worker thread spawned in the back of my mind.  A background process that examines the games I play through a programmer's prism.  Last night as I drifted around Star Maze, shooting bad guys, collecting jewels and enjoying the nostalgia, it occurred to me that Star Maze is actually a well designed game.  It's ancient, and a hassle to play via the emulator, but whereas a lot of these old games I've exhumed from asimov lately have primarily had only nostalgic value and not much else, Star Maze sticks out as a somewhat viable game.  I think there's a spark of gameplay beating beneath it's crude surface, preserved all these years.&lt;br /&gt;&lt;br /&gt;Once the engine is done, I think I'll give my old pal Star Maze a face-lift.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-416376489066870646?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/416376489066870646/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=416376489066870646' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/416376489066870646'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/416376489066870646'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2007/11/star-maze.html' title='Star Maze'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-2401725080603182340</id><published>2007-11-27T18:10:00.000-08:00</published><updated>2007-12-15T15:44:01.315-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XNA project template for VB'/><title type='text'>VB.NET XNA Windows Game Project Template</title><content type='html'>I've made a VB.NET XNA Windows Game project template for Visual Studio.  It should work with Visual Studio 2005 &amp; Visual Basic Express edition (and may work in others, but has not been tested)  It requires you install &lt;a href="http://creators.xna.com/Education/GettingStarted.aspx" target="_new"&gt;Game Studio 2.0&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The project template comes in 2 flavors: With Examples, and Without.&lt;br /&gt;&lt;br /&gt;"With Examples" gives you a Game class that contains code and comments that take you step by step through the LoadContent, Update and Draw routines to perform a simple 2D task using XNA and VB.NET.&lt;br /&gt;&lt;br /&gt;"Without Examples" gives you the same thing, without the sample code.&lt;br /&gt;&lt;br /&gt;Both include an initialized VBContentManager for you to study, hack apart, belittle, delete, or just use as-is.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;How to install it&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Just save either one of the following files into your Visual Studio 2005 templates folder&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.reddinghaze.com/WindowsGameWithExamples.zip"&gt;With Examples&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;or&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.reddinghaze.com/WindowsGame.zip"&gt;Without Examples&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;This is a zip file - do you mean unzip it into the templates folder?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Nope, just save the zip file right into the templates folder.  Visual Studio 2005 knows what to do with it.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;"Templates folder"?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Unless you've told Visual Studio otherwise, it's located on your computer here:&lt;br /&gt;&lt;br /&gt;My Documents\Visual Studio 2005\Templates\ProjectTemplates\Visual Basic&lt;br /&gt;&lt;br /&gt;You can just tell your browser to save the file there.&lt;br /&gt;&lt;br /&gt;When you start a new project, you should now see WindowsGame under "My Templates" for Visual Basic:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i97.photobucket.com/albums/l223/emachine74/project-1.png" /&gt;&lt;br /&gt;&lt;br /&gt;Using the template should create a project for you that looks like this:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i97.photobucket.com/albums/l223/emachine74/project2.png" /&gt;&lt;br /&gt;&lt;i&gt;This is the "Without Examples" version&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;The goal is for you to be able to start one of these projects anew just like you see above, hit F5, and have a working "game" you can start modifying &amp; adding content to right away.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Is this actual support for VB.NET + XNA?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Not really, this is the same old hack stuff you've been reading on my blog or Alan Phipp's site or wherever, I've just packaged up my version of the hack for you into a Visual Studio template, so you can be up and running with it right away.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-2401725080603182340?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/2401725080603182340/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=2401725080603182340' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/2401725080603182340'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/2401725080603182340'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2007/11/vbnet-xna-windows-game-project-template.html' title='VB.NET XNA Windows Game Project Template'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-4280702292251956296</id><published>2007-11-25T12:46:00.000-08:00</published><updated>2008-06-20T03:00:21.245-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Me'/><title type='text'>The five P's</title><content type='html'>Before I move on with more tutorials, I'm going to do a little R&amp;D on a few logistical things that I want to improve and/or be sure will still work once we're further down the road.&lt;br /&gt;&lt;br /&gt;I want to reduce the number of calls being made to SpriteBatch.Begin and SpriteBatch.End, so a maximum number of sprites are actually sent as a batch (rather than having hundreds of "batches" of 1 sprite each, which is not exactly the optimal way to use Sprite&lt;span style="font-weight:bold;"&gt;Batch&lt;/span&gt;).  I have an idea for this but I still need to play with it this week.&lt;br /&gt;&lt;br /&gt;What I've been playing with this weekend are ways to make certain shader effects (like blurs) happen much, much faster.  This is reasonably out of scope of what the blog has covered so far, but seeing as how I want to tie shader effects into the engine later on without invoking a messy refactor, I'm going to get it all straightened out before I continue the tutorials.&lt;br /&gt;&lt;br /&gt;I also want to study the idea of a particle engine that will integrate nicely into what's being built here.&lt;br /&gt;&lt;br /&gt;So the next tutorial whenever it comes will probably be a quick tour through the changes in Game Studio / XNA 2.0 and then we'll roll on from there.&lt;br /&gt;&lt;br /&gt;The five P's are &lt;span style="font-weight:bold;"&gt;P&lt;/span&gt;rior &lt;span style="font-weight:bold;"&gt;P&lt;/span&gt;lanning &lt;span style="font-weight:bold;"&gt;P&lt;/span&gt;revents &lt;span style="font-weight:bold;"&gt;P&lt;/span&gt;oor &lt;span style="font-weight:bold;"&gt;P&lt;/span&gt;rojects.  Good advice.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-4280702292251956296?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/4280702292251956296/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=4280702292251956296' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/4280702292251956296'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/4280702292251956296'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2007/11/five-ps.html' title='The five P&apos;s'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-6087293405631504945</id><published>2007-11-20T19:43:00.001-08:00</published><updated>2008-06-20T14:07:49.424-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XNA 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='VB.NET Content Pipeline'/><title type='text'>VB.NET XNA Content Pipeline for Game Studio 2.0 (beta)</title><content type='html'>&lt;font color="grey"&gt;[GS 2.0 Beta]&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Moving forward, the tutorials on this website will be referencing XNA 2.0.&lt;br /&gt;&lt;br /&gt;Here is an updated version of the VBContentManager class for use with XNA 2.0&lt;ul&gt;&lt;li&gt;The class itself now inherits from the XNA 2.0 ContentManager&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The LoadPipeline() method has been replaced by the CompileContent &amp; LoadAllContent methods. Call these methods as appropriate where LoadPipeline was used before.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;You can now specify a platform (Windows or Xbox360), although it's not exactly known whether or not you can run VB.NET on an Xbox360. This is there just in case/for the future. The target platform is Windows by default&lt;/li&gt;&lt;br /&gt;&lt;li&gt;You can now specify whether or not the MSBuild window is visible, having the content compile in "stealth mode" (as a C# project does)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The content folder is no longer supplied relative to the bin\Debug folder.  You now supply it relative to the Project node in which the folder resides.  For example, if you made a folder called "My Content" in your game's project in the Solution Explorer, you would simply supply "My Content" as the path to your content (rather than "../../My Content" like before)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The 'fake' project file built for MSBuild is now a .contentproj file, rather than an actual .csproj file.  Not that the extension matters much, this was simply for the sake of emulating the file created in XNA 2.0 (where, in C#, content is now a sub-project of the game and has it's own project file - the VBContentManager simply simulates this file).  As an aside, the project file being generated is more well formed than before, so MSBuild should no longer throw warning messages as it compiles.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;In the previous version of the VBContentManager, choosing not to compile the content would result in a runtime error.  You no longer have to compile the content; if you know it's already compiled (like say for instance, right before you are going to distribute the application to someone's PC) you can omit the call to CompileContent in your code and load the already-compiled content (skips the call to MSBuild completely).&lt;/li&gt;&lt;/ul&gt;Here is the code for the class:&lt;br /&gt;&lt;br /&gt;&lt;!-- BEGIN &lt;br /&gt;--&gt;&lt;style type="text/css"&gt;k{color:#0000FF;}c{color:#008000;}t{color:#A31515;}n{}.o{border-left:solid 1px grey;border-top:solid 1px grey;font-family:Courier New;vertical-align:top;font-size:10pt;text-align:left;color:#000000;}&lt;/style&gt;&lt;div class="o" style="width:633px;height:633px;overflow-x:scroll;overflow-y:scroll;"&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Class&lt;/k&gt;&amp;nbsp;VBContentManager&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Inherits&lt;/k&gt;&amp;nbsp;ContentManager&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;Fonts&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Hashtable(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;SpriteFont)&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;Textures&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Hashtable(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;Texture2D)&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;SubTextures&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Hashtable(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;Hashtable(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;Rectangle))&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;Sounds&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Hashtable(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;SoundBank)&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;Effects&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Hashtable(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;Effect)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;strContentprojFile,&amp;nbsp;strProjectFolder,&amp;nbsp;strExecutingFolder,&amp;nbsp;strContentFolder&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;String&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;objContent&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;List(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;ContentFile)&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;intDupeSound,&amp;nbsp;intDupeTexture,&amp;nbsp;intDupeFont,&amp;nbsp;intDupeEffect&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;&lt;k&gt;Integer&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Enum&lt;/k&gt;&amp;nbsp;Platform&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;Windows&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;XBox360&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Enum&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Enum&lt;/k&gt;&amp;nbsp;ContentTypes&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;Textures&amp;nbsp;=&amp;nbsp;0&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;Fonts&amp;nbsp;=&amp;nbsp;1&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;Sounds&amp;nbsp;=&amp;nbsp;2&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;Effects&amp;nbsp;=&amp;nbsp;3&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Enum&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;&lt;k&gt;Enum&lt;/k&gt;&amp;nbsp;ImporterName&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;TextureImporter&amp;nbsp;=&amp;nbsp;0&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;FontDescriptionImporter&amp;nbsp;=&amp;nbsp;1&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;XactImporter&amp;nbsp;=&amp;nbsp;2&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;EffectImporter&amp;nbsp;=&amp;nbsp;3&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Enum&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;&lt;k&gt;Enum&lt;/k&gt;&amp;nbsp;ProcessorName&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;TextureProcessor&amp;nbsp;=&amp;nbsp;0&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;FontDescriptionProcessor&amp;nbsp;=&amp;nbsp;1&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;XactProcessor&amp;nbsp;=&amp;nbsp;2&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;EffectProcessor&amp;nbsp;=&amp;nbsp;3&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Enum&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Structure&lt;/k&gt;&amp;nbsp;ContentFile&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;ContentType&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;ContentTypes&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;File&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;System.IO.FileInfo&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;Name&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;String&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;&lt;k&gt;New&lt;/k&gt;(&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;ContentType&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;ContentTypes,&amp;nbsp;&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;ContentFile&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;System.IO.FileInfo,&amp;nbsp;&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;Name&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;String)&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.ContentType&amp;nbsp;=&amp;nbsp;ContentType&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.File&amp;nbsp;=&amp;nbsp;ContentFile&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.Name&amp;nbsp;=&amp;nbsp;Name&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Structure&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;summary&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;Creates&amp;nbsp;a&amp;nbsp;new&amp;nbsp;ContentManager&amp;nbsp;which&amp;nbsp;has&amp;nbsp;been&amp;nbsp;extended&amp;nbsp;with&amp;nbsp;functionality&amp;nbsp;to&amp;nbsp;support&amp;nbsp;a&amp;nbsp;Visual&amp;nbsp;Basic&amp;nbsp;(or&amp;nbsp;other&amp;nbsp;non-C#)&amp;nbsp;project&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;/summary&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;param&amp;nbsp;name="ServiceProvider"&amp;gt;Your&amp;nbsp;game&amp;nbsp;has&amp;nbsp;a&amp;nbsp;.Services&amp;nbsp;property;&amp;nbsp;send&amp;nbsp;that&amp;nbsp;in&amp;nbsp;here.&amp;lt;/param&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;param&amp;nbsp;name="ContentFolder"&amp;gt;Your&amp;nbsp;content&amp;nbsp;folder&amp;nbsp;(a&amp;nbsp;relative&amp;nbsp;path,&amp;nbsp;from&amp;nbsp;your&amp;nbsp;game's&amp;nbsp;Project&amp;nbsp;node&amp;nbsp;as&amp;nbsp;it&amp;nbsp;appears&amp;nbsp;in&amp;nbsp;the&amp;nbsp;Solution&amp;nbsp;Explorer)&amp;lt;/param&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;remarks&amp;gt;&amp;lt;/remarks&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;&lt;k&gt;New&lt;/k&gt;(&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;ServiceProvider&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;IServiceProvider,&amp;nbsp;&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;ContentFolder&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;String)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;MyBase&lt;/k&gt;.New(ServiceProvider)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;With&lt;/k&gt;&amp;nbsp;System.Reflection.Assembly.GetEntryAssembly.Location&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.strExecutingFolder&amp;nbsp;=&amp;nbsp;.Substring(0,&amp;nbsp;.LastIndexOf(&lt;t&gt;"\"&lt;/t&gt;))&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;With&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;With&lt;/k&gt;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.strExecutingFolder&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;With&lt;/k&gt;&amp;nbsp;.Substring(0,&amp;nbsp;.LastIndexOf(&lt;t&gt;"\"&lt;/t&gt;)&amp;nbsp;-&amp;nbsp;1)&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.strProjectFolder&amp;nbsp;=&amp;nbsp;.Substring(0,&amp;nbsp;.LastIndexOf(&lt;t&gt;"\"&lt;/t&gt;))&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;With&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;With&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.strContentFolder&amp;nbsp;=&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.strProjectFolder&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"\"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;ContentFolder&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.Fonts&amp;nbsp;=&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;Hashtable(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;SpriteFont)&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.Textures&amp;nbsp;=&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;Hashtable(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;Texture2D)&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.SubTextures&amp;nbsp;=&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;Hashtable(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;Hashtable(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;Rectangle))&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.Sounds&amp;nbsp;=&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;Hashtable(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;SoundBank)&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.Effects&amp;nbsp;=&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;Hashtable(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;Effect)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;summary&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;Attempts&amp;nbsp;to&amp;nbsp;load&amp;nbsp;all&amp;nbsp;assets&amp;nbsp;which&amp;nbsp;have&amp;nbsp;been&amp;nbsp;compiled&amp;nbsp;by&amp;nbsp;the&amp;nbsp;Content&amp;nbsp;Pipeline.&amp;nbsp;Assets&amp;nbsp;are&amp;nbsp;placed&amp;nbsp;into&amp;nbsp;the&amp;nbsp;respective&amp;nbsp;Hash&amp;nbsp;table&amp;nbsp;(Fonts,&amp;nbsp;Textures,&amp;nbsp;et&amp;nbsp;al)&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;/summary&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;remarks&amp;gt;&amp;lt;/remarks&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;LoadAllContent()&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Dim&lt;/k&gt;&amp;nbsp;objCompiledContent&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;List(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;IO.FileInfo)&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Dim&lt;/k&gt;&amp;nbsp;strUnknownFiles&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;String&amp;nbsp;=&amp;nbsp;&lt;t&gt;""&lt;/t&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;For&lt;/k&gt;&amp;nbsp;&lt;k&gt;Each&lt;/k&gt;&amp;nbsp;file&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;IO.FileInfo&amp;nbsp;&lt;k&gt;In&lt;/k&gt;&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;IO.DirectoryInfo(&lt;k&gt;Me&lt;/k&gt;.strExecutingFolder).GetFiles(&lt;t&gt;"*.xnb"&lt;/t&gt;,&amp;nbsp;IO.SearchOption.AllDirectories)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Try&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'Font?&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;With&lt;/k&gt;&amp;nbsp;file.FullName.ToLower&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.Fonts.Add(file.Name.Replace(file.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;),&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.Load(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;SpriteFont)(.Replace(&lt;k&gt;Me&lt;/k&gt;.strExecutingFolder&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"\"&lt;/t&gt;,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;).Replace(file.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;With&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Catch&lt;/k&gt;&amp;nbsp;notAFont&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Exception&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Try&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'Texture2D?&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;With&lt;/k&gt;&amp;nbsp;file.FullName&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.Textures.Add(file.Name.Replace(file.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;),&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.Load(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;Texture2D)(.Replace(&lt;k&gt;Me&lt;/k&gt;.strExecutingFolder&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"\"&lt;/t&gt;,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;).Replace(file.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;With&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Catch&lt;/k&gt;&amp;nbsp;notATexture2D&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Exception&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Try&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'Sound?&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;With&lt;/k&gt;&amp;nbsp;file.FullName.ToLower&lt;br /&gt;&lt;n style="padding-left:216px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.Sounds.Add(file.Name.Replace(file.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;),&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.Load(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;SoundBank)(.Replace(&lt;k&gt;Me&lt;/k&gt;.strExecutingFolder&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"\"&lt;/t&gt;,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;).Replace(file.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;With&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Catch&lt;/k&gt;&amp;nbsp;notASoundBank&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Exception&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Try&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:216px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'Effect?&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:216px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;With&lt;/k&gt;&amp;nbsp;file.FullName.ToLower&lt;br /&gt;&lt;n style="padding-left:248px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.Effects.Add(file.Name.Replace(file.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;),&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.Load(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;Effect)(.Replace(&lt;k&gt;Me&lt;/k&gt;.strExecutingFolder&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"\"&lt;/t&gt;,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;).Replace(file.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&lt;br /&gt;&lt;n style="padding-left:216px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;With&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Catch&lt;/k&gt;&amp;nbsp;unknown&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Exception&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:216px;"&gt;&amp;nbsp;&lt;/n&gt;strUnknownFiles&amp;nbsp;&amp;=&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;file.FullName&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Try&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Try&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Try&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Try&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Next&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;If&lt;/k&gt;&amp;nbsp;strUnknownFiles&amp;nbsp;&lt;&gt;&amp;nbsp;&lt;t&gt;""&lt;/t&gt;&amp;nbsp;&lt;k&gt;Then&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;MsgBox(&lt;t&gt;"The&amp;nbsp;VBContentManager&amp;nbsp;was&amp;nbsp;unable&amp;nbsp;to&amp;nbsp;determine&amp;nbsp;the&amp;nbsp;correct&amp;nbsp;loader&amp;nbsp;for:"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;strUnknownFiles&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;t&gt;"Unless&amp;nbsp;loaded&amp;nbsp;by&amp;nbsp;something&amp;nbsp;else,&amp;nbsp;the&amp;nbsp;above&amp;nbsp;content&amp;nbsp;won't&amp;nbsp;be&amp;nbsp;available&amp;nbsp;at&amp;nbsp;runtime."&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;t&gt;"This&amp;nbsp;application&amp;nbsp;may&amp;nbsp;become&amp;nbsp;unstable&amp;nbsp;as&amp;nbsp;a&amp;nbsp;result."&lt;/t&gt;)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;If&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;summary&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;Compiles&amp;nbsp;the&amp;nbsp;VB&amp;nbsp;Content&amp;nbsp;Pipeline&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;/summary&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;param&amp;nbsp;name="stealth"&amp;gt;Hide/Show&amp;nbsp;the&amp;nbsp;MSBuild&amp;nbsp;window&amp;nbsp;during&amp;nbsp;the&amp;nbsp;compile&amp;nbsp;process&amp;lt;/param&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;param&amp;nbsp;name="platform"&amp;gt;If&amp;nbsp;there's&amp;nbsp;a&amp;nbsp;way&amp;nbsp;the&amp;nbsp;Xbox360&amp;nbsp;will&amp;nbsp;work&amp;nbsp;with&amp;nbsp;VB,&amp;nbsp;you&amp;nbsp;could&amp;nbsp;pass&amp;nbsp;in&amp;nbsp;the&amp;nbsp;Xbox&amp;nbsp;parameter&amp;nbsp;as&amp;nbsp;a&amp;nbsp;target&amp;nbsp;platform&amp;nbsp;to&amp;nbsp;MSBuild.&amp;nbsp;&amp;nbsp;But&amp;nbsp;it's&amp;nbsp;Windows&amp;nbsp;by&amp;nbsp;default.&amp;lt;/param&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;remarks&amp;gt;&amp;lt;/remarks&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;CompileContent(&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;stealth&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;&lt;k&gt;Boolean&lt;/k&gt;,&amp;nbsp;&lt;k&gt;Optional&lt;/k&gt;&amp;nbsp;&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;platform&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Platform&amp;nbsp;=&amp;nbsp;VBContentManager.Platform.Windows)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Dim&lt;/k&gt;&amp;nbsp;objProcess&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Process&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Dim&lt;/k&gt;&amp;nbsp;objPSI&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;Diagnostics.ProcessStartInfo&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objContent&amp;nbsp;=&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;List(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;ContentFile)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.HarvestContent()&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;If&lt;/k&gt;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.objContent.Count&amp;nbsp;&gt;&amp;nbsp;0&amp;nbsp;&lt;k&gt;Then&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.BuildContentProj(platform)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Try&lt;/k&gt;&amp;nbsp;'to&amp;nbsp;write&amp;nbsp;the&amp;nbsp;content&amp;nbsp;project&amp;nbsp;file&amp;nbsp;to&amp;nbsp;disk&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Using&lt;/k&gt;&amp;nbsp;TempStreamWriter&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;System.IO.StreamWriter&amp;nbsp;=&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;System.IO.StreamWriter(&lt;k&gt;Me&lt;/k&gt;.strProjectFolder&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"\Content.contentproj"&lt;/t&gt;,&amp;nbsp;&lt;k&gt;False&lt;/k&gt;)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;With&lt;/k&gt;&amp;nbsp;TempStreamWriter&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;.Write(&lt;k&gt;Me&lt;/k&gt;.strContentprojFile)&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;.Close()&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;With&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Using&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Try&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;With&lt;/k&gt;&amp;nbsp;objPSI&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;.FileName&amp;nbsp;=&amp;nbsp;Environment.GetEnvironmentVariable(&lt;t&gt;"Windir"&lt;/t&gt;)&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe"&lt;/t&gt;&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;.Arguments&amp;nbsp;=&amp;nbsp;&lt;t&gt;""&lt;/t&gt;&lt;t&gt;""&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.strProjectFolder&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"\Content.contentproj"&lt;/t&gt;&lt;t&gt;""&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;t&gt;"&amp;nbsp;/verbosity:normal"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;t&gt;"&amp;nbsp;/l:FileLogger,Microsoft.Build.Engine;logfile="&lt;/t&gt;&lt;t&gt;""&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.strProjectFolder&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"\Content.log"&lt;/t&gt;&lt;t&gt;""&lt;/t&gt;&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;If&lt;/k&gt;&amp;nbsp;stealth&amp;nbsp;&lt;k&gt;Then&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:216px;"&gt;&amp;nbsp;&lt;/n&gt;.Arguments&amp;nbsp;&amp;=&amp;nbsp;&lt;t&gt;"&amp;nbsp;/noconsolelogger"&lt;/t&gt;&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;If&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;If&lt;/k&gt;&amp;nbsp;stealth&amp;nbsp;&lt;k&gt;Then&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:216px;"&gt;&amp;nbsp;&lt;/n&gt;.WindowStyle&amp;nbsp;=&amp;nbsp;ProcessWindowStyle.Hidden&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;If&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;With&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'give&amp;nbsp;the&amp;nbsp;.contentproj&amp;nbsp;file&amp;nbsp;to&amp;nbsp;MSBuild&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;objProcess&amp;nbsp;=&amp;nbsp;System.Diagnostics.Process.Start(objPSI)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;While&lt;/k&gt;&amp;nbsp;&lt;k&gt;Not&lt;/k&gt;&amp;nbsp;objProcess.HasExited&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;Threading.Thread.Sleep(100)&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;While&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Catch&lt;/k&gt;&amp;nbsp;ex&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Exception&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;MsgBox(&lt;t&gt;"When&amp;nbsp;building&amp;nbsp;the&amp;nbsp;pipeline,&amp;nbsp;trying&amp;nbsp;to&amp;nbsp;run&amp;nbsp;MSBuild.exe&amp;nbsp;resulted&amp;nbsp;in:&amp;nbsp;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;ex.Message)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Try&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Catch&lt;/k&gt;&amp;nbsp;ex&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Exception&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;MsgBox(&lt;t&gt;"When&amp;nbsp;building&amp;nbsp;the&amp;nbsp;pipeline,&amp;nbsp;trying&amp;nbsp;to&amp;nbsp;create&amp;nbsp;the&amp;nbsp;Content.contentproj&amp;nbsp;file&amp;nbsp;"&lt;/t&gt;&lt;t&gt;""&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.strContentFolder&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"\Content.contentproj"&lt;/t&gt;&lt;t&gt;"&amp;nbsp;resulted&amp;nbsp;in:&amp;nbsp;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;ex.Message)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Try&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;If&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;HarvestContent()&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Dim&lt;/k&gt;&amp;nbsp;objRoot&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;System.IO.DirectoryInfo&amp;nbsp;=&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;System.IO.DirectoryInfo(&lt;k&gt;Me&lt;/k&gt;.strContentFolder)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;For&lt;/k&gt;&amp;nbsp;&lt;k&gt;Each&lt;/k&gt;&amp;nbsp;sound&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;System.IO.FileInfo&amp;nbsp;&lt;k&gt;In&lt;/k&gt;&amp;nbsp;objRoot.GetFiles(&lt;t&gt;"*.xab"&lt;/t&gt;,&amp;nbsp;IO.SearchOption.AllDirectories)&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;If&lt;/k&gt;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.objContent.Contains(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Sounds,&amp;nbsp;sound,&amp;nbsp;sound.Name.Replace(sound.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&amp;nbsp;&lt;k&gt;Then&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.intDupeSound&amp;nbsp;+=&amp;nbsp;1&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objContent.Add(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Sounds,&amp;nbsp;sound,&amp;nbsp;sound.Name.Replace(sound.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)&amp;nbsp;&amp;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.intDupeSound.ToString))&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Else&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objContent.Add(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Sounds,&amp;nbsp;sound,&amp;nbsp;sound.Name.Replace(sound.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;If&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Next&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;For&lt;/k&gt;&amp;nbsp;&lt;k&gt;Each&lt;/k&gt;&amp;nbsp;texture&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;System.IO.FileInfo&amp;nbsp;&lt;k&gt;In&lt;/k&gt;&amp;nbsp;objRoot.GetFiles(&lt;t&gt;"*.png"&lt;/t&gt;,&amp;nbsp;IO.SearchOption.AllDirectories)&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;If&lt;/k&gt;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.objContent.Contains(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Textures,&amp;nbsp;texture,&amp;nbsp;texture.Name.Replace(texture.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&amp;nbsp;&lt;k&gt;Then&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.intDupeTexture&amp;nbsp;+=&amp;nbsp;1&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objContent.Add(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Textures,&amp;nbsp;texture,&amp;nbsp;texture.Name.Replace(texture.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)&amp;nbsp;&amp;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.intDupeTexture.ToString))&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Else&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objContent.Add(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Textures,&amp;nbsp;texture,&amp;nbsp;texture.Name.Replace(texture.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;If&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Next&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;For&lt;/k&gt;&amp;nbsp;&lt;k&gt;Each&lt;/k&gt;&amp;nbsp;texture&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;System.IO.FileInfo&amp;nbsp;&lt;k&gt;In&lt;/k&gt;&amp;nbsp;objRoot.GetFiles(&lt;t&gt;"*.jpg"&lt;/t&gt;,&amp;nbsp;IO.SearchOption.AllDirectories)&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;If&lt;/k&gt;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.objContent.Contains(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Textures,&amp;nbsp;texture,&amp;nbsp;texture.Name.Replace(texture.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&amp;nbsp;&lt;k&gt;Then&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.intDupeTexture&amp;nbsp;+=&amp;nbsp;1&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objContent.Add(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Textures,&amp;nbsp;texture,&amp;nbsp;texture.Name.Replace(texture.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)&amp;nbsp;&amp;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.intDupeTexture.ToString))&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Else&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objContent.Add(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Textures,&amp;nbsp;texture,&amp;nbsp;texture.Name.Replace(texture.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;If&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Next&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;For&lt;/k&gt;&amp;nbsp;&lt;k&gt;Each&lt;/k&gt;&amp;nbsp;texture&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;System.IO.FileInfo&amp;nbsp;&lt;k&gt;In&lt;/k&gt;&amp;nbsp;objRoot.GetFiles(&lt;t&gt;"*.gif"&lt;/t&gt;,&amp;nbsp;IO.SearchOption.AllDirectories)&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;If&lt;/k&gt;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.objContent.Contains(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Textures,&amp;nbsp;texture,&amp;nbsp;texture.Name.Replace(texture.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&amp;nbsp;&lt;k&gt;Then&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.intDupeTexture&amp;nbsp;+=&amp;nbsp;1&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objContent.Add(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Textures,&amp;nbsp;texture,&amp;nbsp;texture.Name.Replace(texture.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)&amp;nbsp;&amp;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.intDupeTexture.ToString))&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Else&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objContent.Add(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Textures,&amp;nbsp;texture,&amp;nbsp;texture.Name.Replace(texture.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;If&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Next&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;For&lt;/k&gt;&amp;nbsp;&lt;k&gt;Each&lt;/k&gt;&amp;nbsp;font&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;System.IO.FileInfo&amp;nbsp;&lt;k&gt;In&lt;/k&gt;&amp;nbsp;objRoot.GetFiles(&lt;t&gt;"*.spritefont"&lt;/t&gt;,&amp;nbsp;IO.SearchOption.AllDirectories)&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;If&lt;/k&gt;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.objContent.Contains(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Fonts,&amp;nbsp;font,&amp;nbsp;font.Name.Replace(font.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&amp;nbsp;&lt;k&gt;Then&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.intDupeFont&amp;nbsp;+=&amp;nbsp;1&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objContent.Add(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Fonts,&amp;nbsp;font,&amp;nbsp;font.Name.Replace(font.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)&amp;nbsp;&amp;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.intDupeFont.ToString))&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Else&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objContent.Add(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Fonts,&amp;nbsp;font,&amp;nbsp;font.Name.Replace(font.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;If&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Next&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;For&lt;/k&gt;&amp;nbsp;&lt;k&gt;Each&lt;/k&gt;&amp;nbsp;effect&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;System.IO.FileInfo&amp;nbsp;&lt;k&gt;In&lt;/k&gt;&amp;nbsp;objRoot.GetFiles(&lt;t&gt;"*.fx"&lt;/t&gt;,&amp;nbsp;IO.SearchOption.AllDirectories)&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;If&lt;/k&gt;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.objContent.Contains(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Effects,&amp;nbsp;effect,&amp;nbsp;effect.Name.Replace(effect.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&amp;nbsp;&lt;k&gt;Then&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.intDupeEffect&amp;nbsp;+=&amp;nbsp;1&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objContent.Add(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Effects,&amp;nbsp;effect,&amp;nbsp;effect.Name.Replace(effect.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)&amp;nbsp;&amp;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.intDupeEffect.ToString))&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Else&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objContent.Add(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Effects,&amp;nbsp;effect,&amp;nbsp;effect.Name.Replace(effect.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;If&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Next&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;BuildContentProj(&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;platform&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Platform)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Dim&lt;/k&gt;&amp;nbsp;strPlatform&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;String&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Select&lt;/k&gt;&amp;nbsp;&lt;k&gt;Case&lt;/k&gt;&amp;nbsp;platform&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Case&lt;/k&gt;&amp;nbsp;VBContentManager.Platform.XBox360&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;strPlatform&amp;nbsp;=&amp;nbsp;&lt;t&gt;"Xbox&amp;nbsp;360"&lt;/t&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Case&lt;/k&gt;&amp;nbsp;&lt;k&gt;Else&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;strPlatform&amp;nbsp;=&amp;nbsp;&lt;t&gt;"Windows"&lt;/t&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Select&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.strContentprojFile&amp;nbsp;=&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;t&gt;"&amp;lt;Project&amp;nbsp;xmlns="&lt;/t&gt;&lt;t&gt;"http://schemas.microsoft.com/developer/msbuild/2003"&lt;/t&gt;&lt;t&gt;"&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;Import&amp;nbsp;Project="&lt;/t&gt;&lt;t&gt;"$(MSBuildExtensionsPath)\Microsoft\XNA&amp;nbsp;Game&amp;nbsp;Studio\v2.0\Microsoft.Xna.GameStudio.ContentPipeline.targets"&lt;/t&gt;&lt;t&gt;"&amp;nbsp;/&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;PropertyGroup&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;OutputType&amp;gt;Library&amp;lt;/OutputType&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;XnaFrameworkVersion&amp;gt;v2.0&amp;lt;/XnaFrameworkVersion&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;ProjectDir&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.strProjectFolder&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"\&amp;lt;/ProjectDir&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;XNAContentPipelineTargetPlatform&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;strPlatform&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;/XNAContentPipelineTargetPlatform&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;OutputPath&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.strExecutingFolder&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"\&amp;lt;/OutputPath&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;/PropertyGroup&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;ItemGroup&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;Reference&amp;nbsp;Include="&lt;/t&gt;&lt;t&gt;"Microsoft.Xna.Framework.Content.Pipeline.EffectImporter,&amp;nbsp;Version=2.0.0.0,&amp;nbsp;Culture=neutral,&amp;nbsp;PublicKeyToken=6d5c3888ef60e27d,&amp;nbsp;processorArchitecture=MSIL"&lt;/t&gt;&lt;t&gt;"&amp;nbsp;/&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;Reference&amp;nbsp;Include="&lt;/t&gt;&lt;t&gt;"Microsoft.Xna.Framework.Content.Pipeline.FBXImporter,&amp;nbsp;Version=2.0.0.0,&amp;nbsp;Culture=neutral,&amp;nbsp;PublicKeyToken=6d5c3888ef60e27d,&amp;nbsp;processorArchitecture=MSIL"&lt;/t&gt;&lt;t&gt;"&amp;nbsp;/&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;Reference&amp;nbsp;Include="&lt;/t&gt;&lt;t&gt;"Microsoft.Xna.Framework.Content.Pipeline.TextureImporter,&amp;nbsp;Version=2.0.0.0,&amp;nbsp;Culture=neutral,&amp;nbsp;PublicKeyToken=6d5c3888ef60e27d,&amp;nbsp;processorArchitecture=MSIL"&lt;/t&gt;&lt;t&gt;"&amp;nbsp;/&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;Reference&amp;nbsp;Include="&lt;/t&gt;&lt;t&gt;"Microsoft.Xna.Framework.Content.Pipeline.XImporter,&amp;nbsp;Version=2.0.0.0,&amp;nbsp;Culture=neutral,&amp;nbsp;PublicKeyToken=6d5c3888ef60e27d,&amp;nbsp;processorArchitecture=MSIL"&lt;/t&gt;&lt;t&gt;"&amp;nbsp;/&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;/ItemGroup&amp;gt;"&lt;/t&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;For&lt;/k&gt;&amp;nbsp;&lt;k&gt;Each&lt;/k&gt;&amp;nbsp;content&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;ContentFile&amp;nbsp;&lt;k&gt;In&lt;/k&gt;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.objContent&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.strContentprojFile&amp;nbsp;&amp;=&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;ItemGroup&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;Compile&amp;nbsp;Include="&lt;/t&gt;&lt;t&gt;""&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;content.File.FullName&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;""&lt;/t&gt;&lt;t&gt;"&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;vbTab&amp;nbsp;&amp;&amp;nbsp;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;Name&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;content.Name&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;/Name&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;vbTab&amp;nbsp;&amp;&amp;nbsp;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;Importer&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;&lt;k&gt;CType&lt;/k&gt;(content.ContentType,&amp;nbsp;ImporterName).ToString&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;/Importer&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;vbTab&amp;nbsp;&amp;&amp;nbsp;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;Processor&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;&lt;k&gt;CType&lt;/k&gt;(content.ContentType,&amp;nbsp;ProcessorName).ToString&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;/Processor&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;/Compile&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;vbTab&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;/ItemGroup&amp;gt;"&lt;/t&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Next&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.strContentprojFile&amp;nbsp;&amp;=&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;/Project&amp;gt;"&lt;/t&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Class&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;!-- &lt;br /&gt;END --&gt;&lt;br /&gt;To see how a Game can utilize the VBContentManager class, see &lt;a href="http://xnamachine.blogspot.com/2007/10/tutorial-4-vbcontentmanager.html" target="_new"&gt;the previous tutorial on the subject&lt;/a&gt;, and then read the change log at the top of this post.&lt;br /&gt;&lt;br /&gt;Some slight changes can be made to the MyBaseGame class as well.  Now that a ContentManager is built into v2.0 of the XNA Game class, you can overload the Content property to return your VBContentManager.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-6087293405631504945?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/6087293405631504945/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=6087293405631504945' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/6087293405631504945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/6087293405631504945'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2007/11/vbnet-content-pipeline-v20.html' title='VB.NET XNA Content Pipeline for Game Studio 2.0 (beta)'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-4758936629702751203</id><published>2007-11-20T08:51:00.000-08:00</published><updated>2008-06-20T03:00:34.849-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XNA 2.0'/><title type='text'>Game Studio 2.0</title><content type='html'>&lt;a href="http://creators.xna.com/beta/betahome.aspx" target="_new"&gt;Game Studio 2.0 (Beta) has been released&lt;/a&gt;.  At first glance, it looks like the most significant change (in terms of our VB shenanigans here) is the ContentManager class, and some logistics regarding the Content Pipeline.  The VBContentManager class may change to reflect this, as necessary.  I'll be taking my first look at it later today.&lt;br /&gt;&lt;br /&gt;A big feature now included is networking.  I don't really know yet if the networking component of XNA is going to be the most useful when communicating with MS services like XBox Live (et al) or, if you're actually supposed to utilize XNA on the server side of your own client/server game.  I would suspect you'd probably just end up rolling your own network code for the custom scenario, but, who knows!  We'll cross that bridge when we come to it.&lt;br /&gt;&lt;br /&gt;There are some other changes that don't apply to us when using VB (such as the C# Game class template created by the IDE when you start a new Game Project).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-4758936629702751203?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/4758936629702751203/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=4758936629702751203' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/4758936629702751203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/4758936629702751203'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2007/11/game-studio-20.html' title='Game Studio 2.0'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-4163670348735484410</id><published>2007-11-17T15:56:00.001-08:00</published><updated>2008-06-20T03:05:08.600-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA 1.0'/><title type='text'>VB.NET XNA Tutorial 8: Text</title><content type='html'>&lt;font color="grey"&gt;[GSE 1.0 Refresh]&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Text as sprites&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In XNA, text gets drawn to the screen in much the same way everything else in our 2D engine is being drawn to the screen: by having SpriteBatch draw sprites.&lt;br /&gt;&lt;br /&gt;In order to put "Hello world!" on the screen, we'll need 8 regular sprites that just happen to &lt;span style="font-style:italic;"&gt;look like&lt;/span&gt; characters.  Specifically, we'll need the following sprites that look like:&lt;ul&gt;&lt;li&gt;H&lt;/li&gt;&lt;li&gt;e&lt;/li&gt;&lt;li&gt;l (we can use this one 3 times)&lt;/li&gt;&lt;li&gt;o (can be used twice)&lt;/li&gt;&lt;li&gt;w&lt;/li&gt;&lt;li&gt;r&lt;/li&gt;&lt;li&gt;d&lt;/li&gt;&lt;li&gt;!&lt;/li&gt;&lt;/ul&gt;Once we've made those sprites (and loaded them into the game), the next step will be to meticulously draw each one, in the right order, in the right place with perfect spacing, so when we're done we end up with words (and don't forget to offset "world!" from "Hello" to simulate a space character between them).&lt;br /&gt;&lt;br /&gt;Sound tedious?  How about an RPG with ten thousand lines of dialog.  Sound daunting?  If so, good!  You're ready to appreciate the fact XNA can do &lt;span style="font-weight:bold;"&gt;all&lt;/span&gt; of the aforementioned work for you.  Not only will it line up the little sprites on the screen for you, it can even create all the sprites for you.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;MSBuild &amp; SpriteFont&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;All we've asked MSBuild to do for us so far is convert our texture content (.png or .jpg, etc.) into .xnb files.  The .xnb file format is a "cross-platform" file that can be used on either Windows or the Xbox360.  In light of the known compatibility issues with VB.NET and the .NET framework found on the XBox360, why are we bothering to use MSBuild to produce a "cross-platform" file, anyway?&lt;br /&gt;&lt;br /&gt;If you're making an XNA app exclusively for Windows, ending up with "cross-platform" content is somewhat incidental (a side-effect of the process).  On the other hand, a distinct advantage to using MSBuild and the ContentManager can be found in SpriteFonts.&lt;br /&gt;&lt;br /&gt;A SpriteFont starts out life as a small XML file with a ".spritefont" extension that you place in your content folder.  The same MSBuild process that takes our texutre images and creates .xnb files can also take a .spritefont file to create another .xnb file - one that contains the characters of a specific font, at a specific size, as described by the contents of the .spritefont XML file.  Here's an example of a .spritefont XML file:&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="html"&gt;xml&lt;/span&gt; &lt;span class="attr"&gt;version&lt;/span&gt;&lt;span class="kwrd"&gt;="1.0"&lt;/span&gt; &lt;span class="attr"&gt;encoding&lt;/span&gt;&lt;span class="kwrd"&gt;="utf-8"&lt;/span&gt;?&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;&amp;lt;!--&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;This file contains an xml description of a font, and will be read by the XNA&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;Framework Content Pipeline. Follow the comments to customize the appearance&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;of the font in your game, and to change the characters which are available to draw&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;with.&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;--&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;XnaContent&lt;/span&gt; &lt;span class="attr"&gt;xmlns:Graphics&lt;/span&gt;&lt;span class="kwrd"&gt;="Microsoft.Xna.Framework.Content.Pipeline.Graphics"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Asset&lt;/span&gt; &lt;span class="attr"&gt;Type&lt;/span&gt;&lt;span class="kwrd"&gt;="Graphics:FontDescription"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="rem"&gt;&amp;lt;!--&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    Modify this string to change the font that will be imported.&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    --&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;FontName&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Arial&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;FontName&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="rem"&gt;&amp;lt;!--&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    Size is a float value, measured in points. Modify this value to change&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    the size of the font.&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    --&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Size&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;14&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Size&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="rem"&gt;&amp;lt;!--&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    Spacing is a float value, measured in pixels. Modify this value to change&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    the amount of spacing in between characters.&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    --&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Spacing&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;2&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Spacing&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="rem"&gt;&amp;lt;!--&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    Style controls the style of the font. Valid entries are "Regular", "Bold", "Italic",&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    and "Bold, Italic", and are case sensitive.&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    --&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Style&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Regular&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Style&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="rem"&gt;&amp;lt;!--&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    CharacterRegions control what letters are available in the font. Every&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    character from Start to End will be built and made available for drawing. The&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    default range is from 32, (ASCII space), to 126, ('~'), covering the basic Latin&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    character set. The characters are ordered according to the Unicode standard.&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    See the documentation for more information.&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;    --&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;CharacterRegions&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;CharacterRegion&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Start&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&amp;amp;#32;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Start&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;End&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&amp;amp;#126;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;End&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;CharacterRegion&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;CharacterRegions&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Asset&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;XnaContent&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;The C# Express IDE has native support for creating new .spritefont files, you just right-click the project and add one like you were adding a class file.  With VB.NET, it's pretty much just as easy.  There's no magic here, it's just an XML file.  You can bring in an existing .spritefont file from disk, or just make a new text document item in your project, paste in the above code, and rename the file so it has a .spritefont extension.  If you place it somewhere in your content folder, the VBContentManager understands to harvest .spritefont files and send them along to MSBuild.  Similar to Textures, SpriteFonts are processed by MSBuild and the result is stored onto the VBContentManager as a SpriteFont object in the Fonts hashtable.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Implementation with the VBContentManager&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Ok, so how do we use this "SpriteFont object" to get text onto the screen?  It's a lot like drawing a texture; the SpriteBatch has a Draw() method for drawing textures, and it has a DrawString() method for drawing text to the screen.  The DrawString() method accepts your SpriteFont object as a parameter (as well the text to render using the font, where to render it at, and what color to make it)&lt;br /&gt;&lt;br /&gt;&lt;!-- BEGIN &lt;br /&gt;--&gt;&lt;style type="text/css"&gt;k{color:#0000FF;}c{color:#008000;}t{color:#A31515;}n{}.o{border-left:solid 1px grey;border-top:solid 1px grey;font-family:Courier New;vertical-align:top;font-size:10pt;text-align:left;color:#000000;}&lt;/style&gt;&lt;div class="o" style="width:auto;height:auto;overflow-x:visible;overflow-y:visible;"&gt;&lt;br /&gt;&lt;n&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'Draws&amp;nbsp;"Hello&amp;nbsp;world!"&amp;nbsp;to&amp;nbsp;the&amp;nbsp;screen,&amp;nbsp;using&amp;nbsp;whatever&amp;nbsp;font&amp;nbsp;definition&amp;nbsp;is&amp;nbsp;found&amp;nbsp;in&lt;/c&gt;&lt;br /&gt;&lt;n&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'the&amp;nbsp;file&amp;nbsp;"test.spritefont"&amp;nbsp;from&amp;nbsp;the&amp;nbsp;content&amp;nbsp;folder.&amp;nbsp;&amp;nbsp;Draws&amp;nbsp;the&amp;nbsp;string&amp;nbsp;at&amp;nbsp;the&lt;/c&gt;&lt;br /&gt;&lt;n&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'upper-left&amp;nbsp;corner&amp;nbsp;of&amp;nbsp;the&amp;nbsp;screen&amp;nbsp;in&amp;nbsp;yellow.&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objSB.Begin()&lt;br /&gt;&lt;br /&gt;&lt;n&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objSB.DrawString(&lt;k&gt;Me&lt;/k&gt;.objCM.Fonts(&lt;t&gt;"test"&lt;/t&gt;),&amp;nbsp;&lt;t&gt;"Hello&amp;nbsp;world!"&lt;/t&gt;,&amp;nbsp;Vector2.Zero,&amp;nbsp;Color.Yellow)&lt;br /&gt;&lt;br /&gt;&lt;n&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objSB.End()&lt;br /&gt;&lt;/div&gt;&lt;!-- &lt;br /&gt;END --&gt;&lt;br /&gt;&lt;br /&gt;Without too much fuss, you'll just get the result you expect.&lt;br /&gt;&lt;br /&gt;SpriteFont objects feature the MeasureString() method, which you may be familiar with already as it appears elsewhere in .NET, outside of XNA.  MeasureString() is just a way to get the width and height of any string (but in a particular font and size), which can be handy for string-size related math (like centering text on the screen, for example).&lt;br /&gt;&lt;br /&gt;In the screenshot below, I've placed a sprite font file in my project's Content\Fonts folder called test.spritefont.  Test.spritefont specifies Arial at a size of 30.  In the main draw loop of the game, I retrieve the SpriteFont object from the game's VBContentManager.Fonts hashtable, and use it's MeasureString method (in conjunction with the BackBufferWidth and BackBufferHeight) to center the text on the screen when calling SpriteBatch.DrawString:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i97.photobucket.com/albums/l223/emachine74/helloworld.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;A few quick extras re: the creation of SpriteFont files:&lt;br /&gt;&lt;br /&gt;Mono-spaced fonts are not supported by Game Studio Express 1.0 (refresh) (the current version when I wrote this article). Last I heard, mono-spaced font support should make it into Game Studio 2.0.&lt;br /&gt;&lt;br /&gt;As an aside, it's probably a reasonable speculation to guess that, due to Game Studio 2.0's compatibility with Visual Studio, it may be possible to simply add a SpriteFont file directly to a VB.NET XNA project after GS 2.0 is released (rather than having to "make your own").  Either way, we would continue to rely on something like the VBContentManager to invoke the MSBuild process in order to get the .xnb file created for us.&lt;br /&gt;&lt;br /&gt;And finally, if you are interested in going beyond using the plain old fonts installed on your system, &lt;a href="http://blogs.msdn.com/shawnhar/archive/2007/04/26/bitmap-fonts-in-xna.aspx" target="_new"&gt;read this&lt;/a&gt;.  My VBContentManager doesn't support what's discussed there, but you could certainly perform a quick &amp; dirty modification along the lines of "if you find a texture in the fonts folder..." sort of thing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-4163670348735484410?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/4163670348735484410/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=4163670348735484410' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/4163670348735484410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/4163670348735484410'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2007/11/tutorial-8-text.html' title='VB.NET XNA Tutorial 8: Text'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-2178149561305377698</id><published>2007-11-16T21:42:00.000-08:00</published><updated>2008-06-20T03:05:08.602-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA 1.0'/><title type='text'>VB.NET XNA Tutorial 7: Sprites as Game Objects</title><content type='html'>&lt;font color="grey"&gt;[GSE 1.0 Refresh]&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Taking a second look at what was designed in Tutorial 6, Tutorial 7 explores how the Sprite class can be more than just a texture on the screen.  We'll create a Ship class that derives from Sprite, and end up with something that's more of a "game object" than a "sprite".&lt;br /&gt;&lt;br /&gt;This tutorial is only about 14 minutes and is pretty easy stuff; the main focus is basically re-usability of code via object-oriented design.  Creating reusable game objects is a concept that will lend itself to things like UI components and Screens and eventually game state management (in future tutorials).&lt;br /&gt;&lt;br /&gt;For now, here's &lt;a href="http://www.vimeo.com/389899" target="_new"&gt;Tutorial 7: Sprites as Game Objects&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-2178149561305377698?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/2178149561305377698/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=2178149561305377698' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/2178149561305377698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/2178149561305377698'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2007/11/tutorial-7-sprites-as-game-objects.html' title='VB.NET XNA Tutorial 7: Sprites as Game Objects'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-4613193298811724826</id><published>2007-11-15T20:16:00.000-08:00</published><updated>2008-06-20T03:05:08.604-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA 1.0'/><title type='text'>VB.NET XNA Tutorial 6: The PointAt method</title><content type='html'>&lt;font color="grey"&gt;[GSE 1.0 Refresh]&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;In the comments for tutorial 5.3, Matt asked a practical question about how to solve a real-world problem using all this matrix cascade stuff; if a ship sprite had a "child" gun turret, how could we get that gun turret to aim at some other sprite on the screen?&lt;br /&gt;&lt;br /&gt;Here's a method written to accomplish this task, called PointAt.  Accepting two sprites as arguments, it will rotate the first in order to point at the second.  This will cut through all the matrix clutter by turning that clutter around and using it to our advantage.&lt;br /&gt;&lt;br /&gt;&lt;!-- BEGIN &lt;br /&gt;--&gt;&lt;style type="text/css"&gt;k{color:#0000FF;}c{color:#008000;}t{color:#A31515;}n{}.o{border-left:solid 1px grey;border-top:solid 1px grey;font-family:Courier New;vertical-align:top;font-size:10pt;text-align:left;color:#000000;}&lt;/style&gt;&lt;div class="o" style="width:800px;height:auto;overflow-x:scroll;overflow-y:scroll;"&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;summary&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;Point&amp;nbsp;one&amp;nbsp;sprite's&amp;nbsp;origin&amp;nbsp;at&amp;nbsp;another&amp;nbsp;sprite's&amp;nbsp;origin&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;/summary&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;param&amp;nbsp;name="thePointer"&amp;gt;The&amp;nbsp;sprite&amp;nbsp;you&amp;nbsp;want&amp;nbsp;to&amp;nbsp;rotate&amp;lt;/param&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;param&amp;nbsp;name="theTarget"&amp;gt;The&amp;nbsp;sprite&amp;nbsp;you&amp;nbsp;want&amp;nbsp;thePointer&amp;nbsp;to&amp;nbsp;point&amp;nbsp;at&amp;lt;/param&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;remarks&amp;gt;&amp;lt;/remarks&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;PointAt(&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;thePointer&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Sprite,&amp;nbsp;&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;theTarget&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Sprite)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Dim&lt;/k&gt;&amp;nbsp;objTargetWorldPosition&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Vector2&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;If&lt;/k&gt;&amp;nbsp;theTarget.Parent&amp;nbsp;&lt;k&gt;IsNot&lt;/k&gt;&amp;nbsp;&lt;k&gt;Nothing&lt;/k&gt;&amp;nbsp;&lt;k&gt;Then&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;objTargetWorldPosition&amp;nbsp;=&amp;nbsp;Vector2.Transform(theTarget.Location,&amp;nbsp;theTarget.Parent.DrawMatrix)&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Else&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;objTargetWorldPosition&amp;nbsp;=&amp;nbsp;theTarget.Location&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;If&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;thePointer.Rotation&amp;nbsp;=&amp;nbsp;0&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;With&lt;/k&gt;&amp;nbsp;Vector2.Transform(objTargetWorldPosition,&amp;nbsp;Matrix.Invert(thePointer.DrawMatrix))&amp;nbsp;-&amp;nbsp;thePointer.Origin&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;thePointer.Rotation&amp;nbsp;=&amp;nbsp;(&lt;k&gt;CSng&lt;/k&gt;(Math.Atan2(.Y,&amp;nbsp;.X))&amp;nbsp;+&amp;nbsp;(Math.PI&amp;nbsp;/&amp;nbsp;2))&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;With&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;/div&gt;&lt;!-- &lt;br /&gt;END --&gt;&lt;br /&gt;It looks simple, doesn't it?  There's some new stuff in there (Matrix.Invert?) so I went ahead and made a video demonstrating what this "simple" method does, adding some slight difficulty for the PointAt method to overcome.  The PointAt method is nice because it doesn't really care what we throw at it.  It should be able to point any sprite at any other sprite, no matter where either sprite is or how far down any given matrix cascade either sprite happens to be.&lt;br /&gt;&lt;br /&gt;Here is the link to &lt;a href="http://www.vimeo.com/388577" target="_new"&gt;Tutorial 6: The PointAt method&lt;/a&gt; on Vimeo.&lt;br /&gt;&lt;br /&gt;In the video, the steps shown in Photoshop for inverting the matrix are oversimplified a little bit; in actuality, inverting the DrawMatrix of the cannon sprite would also involve un-doing the rotation of the PlayersShip (which would require a lot more steps to simulate in PhotoShop) but the net result is the same.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-4613193298811724826?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/4613193298811724826/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=4613193298811724826' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/4613193298811724826'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/4613193298811724826'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2007/11/tutorial-6-pointat-method.html' title='VB.NET XNA Tutorial 6: The PointAt method'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-7577389232192626888</id><published>2007-11-14T00:48:00.000-08:00</published><updated>2008-06-20T03:01:03.539-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA 1.0'/><title type='text'>VB.NET XNA Tutorial 5.3: The Parent/Child Matrix Cascade</title><content type='html'>&lt;font color="grey"&gt;[GSE 1.0 Refresh]&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;While tutorial 5.3 encodes (...it really takes forever), I'll write a little preface.  Things get a little "weird" in tutorial 5.3, so hopefully I'll be making sense.&lt;br /&gt;&lt;br /&gt;In the previous tutorial we saw how a sprite can use a matrix to position itself on the screen.  We drew kermit to the screen by supplying his matrix to the Begin method of the SpriteBatch, and then supplied his origin to the Draw method.  These two separate pieces of data (the matrix and the origin) passed to those two methods worked together to put kermit where we wanted on the screen, and make him rotate how we wanted about his origin.&lt;br /&gt;&lt;br /&gt;In tutorial 5.3, we're going merge origin information into the matrix, so that we no longer have our matrix and origin supplied as separate data pieces when we draw; we'll be able to pass a single matrix to Begin without supplying an origin value to Draw.  &lt;br /&gt;&lt;br /&gt;By incorporating the origin information into the matrix, the matrix becomes a more comprehensive/accurate/complete description of how to place a sprite on the screen.  In turn, we can use that matrix to transform other things in addition to the sprite itself (such as the sprite's children).&lt;br /&gt;&lt;br /&gt;So we're going to create a simple Parent/Child system, whereby each sprite has a reference to a parent sprite as well as a list of children sprites.  This will give us a way to organize groups of sprites together into logical objects, and at the same time it will give us a vehicle for the "matrix cascade".  Here's what a "matrix cascade" is designed to accomplish:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.vimeo.com/385839" target="_new"&gt;Dinner on a Plate&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Dinner on a Plate demonstrates the net result of what our engine can do after tutorial 5.3.  I thought it might be a good idea to get a clear picture of our goal, without which tutorial 5.3 can be, unfortunately, "a long trip through abstract city".&lt;br /&gt;&lt;br /&gt;As you can see in Dinner on a Plate, it's starting to become pretty easy to build a new application that, if nothing else, demonstrates how a mildly complicated positioning exercise can be greatly simplified.  In the video, a cookie and a piece of pizza are "put onto a dinner plate", and when the plate is rotated, the pizza and cookie behave as if they are intuitively attached to the plate.  There are no laws of physics at work here, the explanation is simply that, as children of the dinner plate, the cookie and the pizza are subject to the dinner plates matrix cascade. This means that every time the dinner plate "changes" (location, rotation, origin or (eventually) scale), the cookie and pizza slice are automatically incorporating the new dinner plate matrix into their own matrices when they draw.&lt;br /&gt;&lt;br /&gt;The "exciting" details can be found in &lt;a href="http://www.vimeo.com/385800" target="_new"&gt;Tutorial 5.3 - The Parent/Child Matrix Cascade&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-7577389232192626888?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/7577389232192626888/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=7577389232192626888' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/7577389232192626888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/7577389232192626888'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2007/11/tutorial-53-parentchild-matrix-cascade.html' title='VB.NET XNA Tutorial 5.3: The Parent/Child Matrix Cascade'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-1839725955693981222</id><published>2007-11-12T13:35:00.000-08:00</published><updated>2008-06-20T03:04:45.584-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Me'/><title type='text'>Next tutorials will appear this week</title><content type='html'>I don't have to work this week.  Ahh... it's so nice.&lt;br /&gt;&lt;br /&gt;So now I'm trying to figure out a performance issue since I've added shader effects to my 2D engine.  Right now I can script a 2-pass Gaussian blur effect on a per-sprite basis, but this causes the framerate to drop from 300-400fps, down to 18fps when the effect is activated.  This is not good :)  Figuring it out has my curiosity occupied for the time being.&lt;br /&gt;&lt;br /&gt;There will be new tutorial entries this week, continuing with building the sprite class and at some point, introducing the animation script engine.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-1839725955693981222?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/1839725955693981222/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=1839725955693981222' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/1839725955693981222'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/1839725955693981222'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2007/11/next-tutorials-will-appear-this-week.html' title='Next tutorials will appear this week'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-754104342742594319</id><published>2007-11-05T09:31:00.000-08:00</published><updated>2008-06-20T14:07:22.040-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA 1.0'/><title type='text'>VB.NET XNA Tutorial 5: Sprites</title><content type='html'>&lt;font color="grey"&gt;[GSE 1.0 Refresh]&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Before we get into Screens, ScreenManagers and scripting interfaces, we have to create a Sprite class.  It will be the base class that all of those things either inherit from, or are made to manipulate.&lt;br /&gt;&lt;br /&gt;I've split the Sprite tutorial into a series of videos, since as it turns out there's a bit to cover.  It's not too complicated, but since sprites are the heart &amp; soul of a 2D game, making the Sprite class is a pretty important step.&lt;br /&gt;&lt;br /&gt;In the 5.x series of videos below, we'll create a Sprite class from the ground up, and give it the ability to move around. Later on, we'll create Screen objects from this Sprite class, as well as hooking up a scripting interface that can move a Sprite or a Screen.  For now, here are the Sprite class tutorials:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.vimeo.com/369739" target="_new"&gt;Tutorial 5.0: A Sprite class&lt;/a&gt;&lt;br /&gt; The basics; adding the Sprite class to the 2D Engine project.  This one's pretty easy.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.vimeo.com/370803" target="_new"&gt;Tutorial 5.1: Implementing a transform matrix&lt;/a&gt;&lt;br /&gt;Incorporating a transform matrix into the Sprite class, and using it to put the sprite at various places on the screen.  Doesn't go into much detail regarding matrices.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.vimeo.com/371906" target="_new"&gt;Tutorial 5.2: Coordinate spaces, Origins, and Matrices&lt;/a&gt;&lt;br /&gt;I take a crack at explaining how transformation matrices, screen coordinates, and sprite origin all come together for the 2D sprite class.  Not necessarily specific to VB, I just think easy-to-follow, non-mathematical tutorials on this subject are in short supply so hopefully this one makes sense and helps someone out.  And hopefully I'm not making too many errors...&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://xnamachine.blogspot.com/2007/11/tutorial-53-parentchild-matrix-cascade.html"&gt;Tutorial 5.3: Creating a parent/child system&lt;/a&gt;&lt;br /&gt;This link takes you to a subsequent post dedicated to the subject.&lt;/ul&gt;That's about all I can muster for the weekend.  This sprite class gives us a very strong foundation upon which to grow and add some very cool features, so we're not done yet; more to come in the weeks ahead.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-754104342742594319?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/754104342742594319/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=754104342742594319' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/754104342742594319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/754104342742594319'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2007/11/tutorial-5-sprites.html' title='VB.NET XNA Tutorial 5: Sprites'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-1095291547328945945</id><published>2007-11-02T13:49:00.001-07:00</published><updated>2008-06-20T03:04:34.432-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Me'/><title type='text'>Working for the weekend</title><content type='html'>Well I'm trying to push a project to the "beta" milestone here at work, so I've been putting all my time into that.  I really want to get to the next tutorial because I've got some neat stuff I want to demonstrate.  I think I'm going to take some anti-burnout time away from work pretty soon as well, which will let me play with the XNA stuff.  Never the less, I should have time this weekend to put together tutorial 5.&lt;br /&gt;&lt;br /&gt;I have a 2D sprite scripting interface coming along that I'm just about ready to use in the next tutorail.  The scripting engine is lacking a couple features, but it's got more than enough functionality to demonstrate it as a system that works, so we'll step through building it from the ground up and learn how we can control sprite movement over time.  So far the scripting interface can perform movement along a linear vector, movement over a bezier curve, rotate, scale, change texture, change origin, change tint, and just recently I added the ability to repeat arbitrary subsets of script, allowing you to create animation loops from any of those features.  Later on down the road, it will be reasonably trivial to add just about anything, even post-processing effects like bloom or Gaussian blur (something I have in late stages development at the moment, but it's not quite ready).&lt;br /&gt;&lt;br /&gt;The scripting engine works in tandem with a parent/child sprite class that implements a "cascading matrix" scheme.  That means if you have a screen with a bunch of sprites on it, the screen is the "parent" and the sprites are the "children".  You can use the scripting engine to rotate just one individual child on the screen, or, you could rotate the entire screen which would effectively rotate all the sprites.  Like rotating a dinner plate, all the stuff on the plate goes along for the ride.  I'll show you how it all works in the next tutorial, it's not too complicated and it gives you enough flexibility to start doing meaningful stuff on the screen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-1095291547328945945?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/1095291547328945945/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=1095291547328945945' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/1095291547328945945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/1095291547328945945'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2007/11/working-for-weekend.html' title='Working for the weekend'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-6697639665451113354</id><published>2007-10-28T16:36:00.000-07:00</published><updated>2008-06-20T03:04:34.433-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Me'/><title type='text'>Coming up</title><content type='html'>Coming up in the next tutorial, we'll demonstrate a way you can organize the objects you want to see on the screen into a hierarchy of nested container objects (Sprites, Components and Screens).  We'll create a Screen Manager class that will allow us to easily switch from one Screen to another.  We'll also start animating things by having all of our objects implement a scripting interface.&lt;br /&gt;&lt;br /&gt;I've been working on real-world stuff for my job this week (and weekend) but I should have time to put together the next tutorial over the next week or so.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-6697639665451113354?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/6697639665451113354/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=6697639665451113354' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/6697639665451113354'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/6697639665451113354'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2007/10/coming-up.html' title='Coming up'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-2095092188664887679</id><published>2007-10-21T23:08:00.000-07:00</published><updated>2008-06-20T03:04:07.538-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='VB.NET Content Pipeline'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA 1.0'/><title type='text'>VB.NET XNA Tutorial 4: Starting an engine, and the VBContentManager</title><content type='html'>&lt;font color="grey"&gt;[GSE 1.0 Refresh]&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Here's the link to &lt;a href="http://vimeo.com/352095" target="_new"&gt;Tutorial 4: Starting an engine&lt;/a&gt; on Vimeo.  &lt;br /&gt;&lt;br /&gt;This tutorial is a little bit longer and a little bit more involved than the past tutorials.  We'll start down the road to separating game logic from game &lt;span style="font-style:italic;"&gt;logistics&lt;/span&gt; by creating a new project called XNA 2D Engine and moving the "MyGame" class into it.  We'll turn the MyGame into a base class to be used with the 2D engine.  &lt;br /&gt;&lt;br /&gt;We'll introduce the VBContentManager class, my implementation of a ContentManager extended with our "VB Content Pipeline hack" code (there's lots more on that, below).  We'll then go on to making a primitive sprite in Photoshop and drawing it to the screen with a SpriteBatch object.&lt;br /&gt;&lt;br /&gt;Here is some companion text to go with the video, that describes in detail some code I'll be importing but not spending a lot of time describing in the video:&lt;hr /&gt;&lt;br /&gt;In a standard C# XNA project, the default game class is created for you with a GraphicsDeviceManager and a ContentManager both instantiated and ready to go.  As we saw in Tutorial 3, it's fairly easily make our own class that inherits from the base XNA Game class, create our own GraphicsDeviceManager and quickly reproduce what the C# template generates automatically.&lt;br /&gt;&lt;br /&gt;What tutorial 3 did not touch on was the ContentManager, because for us VB'ers, the ContentManager is really the point where the lack of VB support in XNA requires us to do a little bit of legwork, so I held off on the subject until now.&lt;br /&gt;&lt;br /&gt;In C#, the ContentManager class loads cross-platform file types (like .xnb files) that MSBuild creates automatically from things like .png or .jpg files that get included in the C# project.  The primary issue when using a ContentManager with VB is getting these .xnb files created from our .png or .jpg files, because there is no automatic conversion process built into the IDE.&lt;br /&gt;&lt;br /&gt;My approach to solving this problem was to borrow largely what's been documented by Alan Phipps, and from that, create my own ContentManager class called the VBContentManager class.  Here's is the VBContentManager class, in it's entirety:&lt;br /&gt;&lt;br /&gt;&lt;!-- BEGIN &lt;br /&gt;--&gt;&lt;style type="text/css"&gt;k{color:#0000FF;}c{color:#008000;}t{color:#A31515;}n{}.o{border-left:solid 1px grey;border-top:solid 1px grey;font-family:Courier New;vertical-align:top;font-size:10pt;text-align:left;color:#000000;}&lt;/style&gt;&lt;div class="o" style="width:800px;height:800px;overflow-x:scroll;overflow-y:scroll;"&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Class&lt;/k&gt;&amp;nbsp;VBContentManager&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Inherits&lt;/k&gt;&amp;nbsp;ContentManager&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;Fonts&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Hashtable(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;SpriteFont)&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;Textures&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Hashtable(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;Texture2D)&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;SubTextures&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Hashtable(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;Hashtable(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;Rectangle))&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;Sounds&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Hashtable(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;SoundBank)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;strFakeCSharpProject&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;String&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;strContentRootFolder&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;String&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;strPipelineRootFolder&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;String&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;objContent&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;List(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;ContentFile)&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;intDupeSound,&amp;nbsp;intDupeTexture,&amp;nbsp;intDupeFont&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;&lt;k&gt;Integer&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Enum&lt;/k&gt;&amp;nbsp;ContentTypes&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;Textures&amp;nbsp;=&amp;nbsp;0&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;Fonts&amp;nbsp;=&amp;nbsp;1&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;Sounds&amp;nbsp;=&amp;nbsp;2&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Enum&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;&lt;k&gt;Enum&lt;/k&gt;&amp;nbsp;ImporterName&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;TextureImporter&amp;nbsp;=&amp;nbsp;0&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;FontDescriptionImporter&amp;nbsp;=&amp;nbsp;1&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;XactImporter&amp;nbsp;=&amp;nbsp;2&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Enum&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;&lt;k&gt;Enum&lt;/k&gt;&amp;nbsp;ProcessorName&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;SpriteTextureProcessor&amp;nbsp;=&amp;nbsp;0&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;FontDescriptionProcessor&amp;nbsp;=&amp;nbsp;1&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;XactProcessor&amp;nbsp;=&amp;nbsp;2&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Enum&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Structure&lt;/k&gt;&amp;nbsp;ContentFile&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;ContentType&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;ContentTypes&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;File&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;System.IO.FileInfo&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;Name&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;String&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;&lt;k&gt;New&lt;/k&gt;(&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;ContentType&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;ContentTypes,&amp;nbsp;&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;ContentFile&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;System.IO.FileInfo,&amp;nbsp;&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;Name&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;String)&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.ContentType&amp;nbsp;=&amp;nbsp;ContentType&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.File&amp;nbsp;=&amp;nbsp;ContentFile&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.Name&amp;nbsp;=&amp;nbsp;Name&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Structure&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;summary&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;Creates&amp;nbsp;a&amp;nbsp;new&amp;nbsp;ContentManager&amp;nbsp;which&amp;nbsp;has&amp;nbsp;been&amp;nbsp;extended&amp;nbsp;with&amp;nbsp;functionality&amp;nbsp;to&amp;nbsp;support&amp;nbsp;a&amp;nbsp;Visual&amp;nbsp;Basic&amp;nbsp;(or&amp;nbsp;other&amp;nbsp;non-C#)&amp;nbsp;project&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;/summary&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;param&amp;nbsp;name="ServiceProvider"&amp;gt;Your&amp;nbsp;game&amp;nbsp;has&amp;nbsp;a&amp;nbsp;.Services&amp;nbsp;property;&amp;nbsp;send&amp;nbsp;that&amp;nbsp;in&amp;nbsp;here.&amp;lt;/param&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;param&amp;nbsp;name="ContentRootFolder"&amp;gt;The&amp;nbsp;root&amp;nbsp;of&amp;nbsp;your&amp;nbsp;content&amp;nbsp;folder,&amp;nbsp;relative&amp;nbsp;to&amp;nbsp;your&amp;nbsp;projects&amp;nbsp;bin\Debug&amp;nbsp;folder.&amp;lt;/param&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;remarks&amp;gt;&amp;lt;/remarks&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;&lt;k&gt;New&lt;/k&gt;(&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;ServiceProvider&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;IServiceProvider,&amp;nbsp;&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;ContentRootFolder&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;String)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;MyBase&lt;/k&gt;.New(ServiceProvider)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.strContentRootFolder&amp;nbsp;=&amp;nbsp;ContentRootFolder&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.strPipelineRootFolder&amp;nbsp;=&amp;nbsp;ContentRootFolder.Replace(&lt;t&gt;"../"&lt;/t&gt;,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.Fonts&amp;nbsp;=&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;Hashtable(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;SpriteFont)&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.Textures&amp;nbsp;=&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;Hashtable(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;Texture2D)&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.SubTextures&amp;nbsp;=&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;Hashtable(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;Hashtable(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;Rectangle))&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.Sounds&amp;nbsp;=&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;Hashtable(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;SoundBank)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;summary&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;Load&amp;nbsp;all&amp;nbsp;assets&amp;nbsp;that&amp;nbsp;have&amp;nbsp;been&amp;nbsp;compiled&amp;nbsp;by&amp;nbsp;a&amp;nbsp;VBContentManager.&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;/summary&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;param&amp;nbsp;name="Compile"&amp;gt;Whether&amp;nbsp;or&amp;nbsp;not&amp;nbsp;to&amp;nbsp;have&amp;nbsp;MSBuild&amp;nbsp;compile&amp;nbsp;your&amp;nbsp;game&amp;nbsp;content&amp;nbsp;before&amp;nbsp;attempting&amp;nbsp;to&amp;nbsp;load&amp;nbsp;it&amp;lt;/param&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;remarks&amp;gt;&amp;lt;/remarks&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;LoadPipeline(&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;Compile&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;&lt;k&gt;Boolean&lt;/k&gt;)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;If&lt;/k&gt;&amp;nbsp;Compile&amp;nbsp;&lt;k&gt;Then&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.CompileContent()&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;If&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;For&lt;/k&gt;&amp;nbsp;&lt;k&gt;Each&lt;/k&gt;&amp;nbsp;obj&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;ContentFile&amp;nbsp;&lt;k&gt;In&lt;/k&gt;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.objContent&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Try&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Select&lt;/k&gt;&amp;nbsp;&lt;k&gt;Case&lt;/k&gt;&amp;nbsp;obj.ContentType&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'The&amp;nbsp;pipeline&amp;nbsp;will&amp;nbsp;be&amp;nbsp;compiled&amp;nbsp;into&amp;nbsp;either&amp;nbsp;debug&amp;nbsp;or&amp;nbsp;release,&amp;nbsp;depending&amp;nbsp;upon&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'which&amp;nbsp;option&amp;nbsp;is&amp;nbsp;chosen&amp;nbsp;in&amp;nbsp;the&amp;nbsp;IDE.&amp;nbsp;&amp;nbsp;We&amp;nbsp;don't&amp;nbsp;want&amp;nbsp;to&amp;nbsp;use&amp;nbsp;the&amp;nbsp;My&amp;nbsp;namespace&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'though,&amp;nbsp;because&amp;nbsp;it&amp;nbsp;does&amp;nbsp;not&amp;nbsp;work&amp;nbsp;with&amp;nbsp;the&amp;nbsp;xbox&amp;nbsp;360.&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Case&lt;/k&gt;&amp;nbsp;ContentTypes.Fonts&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;With&lt;/k&gt;&amp;nbsp;obj.File.FullName.ToLower&lt;br /&gt;&lt;n style="padding-left:216px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.Fonts.Add(obj.Name,&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.Load(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;SpriteFont)(.Substring(.LastIndexOf(&lt;t&gt;"\"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.strPipelineRootFolder.ToLower)&amp;nbsp;+&amp;nbsp;1).Replace(obj.File.Extension.ToLower,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;With&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Case&lt;/k&gt;&amp;nbsp;ContentTypes.Sounds&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;With&lt;/k&gt;&amp;nbsp;obj.File.FullName.ToLower&lt;br /&gt;&lt;n style="padding-left:216px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.Sounds.Add(obj.Name,&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.Load(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;SoundBank)(.Substring(.LastIndexOf(&lt;t&gt;"\"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.strPipelineRootFolder.ToLower)&amp;nbsp;+&amp;nbsp;1).Replace(obj.File.Extension.ToLower,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;With&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Case&lt;/k&gt;&amp;nbsp;ContentTypes.Textures&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;With&lt;/k&gt;&amp;nbsp;obj.File.FullName.ToLower&lt;br /&gt;&lt;n style="padding-left:216px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.Textures.Add(obj.Name,&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.Load(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;Texture2D)(.Substring(.LastIndexOf(&lt;t&gt;"\"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.strPipelineRootFolder.ToLower)&amp;nbsp;+&amp;nbsp;1).Replace(obj.File.Extension.ToLower,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;With&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Select&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Catch&lt;/k&gt;&amp;nbsp;ex&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Exception&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'msgBox("While&amp;nbsp;loading&amp;nbsp;the&amp;nbsp;pipeline,&amp;nbsp;a&amp;nbsp;piece&amp;nbsp;of&amp;nbsp;content&amp;nbsp;called&amp;nbsp;"&amp;nbsp;&amp;&amp;nbsp;obj.Name&amp;nbsp;&amp;&amp;nbsp;"&amp;nbsp;could&amp;nbsp;not&amp;nbsp;be&amp;nbsp;found,&amp;nbsp;and&amp;nbsp;was&amp;nbsp;skipped")&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'A&amp;nbsp;new&amp;nbsp;piece&amp;nbsp;of&amp;nbsp;content&amp;nbsp;has&amp;nbsp;been&amp;nbsp;added,&amp;nbsp;but&amp;nbsp;the&amp;nbsp;programmer&amp;nbsp;failed&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'to&amp;nbsp;instruct&amp;nbsp;the&amp;nbsp;VBContentPipeline&amp;nbsp;to&amp;nbsp;compile&amp;nbsp;it.&amp;nbsp;&amp;nbsp;So&amp;nbsp;the&amp;nbsp;content&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'will&amp;nbsp;not&amp;nbsp;be&amp;nbsp;available&amp;nbsp;during&amp;nbsp;this&amp;nbsp;instance&amp;nbsp;of&amp;nbsp;the&amp;nbsp;Game.&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Try&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Next&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;CompileContent()&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Dim&lt;/k&gt;&amp;nbsp;objProcess&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Process&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objContent&amp;nbsp;=&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;List(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;ContentFile)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.HarvestContent()&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;If&lt;/k&gt;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.objContent.Count&amp;nbsp;&gt;&amp;nbsp;0&amp;nbsp;&lt;k&gt;Then&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.StartTheFakeCSharpFile()&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.AddContentToTheFakeCSharpFile()&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.EndTheFakeCSharpFile()&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Try&lt;/k&gt;&amp;nbsp;'to&amp;nbsp;write&amp;nbsp;the&amp;nbsp;fake&amp;nbsp;C#&amp;nbsp;project&amp;nbsp;file&amp;nbsp;to&amp;nbsp;disk&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Using&lt;/k&gt;&amp;nbsp;TempStreamWriter&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;System.IO.StreamWriter&amp;nbsp;=&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;System.IO.StreamWriter(&lt;k&gt;Me&lt;/k&gt;.strContentRootFolder&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"\VBContentPipeline.csproj"&lt;/t&gt;,&amp;nbsp;&lt;k&gt;False&lt;/k&gt;)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;With&lt;/k&gt;&amp;nbsp;TempStreamWriter&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;.Write(&lt;k&gt;Me&lt;/k&gt;.strFakeCSharpProject)&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;.Close()&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;With&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Using&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Try&lt;/k&gt;&amp;nbsp;'to&amp;nbsp;shell&amp;nbsp;out&amp;nbsp;to&amp;nbsp;MSBuild.exe,&amp;nbsp;sending&amp;nbsp;it&amp;nbsp;our&amp;nbsp;fake&amp;nbsp;c#&amp;nbsp;project&amp;nbsp;file&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;objProcess&amp;nbsp;=&amp;nbsp;System.Diagnostics.Process.Start(&lt;t&gt;""&lt;/t&gt;&lt;t&gt;""&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;Environment.GetEnvironmentVariable(&lt;t&gt;"Windir"&lt;/t&gt;)&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;t&gt;"\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe"&lt;/t&gt;&lt;t&gt;""&lt;/t&gt;,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;&lt;t&gt;""&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.strContentRootFolder&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;t&gt;"\VBContentPipeline.csproj"&lt;/t&gt;&lt;t&gt;"&amp;nbsp;/verbosity:d&amp;nbsp;/l:FileLogger,Microsoft.Build.Engine;logfile="&lt;/t&gt;&lt;t&gt;""&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.strContentRootFolder&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"\VBPipelineBuild.log"&lt;/t&gt;&lt;t&gt;""&lt;/t&gt;)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'wait&amp;nbsp;for&amp;nbsp;that&amp;nbsp;to&amp;nbsp;finish&lt;/c&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;While&lt;/k&gt;&amp;nbsp;&lt;k&gt;Not&lt;/k&gt;&amp;nbsp;objProcess.HasExited&lt;br /&gt;&lt;n style="padding-left:184px;"&gt;&amp;nbsp;&lt;/n&gt;Threading.Thread.Sleep(100)&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;While&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Catch&lt;/k&gt;&amp;nbsp;ex&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Exception&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:152px;"&gt;&amp;nbsp;&lt;/n&gt;MsgBox(&lt;t&gt;"When&amp;nbsp;building&amp;nbsp;the&amp;nbsp;pipeline&amp;nbsp;and&amp;nbsp;trying&amp;nbsp;to&amp;nbsp;run&amp;nbsp;MSBuild.exe,&amp;nbsp;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;ex.Message)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Try&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Catch&lt;/k&gt;&amp;nbsp;ex&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Exception&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;MsgBox(&lt;t&gt;"When&amp;nbsp;building&amp;nbsp;the&amp;nbsp;pipeline&amp;nbsp;and&amp;nbsp;trying&amp;nbsp;to&amp;nbsp;create&amp;nbsp;the&amp;nbsp;fake&amp;nbsp;C#&amp;nbsp;file&amp;nbsp;"&lt;/t&gt;&lt;t&gt;""&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.strContentRootFolder&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"\VBContentPipeline.csproj"&lt;/t&gt;&lt;t&gt;",&amp;nbsp;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;ex.Message)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Try&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;If&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;HarvestContent()&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Dim&lt;/k&gt;&amp;nbsp;objRoot&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;System.IO.DirectoryInfo&amp;nbsp;=&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;System.IO.DirectoryInfo(&lt;k&gt;Me&lt;/k&gt;.strContentRootFolder)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;For&lt;/k&gt;&amp;nbsp;&lt;k&gt;Each&lt;/k&gt;&amp;nbsp;sound&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;System.IO.FileInfo&amp;nbsp;&lt;k&gt;In&lt;/k&gt;&amp;nbsp;objRoot.GetFiles(&lt;t&gt;"*.xab"&lt;/t&gt;,&amp;nbsp;IO.SearchOption.AllDirectories)&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;If&lt;/k&gt;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.objContent.Contains(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Sounds,&amp;nbsp;sound,&amp;nbsp;sound.Name.Replace(sound.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&amp;nbsp;&lt;k&gt;Then&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.intDupeSound&amp;nbsp;+=&amp;nbsp;1&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objContent.Add(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Sounds,&amp;nbsp;sound,&amp;nbsp;sound.Name.Replace(sound.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)&amp;nbsp;&amp;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.intDupeSound.ToString))&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Else&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objContent.Add(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Sounds,&amp;nbsp;sound,&amp;nbsp;sound.Name.Replace(sound.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;If&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Next&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;For&lt;/k&gt;&amp;nbsp;&lt;k&gt;Each&lt;/k&gt;&amp;nbsp;texture&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;System.IO.FileInfo&amp;nbsp;&lt;k&gt;In&lt;/k&gt;&amp;nbsp;objRoot.GetFiles(&lt;t&gt;"*.png"&lt;/t&gt;,&amp;nbsp;IO.SearchOption.AllDirectories)&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;If&lt;/k&gt;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.objContent.Contains(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Textures,&amp;nbsp;texture,&amp;nbsp;texture.Name.Replace(texture.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&amp;nbsp;&lt;k&gt;Then&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.intDupeTexture&amp;nbsp;+=&amp;nbsp;1&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objContent.Add(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Textures,&amp;nbsp;texture,&amp;nbsp;texture.Name.Replace(texture.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)&amp;nbsp;&amp;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.intDupeSound.ToString))&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Else&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objContent.Add(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Textures,&amp;nbsp;texture,&amp;nbsp;texture.Name.Replace(texture.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;If&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Next&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;For&lt;/k&gt;&amp;nbsp;&lt;k&gt;Each&lt;/k&gt;&amp;nbsp;texture&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;System.IO.FileInfo&amp;nbsp;&lt;k&gt;In&lt;/k&gt;&amp;nbsp;objRoot.GetFiles(&lt;t&gt;"*.jpg"&lt;/t&gt;,&amp;nbsp;IO.SearchOption.AllDirectories)&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;If&lt;/k&gt;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.objContent.Contains(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Textures,&amp;nbsp;texture,&amp;nbsp;texture.Name.Replace(texture.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&amp;nbsp;&lt;k&gt;Then&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.intDupeTexture&amp;nbsp;+=&amp;nbsp;1&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objContent.Add(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Textures,&amp;nbsp;texture,&amp;nbsp;texture.Name.Replace(texture.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)&amp;nbsp;&amp;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.intDupeSound.ToString))&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Else&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objContent.Add(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Textures,&amp;nbsp;texture,&amp;nbsp;texture.Name.Replace(texture.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;If&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Next&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;For&lt;/k&gt;&amp;nbsp;&lt;k&gt;Each&lt;/k&gt;&amp;nbsp;texture&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;System.IO.FileInfo&amp;nbsp;&lt;k&gt;In&lt;/k&gt;&amp;nbsp;objRoot.GetFiles(&lt;t&gt;"*.gif"&lt;/t&gt;,&amp;nbsp;IO.SearchOption.AllDirectories)&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;If&lt;/k&gt;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.objContent.Contains(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Textures,&amp;nbsp;texture,&amp;nbsp;texture.Name.Replace(texture.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&amp;nbsp;&lt;k&gt;Then&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.intDupeTexture&amp;nbsp;+=&amp;nbsp;1&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objContent.Add(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Textures,&amp;nbsp;texture,&amp;nbsp;texture.Name.Replace(texture.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)&amp;nbsp;&amp;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.intDupeSound.ToString))&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Else&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objContent.Add(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Textures,&amp;nbsp;texture,&amp;nbsp;texture.Name.Replace(texture.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;If&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Next&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;For&lt;/k&gt;&amp;nbsp;&lt;k&gt;Each&lt;/k&gt;&amp;nbsp;font&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;System.IO.FileInfo&amp;nbsp;&lt;k&gt;In&lt;/k&gt;&amp;nbsp;objRoot.GetFiles(&lt;t&gt;"*.spritefont"&lt;/t&gt;,&amp;nbsp;IO.SearchOption.AllDirectories)&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;If&lt;/k&gt;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.objContent.Contains(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Fonts,&amp;nbsp;font,&amp;nbsp;font.Name.Replace(font.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&amp;nbsp;&lt;k&gt;Then&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.intDupeFont&amp;nbsp;+=&amp;nbsp;1&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objContent.Add(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Fonts,&amp;nbsp;font,&amp;nbsp;font.Name.Replace(font.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)&amp;nbsp;&amp;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.intDupeSound.ToString))&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Else&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objContent.Add(&lt;k&gt;New&lt;/k&gt;&amp;nbsp;ContentFile(ContentTypes.Fonts,&amp;nbsp;font,&amp;nbsp;font.Name.Replace(font.Extension,&amp;nbsp;&lt;t&gt;""&lt;/t&gt;)))&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;If&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Next&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;StartTheFakeCSharpFile()&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.strFakeCSharpProject&amp;nbsp;=&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;t&gt;"&amp;lt;Project&amp;nbsp;DefaultTargets="&lt;/t&gt;&lt;t&gt;"Build"&lt;/t&gt;&lt;t&gt;"&amp;nbsp;xmlns="&lt;/t&gt;&lt;t&gt;"http://schemas.microsoft.com/developer/msbuild/2003"&lt;/t&gt;&lt;t&gt;"&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;t&gt;"&amp;lt;PropertyGroup&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;t&gt;"&amp;lt;Configuration&amp;nbsp;Condition="&lt;/t&gt;&lt;t&gt;"&amp;nbsp;'$(Configuration)'&amp;nbsp;==&amp;nbsp;''&amp;nbsp;"&lt;/t&gt;&lt;t&gt;"&amp;gt;Debug&amp;lt;/Configuration&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;t&gt;"&amp;lt;Platform&amp;nbsp;Condition="&lt;/t&gt;&lt;t&gt;"&amp;nbsp;'$(Platform)'&amp;nbsp;==&amp;nbsp;''&amp;nbsp;"&lt;/t&gt;&lt;t&gt;"&amp;gt;x86&amp;lt;/Platform&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;t&gt;"&amp;lt;OutputType&amp;gt;WinExe&amp;lt;/OutputType&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;t&gt;"&amp;lt;AppDesignerFolder&amp;gt;Properties&amp;lt;/AppDesignerFolder&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;t&gt;"&amp;lt;AssemblyName&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;My.Application.Info.AssemblyName&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;/AssemblyName&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;t&gt;"&amp;lt;XnaPlatform&amp;gt;Windows&amp;lt;/XnaPlatform&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;t&gt;"&amp;lt;XnaFrameworkVersion&amp;gt;v1.0&amp;lt;/XnaFrameworkVersion&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;t&gt;"&amp;lt;XNAGlobalContentPipelineAssemblies&amp;gt;Microsoft.Xna.Framework.Content.Pipeline.EffectImporter.dll;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;t&gt;"Microsoft.Xna.Framework.Content."&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;t&gt;"Pipeline.FBXImporter.dll;Microsoft.Xna.Framework.Content.Pipeline.TextureImporter.dll;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;t&gt;"Microsoft.Xna.Framework.Content.Pipeline.XImporter.dll&amp;lt;/XNAGlobalContentPipelineAssemblies&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;t&gt;"&amp;lt;/PropertyGroup&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;t&gt;"&amp;lt;PropertyGroup&amp;nbsp;Condition="&lt;/t&gt;&lt;t&gt;"&amp;nbsp;'$(Configuration)|$(Platform)'&amp;nbsp;==&amp;nbsp;'Debug|x86'&amp;nbsp;"&lt;/t&gt;&lt;t&gt;"&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;t&gt;"&amp;lt;OutputPath&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;My.Application.Info.DirectoryPath&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"\"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.strPipelineRootFolder&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;/OutputPath&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;t&gt;"&amp;lt;/PropertyGroup&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;t&gt;"&amp;lt;ItemGroup&amp;gt;"&lt;/t&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;AddContentToTheFakeCSharpFile()&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;For&lt;/k&gt;&amp;nbsp;&lt;k&gt;Each&lt;/k&gt;&amp;nbsp;content&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;ContentFile&amp;nbsp;&lt;k&gt;In&lt;/k&gt;&amp;nbsp;&lt;k&gt;Me&lt;/k&gt;.objContent&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.strFakeCSharpProject&amp;nbsp;&amp;=&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;t&gt;"&amp;lt;Content&amp;nbsp;Include="&lt;/t&gt;&lt;t&gt;""&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;content.File.FullName&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;""&lt;/t&gt;&lt;t&gt;"&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;t&gt;"&amp;lt;XNAUseContentPipeline&amp;gt;true&amp;lt;/XNAUseContentPipeline&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;t&gt;"&amp;lt;Importer&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;&lt;k&gt;CType&lt;/k&gt;(content.ContentType,&amp;nbsp;ImporterName).ToString&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;/Importer&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;t&gt;"&amp;lt;Processor&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;&lt;k&gt;CType&lt;/k&gt;(content.ContentType,&amp;nbsp;ProcessorName).ToString&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;/Processor&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;t&gt;"&amp;lt;Name&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;content.Name&amp;nbsp;&amp;&amp;nbsp;&lt;t&gt;"&amp;lt;/Name&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:120px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;t&gt;"&amp;lt;/Content&amp;gt;"&lt;/t&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Next&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Private&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;EndTheFakeCSharpFile()&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.strFakeCSharpProject&amp;nbsp;&amp;=&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;t&gt;"&amp;lt;/ItemGroup&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;t&gt;"&amp;lt;Import&amp;nbsp;Project="&lt;/t&gt;&lt;t&gt;"$(MSBuildBinPath)\Microsoft.CSharp.targets"&lt;/t&gt;&lt;t&gt;"&amp;nbsp;/&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;t&gt;"&amp;lt;Import&amp;nbsp;Project="&lt;/t&gt;&lt;t&gt;"$(MSBuildExtensionsPath)\Microsoft\XNA\Game&amp;nbsp;Studio&amp;nbsp;Express\v1.0\Microsoft.Xna.ContentPipeline.targets"&lt;/t&gt;&lt;t&gt;"&amp;nbsp;/&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;t&gt;"&amp;lt;Import&amp;nbsp;Project="&lt;/t&gt;&lt;t&gt;"$(MSBuildExtensionsPath)\Microsoft\XNA\Game&amp;nbsp;Studio&amp;nbsp;Express\v1.0\Microsoft.Xna.Common.targets"&lt;/t&gt;&lt;t&gt;"&amp;nbsp;/&amp;gt;"&lt;/t&gt;&amp;nbsp;&amp;&amp;nbsp;vbCrLf&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;t&gt;"&amp;lt;/Project&amp;gt;"&lt;/t&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Class&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;!-- &lt;br /&gt;END --&gt;&lt;br /&gt;In a nutshell, the VBContentManager class uses a supplied directory as a root folder which it scans for content (texture files, XACT sound projects, and spritefonts) in the HarvestContent method.  It also has the ability to produce a C# project file that includes information about the harvested content, which it can pass to MSBuild in order to have the corresponding .xnb (et al) files created on your behalf.&lt;br /&gt;&lt;br /&gt;To use the VBContentManager class, all you have to do is call the LoadPipeline method in your game's LoadGraphicsContent sub, indicating whether or not the content is already compiled (false) or whether you want to execute the C# hack process (true).&lt;br /&gt;&lt;br /&gt;The last thing the LoadPipeline method does for you is it uses the Load method of the underlying ContentManager to import the texture, sound and font files into corresponding typed hash tables, which reside as public members of the VBContentManager.  The resources are keyed by filename (no extension) in the respective hash table.&lt;br /&gt;&lt;br /&gt;Here is an example of a simple base game class that makes use of the VBContentManager class (you can also watch the video tutorial to see this class being used by a game project).&lt;br /&gt;&lt;br /&gt;&lt;!-- BEGIN &lt;br /&gt;--&gt;&lt;style type="text/css"&gt;k{color:#0000FF;}c{color:#008000;}t{color:#A31515;}n{}.o{border-left:solid 1px grey;border-top:solid 1px grey;font-family:Courier New;vertical-align:top;font-size:10pt;text-align:left;color:#000000;}&lt;/style&gt;&lt;div class="o" style="width:800px;height:auto;overflow-x:scroll;overflow-y:scroll;"&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Class&lt;/k&gt;&amp;nbsp;MyBaseGame&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Inherits&lt;/k&gt;&amp;nbsp;Game&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Protected&lt;/k&gt;&amp;nbsp;objGDM&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;GraphicsDeviceManager&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Protected&lt;/k&gt;&amp;nbsp;objCM&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;VBContentManager&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Protected&lt;/k&gt;&amp;nbsp;objSB&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;SpriteBatch&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;summary&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;Starts&amp;nbsp;a&amp;nbsp;new&amp;nbsp;game&amp;nbsp;for&amp;nbsp;the&amp;nbsp;XNA&amp;nbsp;2D&amp;nbsp;Engine&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;/summary&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;param&amp;nbsp;name="WindowTitle"&amp;gt;The&amp;nbsp;window&amp;nbsp;title&amp;nbsp;when&amp;nbsp;the&amp;nbsp;game&amp;nbsp;is&amp;nbsp;not&amp;nbsp;full-screen&amp;lt;/param&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;param&amp;nbsp;name="MouseIsVisible"&amp;gt;Whether&amp;nbsp;or&amp;nbsp;not&amp;nbsp;the&amp;nbsp;mouse&amp;nbsp;is&amp;nbsp;visible&amp;nbsp;by&amp;nbsp;default&amp;lt;/param&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;param&amp;nbsp;name="ContentRootFolder"&amp;gt;The&amp;nbsp;root&amp;nbsp;of&amp;nbsp;your&amp;nbsp;content&amp;nbsp;folder,&amp;nbsp;relative&amp;nbsp;to&amp;nbsp;your&amp;nbsp;projects&amp;nbsp;bin\debug&amp;nbsp;(or&amp;nbsp;release)&amp;nbsp;folder&amp;lt;/param&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;c&gt;'''&amp;nbsp;&amp;lt;remarks&amp;gt;&amp;lt;/remarks&amp;gt;&lt;/c&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;&lt;k&gt;New&lt;/k&gt;(&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;WindowTitle&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;String,&amp;nbsp;&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;MouseIsVisible&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;&lt;k&gt;Boolean&lt;/k&gt;,&amp;nbsp;&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;ContentRootFolder&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;String)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objGDM&amp;nbsp;=&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;GraphicsDeviceManager(&lt;k&gt;Me&lt;/k&gt;)&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objCM&amp;nbsp;=&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;VBContentManager(&lt;k&gt;Me&lt;/k&gt;.Services,&amp;nbsp;ContentRootFolder)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.Window.Title&amp;nbsp;=&amp;nbsp;WindowTitle&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.IsMouseVisible&amp;nbsp;=&amp;nbsp;MouseIsVisible&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Protected&lt;/k&gt;&amp;nbsp;&lt;k&gt;Overrides&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;LoadGraphicsContent(&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;loadAllContent&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;&lt;k&gt;Boolean&lt;/k&gt;)&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;MyBase&lt;/k&gt;.LoadGraphicsContent(loadAllContent)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objCM.LoadPipeline(&lt;k&gt;True&lt;/k&gt;)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Protected&lt;/k&gt;&amp;nbsp;&lt;k&gt;Overrides&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;Initialize()&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;MyBase&lt;/k&gt;.Initialize()&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Me&lt;/k&gt;.objSB&amp;nbsp;=&amp;nbsp;&lt;k&gt;New&lt;/k&gt;&amp;nbsp;SpriteBatch(&lt;k&gt;Me&lt;/k&gt;.objGDM.GraphicsDevice)&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Class&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;!-- &lt;br /&gt;END --&gt;&lt;br /&gt;&lt;br /&gt;Here is a game that inherits from the above base game class. The root content folder for this game is a peer folder of the project's bin folder.  Once you've got all the other stuff sitting in an engine somewhere, this is essentially all you need to do to spawn a new game with a vb content manager, effectively simulating VB support for XNA.&lt;br /&gt;&lt;br /&gt;&lt;!-- BEGIN &lt;br /&gt;--&gt;&lt;style type="text/css"&gt;k{color:#0000FF;}c{color:#008000;}t{color:#A31515;}n{}.o{border-left:solid 1px grey;border-top:solid 1px grey;font-family:Courier New;vertical-align:top;font-size:10pt;text-align:left;color:#000000;}&lt;/style&gt;&lt;div class="o" style="width:auto;height:auto;overflow-x:visible;overflow-y:visible;"&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Class&lt;/k&gt;&amp;nbsp;XNAGameForWindows&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Inherits&lt;/k&gt;&amp;nbsp;MyBaseGame&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;&lt;k&gt;New&lt;/k&gt;()&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;MyBase&lt;/k&gt;.New(&lt;t&gt;"XNA&amp;nbsp;Game&amp;nbsp;for&amp;nbsp;Windows"&lt;/t&gt;,&amp;nbsp;&lt;k&gt;True&lt;/k&gt;,&amp;nbsp;&lt;t&gt;"../../Content"&lt;/t&gt;)&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Class&lt;/k&gt;&lt;br /&gt;&lt;/div&gt;&lt;!-- &lt;br /&gt;END --&gt;&lt;br /&gt;&lt;br /&gt;And here's the typed hash table.  I wouldn't grab textures &amp; the like out of a hash tables directly from a draw routine, but at the top of your program you can pull them out into discrete references or put them into lists, or whatever.  The VBContentManager just makes them available in the hash in a way that's easy for humans to find them (ie. by file name), and you can do whatever you want with them from there.&lt;br /&gt;&lt;br /&gt;&lt;!-- BEGIN &lt;br /&gt;--&gt;&lt;style type="text/css"&gt;k{color:#0000FF;}c{color:#008000;}t{color:#A31515;}n{}.o{border-left:solid 1px grey;border-top:solid 1px grey;font-family:Courier New;vertical-align:top;font-size:10pt;text-align:left;color:#000000;}&lt;/style&gt;&lt;div class="o" style="width:auto;height:auto;overflow-x:visible;overflow-y:visible;"&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Class&lt;/k&gt;&amp;nbsp;Hashtable(&lt;k&gt;Of&lt;/k&gt;&amp;nbsp;Type)&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Inherits&lt;/k&gt;&amp;nbsp;DictionaryBase&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;ReadOnly&lt;/k&gt;&amp;nbsp;&lt;k&gt;Property&lt;/k&gt;&amp;nbsp;Keys()&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;ICollection&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Get&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Return&lt;/k&gt;&amp;nbsp;&lt;k&gt;MyBase&lt;/k&gt;.Dictionary.Keys&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Get&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Property&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Default&lt;/k&gt;&amp;nbsp;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Property&lt;/k&gt;&amp;nbsp;Item(&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;key&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;String)&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Type&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Get&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Return&lt;/k&gt;&amp;nbsp;&lt;k&gt;CType&lt;/k&gt;(&lt;k&gt;MyBase&lt;/k&gt;.Dictionary(key),&amp;nbsp;Type)&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Get&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Set&lt;/k&gt;(&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;value&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Type)&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;MyBase&lt;/k&gt;.Dictionary(key)&amp;nbsp;=&amp;nbsp;value&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Set&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Property&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Overloads&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;Add(&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;key&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;String,&amp;nbsp;&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;obj&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;Type)&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;MyBase&lt;/k&gt;.Dictionary.Add(key,&amp;nbsp;obj)&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;ReadOnly&lt;/k&gt;&amp;nbsp;&lt;k&gt;Property&lt;/k&gt;&amp;nbsp;Values()&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;ICollection&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Get&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:88px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Return&lt;/k&gt;&amp;nbsp;Dictionary.Values&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Get&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Property&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Function&lt;/k&gt;&amp;nbsp;Contains(&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;key&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;String)&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;&lt;k&gt;Boolean&lt;/k&gt;&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Return&lt;/k&gt;&amp;nbsp;Dictionary.Contains(key)&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Function&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;Public&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&amp;nbsp;Remove(&lt;k&gt;ByVal&lt;/k&gt;&amp;nbsp;key&amp;nbsp;&lt;k&gt;As&lt;/k&gt;&amp;nbsp;String)&lt;br /&gt;&lt;n style="padding-left:56px;"&gt;&amp;nbsp;&lt;/n&gt;Dictionary.Remove(key)&lt;br /&gt;&lt;n style="padding-left:24px;"&gt;&amp;nbsp;&lt;/n&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Sub&lt;/k&gt;&lt;br /&gt;&lt;br /&gt;&lt;k&gt;End&lt;/k&gt;&amp;nbsp;&lt;k&gt;Class&lt;/k&gt;&lt;br /&gt;&lt;/div&gt;&lt;!-- &lt;br /&gt;END --&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-2095092188664887679?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/2095092188664887679/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=2095092188664887679' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/2095092188664887679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/2095092188664887679'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2007/10/tutorial-4-vbcontentmanager.html' title='VB.NET XNA Tutorial 4: Starting an engine, and the VBContentManager'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-2516334428152231343</id><published>2007-10-17T14:58:00.001-07:00</published><updated>2008-06-20T03:04:07.539-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA 1.0'/><title type='text'>VB.NET XNA Tutorial 3: Creating a Game class</title><content type='html'>&lt;font color="grey"&gt;[GSE 1.0 Refresh]&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;There is now a &lt;a href="http://xnamachine.blogspot.com/2007/11/vbnet-xna-windows-game-project-template.html"&gt;Visual Studio template for starting a VB.NET XNA Windows Game project&lt;/a&gt;.  This template automates the steps shown in the video.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;First, read this!&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Video tutorials are now hosted at Vimeo in &lt;span style="font-weight:bold;"&gt;High Definition&lt;/span&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Be sure to watch them in Full mode&lt;/li&gt;&lt;br /&gt;&lt;li&gt;If your video quality goes all wacky, look in the lower right for a Scaling button and turn Scaling &lt;span style="font-weight:bold;"&gt;off&lt;/span&gt; (this will make life easier on the player and allow the quality to go back up)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;You can't embed HD vids from Vimeo to your website, otherwise I would!&lt;/li&gt;&lt;/ul&gt;Ok, that's it.  Here's the link to &lt;a href="http://www.vimeo.com/344620" target="_new"&gt;Tutorial 3: Creating a Game class&lt;/a&gt; on Vimeo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-2516334428152231343?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/2516334428152231343/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=2516334428152231343' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/2516334428152231343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/2516334428152231343'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2007/10/tutorial-3-creating-game-class.html' title='VB.NET XNA Tutorial 3: Creating a Game class'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-4224380997746117856</id><published>2007-10-15T12:18:00.000-07:00</published><updated>2008-06-20T03:03:40.487-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Me'/><title type='text'>Vimeo</title><content type='html'>Vimeo's like YouTube, but Vimeo lets you host HD quality videos that look worlds better than YouTube.  The only catch is you can't embed HD quality stuff off-site (you have to watch them directly from Vimeo's website, which I'm sure it's an add-revenue thing that makes it all possible to begin with).  &lt;br /&gt;&lt;br /&gt;But check out the kind of quality you can get hosted for free, it's pretty cool.  This is just my test upload, and if you play it full screen you'll see what I'm talking about:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.vimeo.com/342573" target="_new"&gt;Test #9 @ Vimeo.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So from now on any video tutorials I make will be hosted at Vimeo and I've got a namespace setup there which I'll add to the permalinks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-4224380997746117856?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/4224380997746117856/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=4224380997746117856' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/4224380997746117856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/4224380997746117856'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2007/10/vimeo.html' title='Vimeo'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-1657840304849255686</id><published>2007-10-13T19:41:00.000-07:00</published><updated>2008-06-20T03:03:23.704-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA 1.0'/><title type='text'>VB.NET XNA Tutorial 2: Creating an XNA Windows Game project</title><content type='html'>&lt;font color="grey"&gt;[GSE 1.0 Refresh]&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;There is now a &lt;a href="http://xnamachine.blogspot.com/2007/11/vbnet-xna-windows-game-project-template.html"&gt;Visual Studio template for starting a VB.NET XNA Windows Game project&lt;/a&gt;.  This template automates the steps shown in the video.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;Here is a video tutorial that describes very simply how to setup a "game" project for Windows using VB.NET and Visual Studio 2005.&lt;br /&gt;&lt;br /&gt;&lt;object type="application/x-shockwave-flash" width="500" height="380" data="http://vimeo.com/moogaloop.swf?clip_id=341551&amp;amp;server=vimeo.com&amp;amp;fullscreen=1&amp;amp;show_title=0&amp;amp;show_byline=0&amp;amp;show_portrait=0&amp;amp;color=01AAEA"&gt; &lt;param name="quality" value="best" /&gt; &lt;param name="allowfullscreen" value="true" /&gt; &lt;param name="scale" value="showAll" /&gt; &lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=341551&amp;amp;server=vimeo.com&amp;amp;fullscreen=1&amp;amp;show_title=0&amp;amp;show_byline=0&amp;amp;show_portrait=0&amp;amp;color=01AAEA" /&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/341551/l:embed_341551"&gt;Tutorial 2: Creating an XNA Windows Game project&lt;/a&gt; from &lt;a href="http://vimeo.com/xnamachine/l:embed_341551"&gt;emachine&lt;/a&gt; on &lt;a href="http://vimeo.com/l:embed_341551"&gt;Vimeo&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-1657840304849255686?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/1657840304849255686/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=1657840304849255686' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/1657840304849255686'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/1657840304849255686'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2007/10/tutorial-2-creating-xna-windows-game.html' title='VB.NET XNA Tutorial 2: Creating an XNA Windows Game project'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-9200128392828220899</id><published>2007-10-12T18:35:00.000-07:00</published><updated>2008-02-25T20:29:16.485-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tutorials'/><title type='text'>VB.NET XNA Tutorial 1: Getting started</title><content type='html'>First things first; let's get this whole XNA thing straight.&lt;br /&gt;&lt;br /&gt;The XNA framework is a managed wrapper for DirectX.  So you'll need the latest version of DirectX installed.&lt;br /&gt;&lt;br /&gt;XNA comes to you branded in a somewhat vaguely (and soon to be confusingly) named piece of software called "Game Studio Express".  The deal is, Microsoft diverted their previous Managed DirectX project into the XNA project; the XNA project grew to include not only a managed wrapper for DirectX, but also some other tools like the Content Pipeline, and XACT.  All of this was then wrapped into a software suite - not called XNA - but actually called "Game Studio Express", which was designed specifically to be an "expansion pack" of sorts for Visual C# 2005 Express Edition.&lt;br /&gt;&lt;br /&gt;So anyway... what this all means for us VB freaks is that in order to get the managed wrapper for DirectX on our development machines, and in order to have at that Content Pipeline and XACT stuff, we have to do what everybody else has to do: install Visual C# 2005 Express Edition, and then install Game Studio Express.  Which is all the more counter-intuitive for us, since our goal is to &lt;span style="font-weight:bold;"&gt;avoid &lt;/span&gt;using C# in the first place because we're too lazy to start using curly braces and semi-colons.&lt;br /&gt;&lt;br /&gt;Don't worry.  &lt;a href="http://creators.xna.com/Resources/Essentials.aspx" target="_new"&gt;But you'd better get crackin'; you've got some progress bars to baby sit and many a "Next" button in your future&lt;/a&gt;.  Enjoy it, involve a beverage perhaps.&lt;br /&gt;&lt;br /&gt;Once you've got Game Studio Express installed, your newly acquired C# IDE gains XNA-related project options that no other IDE gets.  To learn a little bit about what we're going to be missing out on in terms of XNA-related IDE options, let's go ahead and poke around the C# IDE for a sec.  Run the C# IDE, and start a New Project - check out the types of projects you can start:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i97.photobucket.com/albums/l223/emachine74/csharpxnanewproject.png" /&gt;&lt;br /&gt;&lt;br /&gt;Go ahead and start a new Windows Game project, just to look around. Pop open the solution explorer and add a new Item to the project; check out what options we have available for creating New Items in the C# IDE:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i97.photobucket.com/albums/l223/emachine74/csharpaddnewitem.png" /&gt;&lt;br /&gt;&lt;br /&gt;Using the C# IDE, there are nifty items available like "Sprite Font" and "Game Component":&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i97.photobucket.com/albums/l223/emachine74/csharpxnanewitem.png" /&gt;&lt;br /&gt;&lt;br /&gt;So those are Game Studio Express IDE hooks, they're just templates for making stuff.  Nothing we can't handle ourselves.  &lt;br /&gt;&lt;br /&gt;Ok, we've seen enough.  Cancel all that business and let's move over to our Visual Basic IDE.  &lt;br /&gt;&lt;br /&gt;Game Studio Express isn't going to do anything for our Visual Basic IDE, so if you go looking for a Windows Game project you're going to be disappointed&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i97.photobucket.com/albums/l223/emachine74/vbnewproject.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update: The remainder of this tutorial is obsolete.  &lt;a href="http://xnamachine.blogspot.com/2007/11/vbnet-xna-windows-game-project-template.html"&gt;A VB.NET XNA Windows Game project template for use with Visual Studio 2005 and Game Studio 2.0 Beta&lt;/a&gt; was posted on this blog in November 2007&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;But, what it &lt;span style="font-weight:bold;"&gt;has&lt;/span&gt; done is installed the managed XNA libraries, the Content Pipeline compiler, and tools like XACT.  We've got everything we need to do some serious damage, there's just a couple things we'll have to do that the C# guys don't have to:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;1. We will need to initiate our own project, rather than use the Game project template.  And that means we'll have to create those nifty items like "Game Component" and "Sprite Font" by ourselves, too.&lt;br /&gt;&lt;br /&gt;In &lt;a href="http://www.alanphipps.com/VisualBasicdotNET-XNA-InheritsGame.html" target="_new"&gt;tutorial 20&lt;/a&gt;, Alan Phipps demonstrates how to start an XNA Windows Game using the Visual Studio .NET IDE.&lt;br /&gt;&lt;br /&gt;In addition to the advice he gives there, I would suggest &lt;span style="font-weight:bold;"&gt;removing the System.Drawing reference&lt;/span&gt; from your project, as this can create an ambiguity with items of the same name (such as Color and Rectangle) that exist in the XNA namespace.&lt;br /&gt;&lt;br /&gt;I also suggest you not wait until tutorial 20 to start making your XNA projects in this way, but hindsight is 20/20.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;2. We'll want to use the Content Pipeline, because it's fairly cool.  The Content Pipeline has some rules though - mainly it wants us to convert our resources into a "cross platform format" (something that works on both Windows and XBox360).  So for example, if you have a sprite texture that's a .gif file, the Content Pipeline will want that to be an .xnb file.  And sounds are even more wacky.  If you make a sound resource with XACT, it will actually need to be broken down into 3 files: an .xgs file, .xsb file, and .xwb file.  Yea, I know.  This sounds crazy already and we haven't even started yet.  Hang in there, we're almost done:&lt;br /&gt;&lt;br /&gt;The Content Pipeline hassle does seems kind of unnecessarily complicated at first.  You'll like it though, I promise (and you don't have to remember those file extensions).  Here's the deal: out in your 's .NET 2.0 framework folder there is a program called MSBuild.exe. MSBuild knows how to convert textures (like "spaceship.png") and sound projects you create with XACT into all those .x-blah-blah files for the Content Pipepline.  It's actually really easy; MSBuild does all the work for you.  You just tell it what you want to convert (pass it file names in a batch) and it converts them all for you.&lt;br /&gt;&lt;br /&gt;Now here's the catch; the way you "tell MSBuild to convert stuff in a batch" is to pass it a &lt;span style="font-weight:bold;"&gt;C# project file&lt;/span&gt;.  Yea, like "WindowsGame1.csproj".  Which kinda makes sense when you remember that all this stuff was designed to work with Visual C# Express Edition projects.  MSBuild takes a .csproj file and for each resource it finds described in there, it creates a Content Pipeline .x-whatever file.  With C# projects, this call to MSBuild is performed at the time the project is compiled.  In XNA marketing lingo they call this "automatic".  For us this will be a "manual" process... but we're lazy, so we'll automate it, and at the end of the day it'll end up being just as automatic as the next guy's.&lt;br /&gt;&lt;br /&gt;In &lt;a href="http://www.alanphipps.com/VisualBasicdotNET-XNA-ContentPipeline.html" target="_new"&gt;tutorial 21&lt;/a&gt;, Alan Phipps demonstrates how he simply builds a "fake" .csproj file with his resource references in it, and then feeds that file to MSBuild in order to trick it into thinking it's processing a C# XNA project.&lt;br /&gt;&lt;br /&gt;Not bad!  So I do the same thing, but I chose to integrate this process into my engine with a "compile" flag (rather than have it be a separate project that must be run).  I'll show you how I did this in the next tutorial, and between the two you can choose to do it my way, Alan's way, or say "screw this, I'm using C#"&lt;/li&gt;&lt;/ul&gt;That's it for Tutorial 1. A little bit of dry reading, but rather than do a bunch of stuff the "wrong" way then refactor it later to the "right" way, I'd rather we just start out understanding the right way to do it.  And if you managed to cram all of that into one sitting, you're doing better than I did when I first tried to understand all this stuff.&lt;br /&gt;&lt;br /&gt;In the next article, we'll check out my adaptations of the "Start a new project" and "deal with the Content Pipeline hack" and I'll probably start brushing up against the merits of putting all of this stuff into a common project you can reuse for future games (in other words, we'll start building the engine).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-9200128392828220899?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/9200128392828220899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=9200128392828220899' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/9200128392828220899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/9200128392828220899'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2007/10/xna-tutorial-1-getting-started.html' title='VB.NET XNA Tutorial 1: Getting started'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-2532803248069981622</id><published>2007-10-11T00:28:00.000-07:00</published><updated>2008-06-20T03:02:56.049-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Project: Code posting tool'/><title type='text'>VB.NET code posting tool now available</title><content type='html'>My vb.net source code posting tool is now online and can be found on my personal web server at &lt;a href="http://www.reddinghaze.com/codeformatter.aspx" target="_new"&gt;http://www.reddinghaze.com/codeformatter.aspx&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;You can optionally assign width and height to the output div and toggle whether or not it scrolls overflow.  Here's some output generated by the code posting tool (a chunk of the code posting tool page's own code... run through itself... &lt;span style="font-weight:bold;"&gt;trippy!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- BEGIN&lt;br /&gt;--&gt;&lt;div style="font-family: Courier New; font-size: 10pt; text-align: left; color:#000000; vertical-align: top; width:800px; height: auto; overflow-x:scroll; overflow-y:scroll;"&gt; &lt;font color="#0000ff"&gt;Public&lt;/font&gt;&amp;nbsp;&lt;font color="#0000ff"&gt;Class&lt;/font&gt;&amp;nbsp;codeformatter&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;Inherits&lt;/font&gt;&amp;nbsp;Page&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;Private&lt;/font&gt;&amp;nbsp;txtInput,&amp;nbsp;txtOutput,&amp;nbsp;txtWidth,&amp;nbsp;txtHeight&amp;nbsp;&lt;font color="#0000ff"&gt;As&lt;/font&gt;&amp;nbsp;TextBox&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;Private&lt;/font&gt;&amp;nbsp;chkScroll&amp;nbsp;&lt;font color="#0000ff"&gt;As&lt;/font&gt;&amp;nbsp;CheckBox&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;Private&lt;/font&gt;&amp;nbsp;objForm&amp;nbsp;&lt;font color="#0000ff"&gt;As&lt;/font&gt;&amp;nbsp;HtmlForm&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;Private&lt;/font&gt;&amp;nbsp;&lt;font color="#0000ff"&gt;WithEvents&lt;/font&gt;&amp;nbsp;btnFormat&amp;nbsp;&lt;font color="#0000ff"&gt;As&lt;/font&gt;&amp;nbsp;Button&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;Private&lt;/font&gt;&amp;nbsp;Tokens&amp;nbsp;&lt;font color="#0000ff"&gt;As&lt;/font&gt;&amp;nbsp;&lt;font color="#0000ff"&gt;New&lt;/font&gt;&amp;nbsp;System.Collections.Generic.List(&lt;font color="#0000ff"&gt;Of&lt;/font&gt;&amp;nbsp;String)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;Private&lt;/font&gt;&amp;nbsp;Keywords&amp;nbsp;&lt;font color="#0000ff"&gt;As&lt;/font&gt;&amp;nbsp;&lt;font color="#0000ff"&gt;New&lt;/font&gt;&amp;nbsp;System.Collections.Generic.List(&lt;font color="#0000ff"&gt;Of&lt;/font&gt;&amp;nbsp;String)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;Protected&lt;/font&gt;&amp;nbsp;&lt;font color="#0000ff"&gt;Sub&lt;/font&gt;&amp;nbsp;Page_Init(&lt;font color="#0000ff"&gt;ByVal&lt;/font&gt;&amp;nbsp;sender&amp;nbsp;&lt;font color="#0000ff"&gt;As&lt;/font&gt;&amp;nbsp;System.Object,&amp;nbsp;&lt;font color="#0000ff"&gt;ByVal&lt;/font&gt;&amp;nbsp;e&amp;nbsp;&lt;font color="#0000ff"&gt;As&lt;/font&gt;&amp;nbsp;System.EventArgs)&amp;nbsp;&lt;font color="#0000ff"&gt;Handles&lt;/font&gt;&amp;nbsp;&lt;font color="#0000ff"&gt;Me&lt;/font&gt;.Init&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;Me&lt;/font&gt;.InitializeControls()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;Me&lt;/font&gt;.Controls.Add(&lt;font color="#0000ff"&gt;New&lt;/font&gt;&amp;nbsp;LiteralControl(&lt;font color="#a31515"&gt;"&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;emachine's&amp;nbsp;vb.net&amp;nbsp;post&amp;nbsp;formatter&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;&amp;lt;center&amp;gt;&amp;lt;h1&amp;gt;emachine's&amp;nbsp;vb.net&amp;nbsp;post&amp;nbsp;formatter*&amp;lt;/h1&amp;gt;"&lt;/font&gt;&amp;nbsp;&amp;&amp;nbsp;_&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#a31515"&gt;"&amp;lt;font&amp;nbsp;size="&lt;/font&gt;&lt;font color="#a31515"&gt;"2"&lt;/font&gt;&lt;font color="#a31515"&gt;"&amp;gt;*now&amp;nbsp;with&amp;nbsp;zero&amp;nbsp;aesthetic&amp;nbsp;appeal&amp;lt;/font&amp;gt;"&lt;/font&gt;))&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;Me&lt;/font&gt;.Controls.Add(&lt;font color="#0000ff"&gt;Me&lt;/font&gt;.objForm)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;With&lt;/font&gt;&amp;nbsp;&lt;font color="#0000ff"&gt;Me&lt;/font&gt;.objForm&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Controls.Add(&lt;font color="#0000ff"&gt;New&lt;/font&gt;&amp;nbsp;LiteralControl(&lt;font color="#a31515"&gt;"&amp;lt;br&amp;nbsp;/&amp;gt;Paste&amp;nbsp;from&amp;nbsp;your&amp;nbsp;IDE&amp;nbsp;&amp;lt;font&amp;nbsp;size="&lt;/font&gt;&lt;font color="#a31515"&gt;"2"&lt;/font&gt;&lt;font color="#a31515"&gt;"&amp;gt;(tip:&amp;nbsp;Ctrl+A,&amp;nbsp;Ctrl+V)&amp;lt;/font&amp;gt;&amp;lt;br&amp;nbsp;/&amp;gt;"&lt;/font&gt;))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Controls.Add(&lt;font color="#0000ff"&gt;Me&lt;/font&gt;.txtInput)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Controls.Add(&lt;font color="#0000ff"&gt;New&lt;/font&gt;&amp;nbsp;LiteralControl(&lt;font color="#a31515"&gt;"&amp;lt;br&amp;nbsp;/&amp;gt;width:"&lt;/font&gt;))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Controls.Add(&lt;font color="#0000ff"&gt;Me&lt;/font&gt;.txtWidth)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Controls.Add(&lt;font color="#0000ff"&gt;New&lt;/font&gt;&amp;nbsp;LiteralControl(&lt;font color="#a31515"&gt;"px,&amp;nbsp;height:"&lt;/font&gt;))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Controls.Add(&lt;font color="#0000ff"&gt;Me&lt;/font&gt;.txtHeight)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Controls.Add(&lt;font color="#0000ff"&gt;New&lt;/font&gt;&amp;nbsp;LiteralControl(&lt;font color="#a31515"&gt;"px&amp;nbsp;"&lt;/font&gt;))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Controls.Add(&lt;font color="#0000ff"&gt;Me&lt;/font&gt;.chkScroll)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Controls.Add(&lt;font color="#0000ff"&gt;New&lt;/font&gt;&amp;nbsp;LiteralControl(&lt;font color="#a31515"&gt;"&amp;lt;br&amp;nbsp;/&amp;gt;&amp;lt;br&amp;nbsp;/&amp;gt;"&lt;/font&gt;))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Controls.Add(&lt;font color="#0000ff"&gt;Me&lt;/font&gt;.btnFormat)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Controls.Add(&lt;font color="#0000ff"&gt;New&lt;/font&gt;&amp;nbsp;LiteralControl(&lt;font color="#a31515"&gt;"&amp;lt;br&amp;nbsp;/&amp;gt;&amp;lt;br&amp;nbsp;/&amp;gt;Copy&amp;nbsp;to&amp;nbsp;your&amp;nbsp;blog&amp;nbsp;&amp;lt;font&amp;nbsp;size="&lt;/font&gt;&lt;font color="#a31515"&gt;"2"&lt;/font&gt;&lt;font color="#a31515"&gt;"&amp;gt;(tip:&amp;nbsp;Ctrl+A,&amp;nbsp;Ctrl+C)&amp;lt;/font&amp;gt;&amp;lt;br&amp;nbsp;/&amp;gt;"&lt;/font&gt;))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Controls.Add(&lt;font color="#0000ff"&gt;Me&lt;/font&gt;.txtOutput)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;End&lt;/font&gt;&amp;nbsp;&lt;font color="#0000ff"&gt;With&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;Me&lt;/font&gt;.Controls.Add(&lt;font color="#0000ff"&gt;New&lt;/font&gt;&amp;nbsp;LiteralControl(&lt;font color="#a31515"&gt;"Preview:&amp;lt;br&amp;nbsp;/&amp;gt;"&lt;/font&gt;))&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008000"&gt;'etc.&lt;/font&gt;&lt;br /&gt;&lt;/div&gt;&lt;!-- &lt;br /&gt;END --&gt;&lt;br /&gt;&lt;br /&gt;Oh yea, it knows the difference between keywords and properties now, too:&lt;br /&gt;&lt;br /&gt;&lt;!-- BEGIN&lt;br /&gt;--&gt;&lt;div style="font-family: Courier New; font-size: 10pt; text-align: left; color:#000000; vertical-align: top; width:800px; height: auto; overflow-x:visible; overflow-y:visible;"&gt; &lt;font color="#0000ff"&gt;If&lt;/font&gt;&amp;nbsp;ItsAClass.End&amp;nbsp;&lt;font color="#0000ff"&gt;Then&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#a31515"&gt;"No&amp;nbsp;more&amp;nbsp;blue&amp;nbsp;.Ends!"&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;End&lt;/font&gt;&amp;nbsp;&lt;font color="#0000ff"&gt;If&lt;/font&gt;&lt;br /&gt;&lt;/div&gt;&lt;!-- &lt;br /&gt;END --&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-2532803248069981622?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/2532803248069981622/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=2532803248069981622' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/2532803248069981622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/2532803248069981622'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2007/10/emachines-vbnet-post-formatter.html' title='VB.NET code posting tool now available'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-8788139214572267489</id><published>2007-10-10T14:30:00.001-07:00</published><updated>2008-06-20T03:02:56.049-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Project: Code posting tool'/><title type='text'>Great bugs err alike</title><content type='html'>So as I've mentioned I'm working on a source-code formatter and it currently has this, uh, "feature" where it doesn't quite know the difference between a keyword and a class member of the same name.  Given the input "MyClass.End" where End is a keyword, it will erroneously produce the output "&lt;font color="black"&gt;MyClass.&lt;/font&gt;&lt;font color="blue"&gt;End&lt;/font&gt;" rather than "&lt;font color="black"&gt;MyClass.End&lt;/font&gt;".&lt;br /&gt;&lt;br /&gt;But today I noticed something which made me feel slightly less dumb about that.  If you &lt;a href="http://forums.xna.com/thread/27131.aspx" target="_new"&gt;see the post of mine on the xna forums where I used the xna forums code posting tool&lt;/a&gt;, check out the 3rd-to-last line of the code block.&lt;br /&gt;&lt;br /&gt;Perhaps the xna forum web programmer was &lt;a href="http://xnamachine.blogspot.com/2007/10/html-vbnet-code-format-utilty.html"&gt;drinking and watching TV while they wrote the code posting tool&lt;/a&gt; :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-8788139214572267489?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/8788139214572267489/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=8788139214572267489' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/8788139214572267489'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/8788139214572267489'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2007/10/great-bugs-err-alike.html' title='Great bugs err alike'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-7342274267010866184</id><published>2007-10-10T01:47:00.001-07:00</published><updated>2008-06-20T03:02:38.608-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Project: Code posting tool'/><title type='text'>Code posting tool in the works</title><content type='html'>If I'm going to have a blog about coding I'll probably want to post source code now and then.  But I couldn't find a VB.NET source -&gt; HTML formatter anywhere, so I'm writing a little online utility to facilitate a relatively painless/intuitive "copy &amp; paste" from the IDE into HTML for posting/blogging.&lt;br /&gt;&lt;br /&gt;It's still beta-ish, just worked on it for an hour or so last night. Here's a sample of it's output, it's my current XNA game's Draw method, copied &amp; pasted from the IDE into the processor, then from the processor into this blog's HTML editor:&lt;br /&gt;&lt;br /&gt;&lt;!-- BEGIN BLOGIFIED CODE BLOCK &lt;br /&gt;&lt;br /&gt;--&gt;&lt;div style="font-family: Courier New; font-size: 10pt; text-align: left; color:#000000; border:0; vertical-align:top; overflow-y:visible; overflow-x:visible;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;Protected&lt;/font&gt;&amp;nbsp;&lt;font color="#0000ff"&gt;Overrides&lt;/font&gt;&amp;nbsp;&lt;font color="#0000ff"&gt;Sub&lt;/font&gt;&amp;nbsp;Draw(&lt;font color="#0000ff"&gt;ByVal&lt;/font&gt;&amp;nbsp;gameTime&amp;nbsp;&lt;font color="#0000ff"&gt;As&lt;/font&gt;&amp;nbsp;Microsoft.Xna.Framework.GameTime)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;XNALib.GraphicsDeviceManager.GraphicsDevice.Clear(ClearOptions.Target,&amp;nbsp;&lt;font color="#0000ff"&gt;Me&lt;/font&gt;.objFrameColor,&amp;nbsp;1.0F,&amp;nbsp;0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ScreenManager.Root.Draw(gameTime)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;MyBase&lt;/font&gt;.Draw(gameTime)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;XNALib.RenderDebugOptions()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008000"&gt;'calculate&amp;nbsp;fps&amp;nbsp;data&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;Me&lt;/font&gt;.intFrames&amp;nbsp;+=&amp;nbsp;1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;Me&lt;/font&gt;.objOneSecond&amp;nbsp;+=&amp;nbsp;gameTime.ElapsedGameTime&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008000"&gt;'update&amp;nbsp;this&amp;nbsp;information&amp;nbsp;every&amp;nbsp;[gametime]&amp;nbsp;elapsed&amp;nbsp;second&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;If&lt;/font&gt;&amp;nbsp;&lt;font color="#0000ff"&gt;Me&lt;/font&gt;.objOneSecond.TotalSeconds&amp;nbsp;&gt;=&amp;nbsp;1&amp;nbsp;&lt;font color="#0000ff"&gt;Then&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;Me&lt;/font&gt;.strActualFPS&amp;nbsp;=&amp;nbsp;Math.Round((&lt;font color="#0000ff"&gt;Me&lt;/font&gt;.intFrames&amp;nbsp;/&amp;nbsp;&lt;font color="#0000ff"&gt;Me&lt;/font&gt;.objOneSecond.TotalSeconds)&amp;nbsp;*&amp;nbsp;&lt;font color="#0000ff"&gt;Me&lt;/font&gt;.objOneSecond.TotalSeconds,&amp;nbsp;1).ToString&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;Me&lt;/font&gt;.objOneSecond&amp;nbsp;-=&amp;nbsp;&lt;font color="#0000ff"&gt;Me&lt;/font&gt;.objOneSecond&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;Me&lt;/font&gt;.intFrames&amp;nbsp;=&amp;nbsp;0&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;End&lt;/font&gt;&amp;nbsp;&lt;font color="#0000ff"&gt;If&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;If&lt;/font&gt;&amp;nbsp;XNALib.ShowFPS&amp;nbsp;&lt;font color="#0000ff"&gt;Then&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008000"&gt;'render&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;XNALib.SpriteDrawer.Begin()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;XNALib.SpriteDrawer.DrawString(XNALib.Fonts(&lt;font color="#a31515"&gt;"dialog"&lt;/font&gt;),&amp;nbsp;&lt;font color="#0000ff"&gt;Me&lt;/font&gt;.strActualFPS&amp;nbsp;&amp;&amp;nbsp;&lt;font color="#a31515"&gt;"&amp;nbsp;fps"&lt;/font&gt;,&amp;nbsp;Vector2.One,&amp;nbsp;&lt;font color="#0000ff"&gt;New&lt;/font&gt;&amp;nbsp;Color(0,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;175))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;XNALib.SpriteDrawer.DrawString(XNALib.Fonts(&lt;font color="#a31515"&gt;"dialog"&lt;/font&gt;),&amp;nbsp;&lt;font color="#0000ff"&gt;Me&lt;/font&gt;.strActualFPS&amp;nbsp;&amp;&amp;nbsp;&lt;font color="#a31515"&gt;"&amp;nbsp;fps"&lt;/font&gt;,&amp;nbsp;Vector2.Zero,&amp;nbsp;Color.Red)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;XNALib.SpriteDrawer.&lt;font color="#0000ff"&gt;End&lt;/font&gt;()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;End&lt;/font&gt;&amp;nbsp;&lt;font color="#0000ff"&gt;If&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;End&lt;/font&gt;&amp;nbsp;&lt;font color="#0000ff"&gt;Sub&lt;/font&gt;&lt;br /&gt;&lt;/div&gt;&lt;!-- &lt;br /&gt;&lt;br /&gt;END BLOGIFIED CODE BLOCK --&gt;&lt;br /&gt;&lt;br /&gt;Not half bad, considering I was drinking and watching TV while I wrote it.  Basically it just sets the font and the spaces to be non-breaking, re-colors keywords, comments and literal strings to the default Visual Studio 2005 IDE colors.  No biggie, but oddly enough I couldn't find a (free) tool that does this anywhere online.&lt;br /&gt;&lt;br /&gt;It's just about good as-is, before I "release" it I do need to teach it the difference between keywords and properties (i.e., MyClass.&lt;font color="blue"&gt;End&lt;/font&gt; isn't quite right, which you can see did in fact happen on the 3rd to last line in the above sample).&lt;br /&gt;&lt;br /&gt;And before I put it out there I want to add some quick options, like whether or not to restrict the dimensions of the output div container, whether or not the container scrolls, and maybe even toss in BBCode support.&lt;br /&gt;&lt;br /&gt;Basic doesn't really have that many tokenization characters, maybe half a dozen or so and that's it.  So this was pretty easy to tackle.  I'm not a C# programmer and I dunno how how many tokenization chars they have, but if it's not too crazy I could add C# support.&lt;br /&gt;&lt;br /&gt;The utility won't beautify your code like the IDE does, it just recovers formatting lost in the copy &amp; paste process from the IDE to the web using whatever you paste into it verbatim.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-7342274267010866184?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/7342274267010866184/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=7342274267010866184' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/7342274267010866184'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/7342274267010866184'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2007/10/html-vbnet-code-format-utilty.html' title='Code posting tool in the works'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-4331797327786279383</id><published>2007-10-09T12:50:00.000-07:00</published><updated>2008-06-20T03:01:53.233-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Me'/><category scheme='http://www.blogger.com/atom/ns#' term='Tutorials'/><title type='text'>VB.NET XNA Tutorial 0: Prologue</title><content type='html'>I hesitated a little bit about doing this VB.NET related XNA blog stuff for a couple of reasons.  First, there's a new version of Game Studio Express on the way out shortly (version 2.0) which has support for Visual Studio 2005.  That means very soon, you will no longer be required to use Visual C# Express for XNA related IDE features.&lt;br /&gt;&lt;br /&gt;But unfortunately, support for Visual Studio 2005 doesn't equate to support for languages other than C#.  Here's a &lt;a href="http://forums.xna.com/thread/20852.aspx" target="_new"&gt;good thread on the subject over at the xna forums&lt;/a&gt;, the meat of which is captured in this post by Shawn Hargreaves (one of Microsoft's XNA guys)&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;"... we are only doing IDE work to integrate the XNA Framework into the C# project system, and not currently supporting the project systems for any other languages. In the absence of this IDE work, you miss out on exactly two things:&lt;ul&gt;&lt;li&gt;Content pipeline integration&lt;/li&gt;&lt;li&gt;The ability to deploy and debug on Xbox 360&lt;/li&gt;&lt;/ul&gt;Now, you may be just fine without those things. Maybe you're making a Windows game that doesn't use the Content Pipeline. In that case you don't care about our IDE integration, so the lack of it will not hurt you, and you can use any .NET langauge you like.&lt;br /&gt;&lt;br /&gt;If you want to use the Content Pipeline, or deploy to Xbox, you can still do that by building your other-language code into an assembly, then using a stub C# project that links with this assembly to build your content, deploy to Xbox, and then call into your real assembly as soon as it starts up. It's a hack, but some people have reported success working this way."&lt;/blockquote&gt;&lt;br /&gt;So that means for the immediate to long term, we're officially "XNA hackers".  I dunno about you but that makes me feel like a rebel.&lt;br /&gt;&lt;br /&gt;Anyway, the other reason I thought twice about this was the fact that, over at Alan Phipps's website (which is permalinked right over there in the links area), a lot of this has been explained already.  After following the tutorials and gaining a little bit of insight into the process, I've decided I'm going to offer you my take on it.  Rather than build a specific application for a specific task (which a lot of tutorials seem to do), here we'll be building something a little more generic; more of an engine that can be used to do "whatever" in 2D.  Some of it will be "here's how you do it", and some of it will be me showing up to the party 5 months late with "omg I didn't even &lt;span style="font-weight:bold;"&gt;know&lt;/span&gt; about render targets! Holy crap, now we have to totally rewrite the engine!"&lt;br /&gt;&lt;br /&gt;At any rate, you'll have a couple different sources to draw from when it comes to using XNA with VB.NET, and there's really not much of that floating around the net right now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-4331797327786279383?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/4331797327786279383/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=4331797327786279383' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/4331797327786279383'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/4331797327786279383'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2007/10/xna-tutorial-0-prologue.html' title='VB.NET XNA Tutorial 0: Prologue'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8768285918186248163.post-2120047244751565685</id><published>2007-10-08T14:44:00.000-07:00</published><updated>2008-06-20T03:01:23.716-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Me'/><title type='text'>Sub Main()</title><content type='html'>Just my boring 1st post when setting up the blog.  There's nothing real interesting here.&lt;br /&gt;&lt;br /&gt;I'm building a 2D engine with XNA, using Visual Basic .NET &amp;amp; Visual Studio 2005.  The purpose of the engine will be to provide a front end for a vaporware game I want to write someday in my free time (there's a lot to be blogged about that later), and at the same time, I'll be using the engine to drive some touch-screen applications I'll be writing for my employer.  Work on my game is almost entirely conceptual so far, but the engine itself is being used in the real world and being worked on quite regularly.&lt;br /&gt;&lt;br /&gt;A significant portion of the engine is actually written, but as I go along I learn new things about XNA and from time to time I change stuff about it.  You know how it goes.&lt;br /&gt;&lt;br /&gt;So why bother with this blog, since there are so many more knowledgeable people out there than me?  I just want to try and help fill the massive gaps in VB.NET XNA examples on the web.  Whenever I feel like I've designed something worth mentioning, I'll try to take some time to post examples.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8768285918186248163-2120047244751565685?l=xnamachine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnamachine.blogspot.com/feeds/2120047244751565685/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8768285918186248163&amp;postID=2120047244751565685' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/2120047244751565685'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8768285918186248163/posts/default/2120047244751565685'/><link rel='alternate' type='text/html' href='http://xnamachine.blogspot.com/2007/10/xna-machine.html' title='Sub Main()'/><author><name>emachine74</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/_T9ZA6kCm6EA/ScBxKDdBdnI/AAAAAAAAAEA/fucwgaWWEqo/S220/eavatar.png'/></author><thr:total>0</thr:total></entry></feed>
