<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://ilovevb.net/Web/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Nimble2D</title><link>http://ilovevb.net/Web/blogs/nimble2d/default.aspx</link><description>&lt;img src="http://www.mwgames.com/_uimages/Nimble2D_Logo_Small.jpg" alt="" align="right" /&gt;A 2D game development library for .Net, based on SlimDX and DirectX9.  It will use Direct3D9&amp;#39;s Sprite functionality to create a fast 2D environment (with real-time rotation, scaling and blending), mobile cameras, sprite-based text and primatives, and real-time sound effect panning and volume based on sprite locations.</description><dc:language>en</dc:language><generator>CommunityServer 2007.1 (Build: 20917.1142)</generator><item><title>Pondering Pause</title><link>http://ilovevb.net/Web/blogs/nimble2d/archive/2008/06/29/pondering-pause.aspx</link><pubDate>Sun, 29 Jun 2008 20:47:00 GMT</pubDate><guid isPermaLink="false">f079997d-67b3-4d49-aaea-86507d683840:150</guid><dc:creator>MattWorden</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://ilovevb.net/Web/blogs/nimble2d/rsscomments.aspx?PostID=150</wfw:commentRss><comments>http://ilovevb.net/Web/blogs/nimble2d/archive/2008/06/29/pondering-pause.aspx#comments</comments><description>&lt;p&gt;So, it&amp;#39;s been a few months since I posted here.&amp;nbsp; But, it&amp;#39;s not like I&amp;#39;ve been slacking.&amp;nbsp; I&amp;#39;ve even fleshed out some of the start-up sequence code for Nimble (I ended up changing one of my dev machines, and that caused me to need to do some extra caps checks and respond properly to what was found).&amp;nbsp; And then there is work and a half-dozen other &amp;quot;free time&amp;quot; projects (won&amp;#39;t go into a list here).&lt;/p&gt;
&lt;p&gt;&amp;nbsp;But, now we&amp;#39;ve come to a point where I need to stop and ponder a few things.&amp;nbsp; First, &lt;a class="" title="SlimDX June 2008 Release" href="http://code.google.com/p/slimdx/wiki/Downloads?tm=2" target="_blank"&gt;SlimDX has their June 2008 release&lt;/a&gt; out, which changes a few things ... and I think it would be best to bring Nimble up to the latest-and-greatest.&amp;nbsp; Second, I&amp;#39;ve been thinking through the games I&amp;#39;d like to get to making.&amp;nbsp; The responses I&amp;#39;ve gotten from the &lt;a class="" title="Air Rally Ace Tech Demo" href="http://ilovevb.net/Web/files/folders/nimble2d/entry115.aspx" target="_blank"&gt;ARA Tech Demo&lt;/a&gt; (plus some of my own re-tinkering) have made that fade from my mind as my &amp;quot;next big project&amp;quot;.&amp;nbsp; I find myself sliding back to my strategy/board gaming roots.&amp;nbsp; And those sorts of games wouldn&amp;#39;t really require a full Nimble2D-type engine to get to coding them ... in fact, they could probably be done using straight Graphics.Drawing calls.&amp;nbsp; Finally, I&amp;#39;ve found myself paying some attention to &lt;a class="" href="http://forums.indiegamer.com/showpost.php?p=157689&amp;amp;postcount=8" target="_blank"&gt;some wise advice&lt;/a&gt; I received from one of the folks hanging out at the &lt;a class="" title="Indiegamer Forums" href="http://forums.indiegamer.com/index.php" target="_blank"&gt;Indiegamers Forums&lt;/a&gt; -- find/build an engine to use quickly, so that games can get made.&lt;/p&gt;
&lt;p&gt;And now I&amp;#39;m off on a week&amp;#39;s vacation ... and I plan to do some pondering.&amp;nbsp; Advice and comments are always welcome! :-)&lt;/p&gt;&lt;img src="http://ilovevb.net/Web/aggbug.aspx?PostID=150" width="1" height="1"&gt;</description><category domain="http://ilovevb.net/Web/blogs/nimble2d/archive/tags/NimbleOverview/default.aspx">NimbleOverview</category><category domain="http://ilovevb.net/Web/blogs/nimble2d/archive/tags/KudosToOthers/default.aspx">KudosToOthers</category><category domain="http://ilovevb.net/Web/blogs/nimble2d/archive/tags/SlimDX/default.aspx">SlimDX</category></item><item><title>My "QuickTrig" Helper Class</title><link>http://ilovevb.net/Web/blogs/nimble2d/archive/2008/03/08/my-quot-quicktrig-quot-helper-class.aspx</link><pubDate>Sat, 08 Mar 2008 17:22:00 GMT</pubDate><guid isPermaLink="false">f079997d-67b3-4d49-aaea-86507d683840:111</guid><dc:creator>MattWorden</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://ilovevb.net/Web/blogs/nimble2d/rsscomments.aspx?PostID=111</wfw:commentRss><comments>http://ilovevb.net/Web/blogs/nimble2d/archive/2008/03/08/my-quot-quicktrig-quot-helper-class.aspx#comments</comments><description>&lt;p&gt;I&amp;#39;ve uploaded a ZIP file that contains the source code for the &amp;quot;QuickTrig&amp;quot; helper class that I&amp;#39;ve mentioned a couple of times now.&amp;nbsp; You can get it by &lt;a class="" title="QuickTrig Helper Class Source Code" href="http://ilovevb.net/Web/files/folders/nimble2d/entry110.aspx" target="_blank"&gt;clicking this link&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For those curious, looking through that should help explain how I can handle my angles primarily in degrees (as mentioned in my previous post).&lt;/p&gt;
&lt;p&gt;Feel free to give it a look ... and use it if it helps you out.&amp;nbsp; Performance-wise, I&amp;#39;ve found the COS and SIN look-up functions to take half the time of the comparable Math.Cos and Math.Sin traditional functions.&amp;nbsp; While the speed increase is nice, being able to just work in degrees with the rest of my code is the biggest help given by this class.&lt;/p&gt;
&lt;p&gt;-Matt&lt;/p&gt;&lt;img src="http://ilovevb.net/Web/aggbug.aspx?PostID=111" width="1" height="1"&gt;</description><category domain="http://ilovevb.net/Web/blogs/nimble2d/archive/tags/Nimble2D/default.aspx">Nimble2D</category></item><item><title>Units of Measure</title><link>http://ilovevb.net/Web/blogs/nimble2d/archive/2008/02/22/units-of-measure.aspx</link><pubDate>Sat, 23 Feb 2008 03:21:00 GMT</pubDate><guid isPermaLink="false">f079997d-67b3-4d49-aaea-86507d683840:103</guid><dc:creator>MattWorden</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://ilovevb.net/Web/blogs/nimble2d/rsscomments.aspx?PostID=103</wfw:commentRss><comments>http://ilovevb.net/Web/blogs/nimble2d/archive/2008/02/22/units-of-measure.aspx#comments</comments><description>&lt;p&gt;I&amp;#39;ve been working through some auto-moving sprite functionality, and have wandered a bit further down that road than I&amp;nbsp;originally expected to at this point&amp;nbsp;... so now I need to back up a bit to get back on the main route of progress.&amp;nbsp; Here is my list of current things to do:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;Finish fleshing-out my auto-move sprite class (going to set it up to work like a cross between a simple-but-somewhat-intelligent game object and a particle)&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Crop things down into a &amp;quot;base&amp;quot; sprite class ... and change the auto-move sprite to inherit from the base&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Build the primative (circle, rectangle, triangle, line) sprites from the base sprite&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Finish the initial camera functionality (sprite-following, defined bounds, and defined viewports -- leading to multiple cameras in a GameSpace and &amp;quot;split screens&amp;quot; ... &lt;em&gt;btw: thanks once again to the &lt;/em&gt;&lt;a class="" title="XNA Machine Blog" href="http://xnamachine.blogspot.com/2008/02/2d-scenecamera-near-completion.html"&gt;&lt;em&gt;XNA Machine Blog&lt;/em&gt;&lt;/a&gt;&lt;em&gt;&amp;nbsp;who is taking a slightly different approach to similar terrain -- and that&amp;#39;s helping me see things in new ways as well&lt;/em&gt;)&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Once I get that far, I should be ready to compile a quick demo on how the camera and sprite basics work.&lt;/p&gt;
&lt;p&gt;But I wanted to be sure to touch upon a couple units-of-measure that I will be using throughout the library ... and since I don&amp;#39;t have something productive to show from my code at this point, I figured now might be as good a point as any. ;-)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;Angles In Degrees&lt;/u&gt;&lt;/strong&gt; -- I prefer my angles to be measured in degrees.&amp;nbsp; Something about my old-fashioned American math training just won&amp;#39;t let go of me ... so, I like my circles to start at 0 degrees at top, increase in a clockwise fashion -- 90 degrees is to the right, 180 degrees is down -- until you end up at the top again at 360 degrees.&amp;nbsp; So, if you see a property or function that is returning an angle (names like &amp;quot;Heading&amp;quot;, &amp;quot;Facing&amp;quot;, &amp;quot;Aiming&amp;quot;, &amp;quot;GetAngle&amp;quot;, etc.), it will be in degrees.&amp;nbsp; However, for properties, I will likely have an equivalently named property with a &amp;quot;_InRadians&amp;quot; suffix (such as &amp;quot;Heading_InRadians&amp;quot;) to give something to work with if someone wants to use Windows functions that prefer radians.&amp;nbsp; The &amp;quot;QuickTrig&amp;quot; helper functions in &lt;em&gt;Nimble2D&lt;/em&gt; operate in degrees -- so, making use of those is very easy with this degrees-friendly approach.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;Time in Seconds&lt;/u&gt;&lt;/strong&gt; --&amp;nbsp;I&amp;#39;ve found it traditional for game programmers to deal with time in milliseconds, for a number of different reasons.&amp;nbsp; However, I&amp;#39;ve found over time that I always need to convert those into true seconds to do things related to time-based programming (X = X + VX * (DeltaMS / 1000), etc.).&amp;nbsp; So, with this library, I&amp;#39;ve decided to always deal in actual seconds ...&amp;nbsp;usually of type Double.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;Space Measurements in &amp;quot;GameSpace Pixels&amp;quot;&lt;/u&gt;&lt;/strong&gt; -- Position and spacial measurements will essentially still be in pixels, with the normal caviats thrown in when dealing with current 3D programming: It&amp;#39;s a pixel if everything is at a 1.0 scale.&amp;nbsp; And everything will be relative to each other within the GameSpace ... so, basically, the camera&amp;#39;s position will determine what will be showing up on screen.&amp;nbsp; Having a position of (800, -16372) may be in the middle of the screen, if the camera is moved into the right place ... and something at (805, -16372) will be 5 pixels to the right of the first object, assuming a scale of 1.0.&amp;nbsp; When I combine these two things, I like to think of these units as &amp;quot;GameSpace Pixels&amp;quot;, as it reminds me of the relativity between all things within the GameSpace.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;Rates are &amp;quot;per Second&amp;quot;&lt;/u&gt;&lt;/strong&gt; -- Any rate-style measurement -- &amp;quot;Linear Speed&amp;quot;, &amp;quot;Acceleration&amp;quot;, &amp;quot;Rotational Speed&amp;quot;, &amp;quot;Alpha Fade Rate&amp;quot;, etc. -- will be in a &amp;quot;per second&amp;quot; format.&amp;nbsp; Linear Speed, for example, is in &amp;quot;GameSpace Pixels per Second&amp;quot; ... Acceleration is &amp;quot;GameSpace Pixels per Second per Second&amp;quot; ... Rotational Speed is &amp;quot;Degrees per Second&amp;quot; ... Alpha Fade Rate is in &amp;quot;Values per Second&amp;quot; (where a &amp;quot;value&amp;quot; is each&amp;nbsp;integer in the 0-to-255 range).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;&amp;quot;ColorOnly&amp;quot; versus &amp;quot;Color&amp;quot;&lt;/u&gt;&lt;/strong&gt; -- There are times when I like to separate the Alpha channel out by itself from the rest of what would normally be an ARGB-style System.Drawing.Color.&amp;nbsp; Also, there are cases (such as background color) where the Alpha channel just doesn&amp;#39;t matter.&amp;nbsp; As an example of the former, sprites will have a &amp;quot;SpriteAlpha&amp;quot; property that can hold a value of 0 (completely transparent) to 255 (completely opaque) and a separate &amp;quot;SpriteColorOnly&amp;quot; that, while still being of type System.Drawing.Color, will only make use of the Red, Green, and Blue channels to color-shade the sprite.&amp;nbsp; If something contains just the word &amp;quot;Color&amp;quot; (and not the &amp;quot;Only&amp;quot;), then all 4 channels will be used for whatever purpose that property or function is up to.&lt;/p&gt;
&lt;p&gt;Those are the main ones that I&amp;#39;ve run into so far ... I&amp;#39;m sure there will be more, so I reserve the right to re-visit this topic (and maybe even change what&amp;#39;s been stated here). ;-)&lt;/p&gt;
&lt;p&gt;-Matt&lt;/p&gt;&lt;img src="http://ilovevb.net/Web/aggbug.aspx?PostID=103" width="1" height="1"&gt;</description><category domain="http://ilovevb.net/Web/blogs/nimble2d/archive/tags/NimbleOverview/default.aspx">NimbleOverview</category><category domain="http://ilovevb.net/Web/blogs/nimble2d/archive/tags/KudosToOthers/default.aspx">KudosToOthers</category><category domain="http://ilovevb.net/Web/blogs/nimble2d/archive/tags/Nimble2D/default.aspx">Nimble2D</category></item><item><title>Doing 2D in SlimDX</title><link>http://ilovevb.net/Web/blogs/nimble2d/archive/2008/02/12/doing-2d-in-slimdx.aspx</link><pubDate>Wed, 13 Feb 2008 01:22:00 GMT</pubDate><guid isPermaLink="false">f079997d-67b3-4d49-aaea-86507d683840:96</guid><dc:creator>MattWorden</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://ilovevb.net/Web/blogs/nimble2d/rsscomments.aspx?PostID=96</wfw:commentRss><comments>http://ilovevb.net/Web/blogs/nimble2d/archive/2008/02/12/doing-2d-in-slimdx.aspx#comments</comments><description>&lt;p&gt;Now that I&amp;#39;ve had a couple of weeks to play around with 2D programming in Direct3D9 via SlimDX, here are a few things that I&amp;#39;ve found.&lt;/p&gt;
&lt;p&gt;After creating the Direct3D Device (as explained in the &amp;quot;&lt;a class="" title="Graphics Enumeration and Launching the Game Form" href="http://ilovevb.net/Web/blogs/nimble2d/archive/2008/01/21/graphics-enumeration-and-launching-the-game-form.aspx"&gt;Graphics Enumeration and Launching the Game Form&lt;/a&gt;&amp;quot; post), I create a Direct3D Sprite object (which I will be calling a &amp;quot;Sprite Batch&amp;quot; object):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;varSB = New Direct3D9.Sprite(varD3D_Device)&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;This will be passed through the main Nimble2D object to each of the 2D objects that will be drawing themselves to the screen.&lt;/p&gt;
&lt;p&gt;The magical math-thingy that makes the whole thing work is how Matrices and Matrix Transformations are used to determine where and how 2D sprites are drawn.&amp;nbsp; As mentioned earlier, all objects within a gamespace (including cameras) will have a location (simply a &amp;quot;Current X&amp;quot; and &amp;quot;Current Y&amp;quot;)&amp;nbsp;within &amp;quot;game space&amp;quot;, which essentially is&amp;nbsp;a way to measure their positions relative to each other.&amp;nbsp; They will also have a &amp;quot;Facing&amp;quot; angle and a &amp;quot;Scale&amp;quot;.&amp;nbsp; These are the main pieces used within SlimDX&amp;#39;s nifty Transformation2D function to get the matrix needed to draw things how they should appear on screen.&lt;/p&gt;
&lt;p&gt;First, the camera:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;varActualMatrix = SlimDX.Matrix.Transformation2D(New SlimDX.Vector2(varWidth / 2, varHeight / 2), 0, &lt;/em&gt;&lt;em&gt;New SlimDX.Vector2(varScale), New SlimDX.Vector2(varWidth / 2, varHeight / 2), varN2D.QuickTrig.DegreesToWinRadians(varFacing), New SlimDX.Vector2(varCurX, varCurY))&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;varInverseMatrix = SlimDX.Matrix.Invert(varActualMatrix)&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;The parameters of that function are as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;&lt;strong&gt;scalingCenter&lt;/strong&gt;&amp;nbsp;- A Vector2&amp;nbsp;around which to scale things (set to the middle of the&amp;nbsp;screen)&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;strong&gt;scalingRotation&lt;/strong&gt; - A Single that indicates rotating the X/Y scaling away from the identity angle&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;strong&gt;scaling&lt;/strong&gt; - A Vector2 that gives the actual X/Y scaling (1.0 = original size)&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;strong&gt;rotationCenter&lt;/strong&gt; - A Vector2 around which to rotate things&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;strong&gt;rotation&lt;/strong&gt; - The angle to rotate (I like to work with angles in degrees ... DirectX and Windows trig functions prefer radians ... so I have a translator function)&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;strong&gt;translation&lt;/strong&gt; - A Vector2 to relocate everything in X/Y space&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;The first line sets the camera&amp;#39;s actual matrix ... the second line uses that to create the inverse of it, which will be passed to the sprites within the gamespace to relocate them in relation to the camera.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;So, the sprites go like so:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Me.varMyTransform = SlimDX.Matrix.Transformation2D(New SlimDX.Vector2(varCurX, varCurY), 0, New SlimDX.Vector2(varSourceScale.X * varScale, varSourceScale.Y * varScale), New SlimDX.Vector2(varCurX, varCurY), varN2D.QuickTrig.DegreesToWinRadians(varFacing), New SlimDX.Vector2(0))&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;(For my sprites, I have a &amp;quot;SourceScale&amp;quot; that indicates if the initial source image is always to be stretched.)&lt;/p&gt;
&lt;p&gt;To draw things, the following steps are taken:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;div&gt;Begin Scene &amp;amp; Clear to Background color (Direct3D Device) &lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Cycle through all layers ...&lt;/div&gt;&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;div&gt;Begin Drawing Sprites (Sprite Batch)&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Cycle through all sprites ...&lt;/div&gt;&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;div&gt;Transform the Sprite Batch Matrix&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Draw the sprite&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;li&gt;
&lt;div&gt;End Drawing Sprites&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;li&gt;
&lt;div&gt;End Scene&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Present to Screen&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;In this system, these steps are scattered through several objects, but put together, they look something like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; varD3D_Device.BeginScene()&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; varD3D_Device.Clear(ClearFlags.Target, varCurGameSpace.BackgroundColorOnly, 1, 0)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; varN2D.SpriteBatch.Begin(SpriteFlags.AlphaBlend Or SpriteFlags.DoNotSaveState)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; varN2D.SpriteBatch.Transform = SlimDX.Matrix.Multiply(varMyTransform, LayerTransform)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; varN2D.SpriteBatch.Draw(varSourceTexture, varSourceRect, New SlimDX.Vector3(varOrigin.X, varOrigin.Y, 0), New SlimDX.Vector3(varCurX, varCurY, 0), Color.FromArgb(varAlpha, varColorOnly))&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; varN2D.SpriteBatch.End()&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; varD3D_Device.EndScene()&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; varD3D_Device.Present()&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;I have other code bits in between things here and there to handle stuff like allowing for additive blending effects, full-screen fade in/out, writing &amp;quot;screen info&amp;quot; (screen size,&amp;nbsp;camera position, FPS) to the screen, etc.&lt;/p&gt;
&lt;p&gt;What I&amp;#39;m working through now is the sprite-based primary shapes (filled rectangles, circles, and triangles, lines, empty rectangles, filled rectangles with borders, and empty polygons using lines).&amp;nbsp; I hope to give some details about&amp;nbsp;the lookup-table trig system being used at some point as well.&lt;/p&gt;
&lt;p&gt;-Matt&lt;/p&gt;&lt;img src="http://ilovevb.net/Web/aggbug.aspx?PostID=96" width="1" height="1"&gt;</description><category domain="http://ilovevb.net/Web/blogs/nimble2d/archive/tags/Nimble2D/default.aspx">Nimble2D</category><category domain="http://ilovevb.net/Web/blogs/nimble2d/archive/tags/Sprites/default.aspx">Sprites</category><category domain="http://ilovevb.net/Web/blogs/nimble2d/archive/tags/Cameras/default.aspx">Cameras</category><category domain="http://ilovevb.net/Web/blogs/nimble2d/archive/tags/SlimDX/default.aspx">SlimDX</category></item><item><title>A GDI-based Screenshot Method</title><link>http://ilovevb.net/Web/blogs/nimble2d/archive/2008/01/25/a-gdi-based-screenshot-method.aspx</link><pubDate>Fri, 25 Jan 2008 15:08:00 GMT</pubDate><guid isPermaLink="false">f079997d-67b3-4d49-aaea-86507d683840:83</guid><dc:creator>MattWorden</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://ilovevb.net/Web/blogs/nimble2d/rsscomments.aspx?PostID=83</wfw:commentRss><comments>http://ilovevb.net/Web/blogs/nimble2d/archive/2008/01/25/a-gdi-based-screenshot-method.aspx#comments</comments><description>&lt;p&gt;I was struggling with trying to make&amp;nbsp;an easy screenshot method using SlimDX.&amp;nbsp; Looking at MDX samples, the standard method was to grab the Backbuffer into a surface (Device.GetBackbuffer), then use the SurfaceLoader.Save helper method to save that surface to a file.&amp;nbsp; I have not been able to find that SurfaceLoader.Save method anywhere within SlimDX.&amp;nbsp; (I have added it to the SlimDX &amp;quot;issues&amp;quot; list as an enhancement request.)&lt;/p&gt;
&lt;p&gt;In the meantime, I was looking for a way to make it work.&amp;nbsp; An internet acquaintence of mine (and a hyper-good coder also working on a SlimDX-based project), &lt;a class="" title="CodeImp&amp;#39;s Project: DoomBuilder" href="http://sourceforge.net/projects/doombuilder/" target="_blank"&gt;CodeImp&lt;/a&gt;, suggested that I lock the surface and transfer the data to a GDI bitmap and use the Bitmap&amp;#39;s ability to save-to-file.&amp;nbsp; I also wondered about using the SlimDX&amp;#39;s Texture.FromStream method to create a texture from the surface, then do a Texture.SaveToFile ... but none of these worked.&amp;nbsp; For some reason, once I locked the rectangle on the surface, that LockedRect&amp;#39;s Stream wasn&amp;#39;t able to get its own length -- so it kept throwing errors.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;So, my next attempt was to use the surface&amp;#39;s GetDC to see if I could create a GDI Graphics device from that DC and do something with it that way.&amp;nbsp; That&amp;#39;s where the &amp;quot;looky what I found&amp;quot; happened ... GDI Graphics devices have a method called &amp;quot;CopyFromScreen&amp;quot;, which does exactly what it says.&amp;nbsp; This made me drop any SlimDX-related code and go pure GDI, with great results.&lt;/p&gt;
&lt;p&gt;Here are the steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;div&gt;Determine your Top, Left, Width, and Height to capture ... if in full screen, these are 0,0,ScreenWidth,ScreenHeight ... if in windowed, these are the Top, Left, Width, Height of your Game Form&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Create a new Bitmap using Width and Height&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Create a Graphics Device from the new Bitmap&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Do Graphics.CopyFromScreen&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Do Bitmap.Save&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Dispose the Graphics Device and Bitmap&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;So, it&amp;#39;s not quite the 3-step process available with MDX, but this pure-GDI process should work no matter what your drawing system is.&amp;nbsp; Here&amp;#39;s the actual VB.Net code:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tempBMP = New Bitmap(tempWidth, tempHeight)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; G = System.Drawing.Graphics.FromImage(tempBMP)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; G.CopyFromScreen(tempLeft, tempTop, 0, 0, New Size(tempWidth, tempHeight))&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tempFileName = &amp;quot;Screenshot_&amp;quot; &amp;amp; Date.Now.ToString(&amp;quot;yyyyMMdd_hhmmss&amp;quot;) &amp;amp; &amp;quot;.png&amp;quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tempBMP.Save(tempFileName, System.Drawing.Imaging.ImageFormat.Png)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; G.Dispose()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tempBMP.Dispose()&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;This routine names the file using the current date and time (down to the second) and saves it as a PNG.&amp;nbsp; It seems to work fine in both windowed and fullscreen mode.&lt;/p&gt;
&lt;p&gt;-Matt&lt;/p&gt;&lt;img src="http://ilovevb.net/Web/aggbug.aspx?PostID=83" width="1" height="1"&gt;</description><category domain="http://ilovevb.net/Web/blogs/nimble2d/archive/tags/KudosToOthers/default.aspx">KudosToOthers</category><category domain="http://ilovevb.net/Web/blogs/nimble2d/archive/tags/SlimDX/default.aspx">SlimDX</category></item><item><title>Laying Out the Graphics Approach</title><link>http://ilovevb.net/Web/blogs/nimble2d/archive/2008/01/24/laying-out-the-graphics-approach.aspx</link><pubDate>Thu, 24 Jan 2008 17:33:00 GMT</pubDate><guid isPermaLink="false">f079997d-67b3-4d49-aaea-86507d683840:80</guid><dc:creator>MattWorden</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://ilovevb.net/Web/blogs/nimble2d/rsscomments.aspx?PostID=80</wfw:commentRss><comments>http://ilovevb.net/Web/blogs/nimble2d/archive/2008/01/24/laying-out-the-graphics-approach.aspx#comments</comments><description>&lt;p&gt;I won&amp;#39;t be able to do much more coding until the weekend.&amp;nbsp; So, I figured I should give a quick overview of how I&amp;#39;m going to approach the main graphics drawing routine.&amp;nbsp; I&amp;#39;ll start high-level and work downward, then spiral back upward, and then back down a little bit before popping up into the atmosphere to wrap everything together.&lt;/p&gt;
&lt;p&gt;It would be interesting to me to be able to approach displaying a game as if it were a live-action TV show.&amp;nbsp; You would have different sets (I&amp;#39;m going to call them &amp;quot;Game Spaces&amp;quot;) for different sort of things.&amp;nbsp; Think about a normal local newscast&amp;nbsp;-- you have the &amp;quot;main anchor desk&amp;quot; set, the &amp;quot;weather map&amp;quot; set, the &amp;quot;sports report&amp;quot; set, the &amp;quot;investigative reporter&amp;quot; set, etc.&amp;nbsp; For a game, this might translate into things like a main menu, a configuration menu, a high scores list, the pre-level briefing, the main gameplay space, the post-level results, and a game over screen.&amp;nbsp; Each set would have 1 or more cameras trained on it, and you would play the director ... &amp;quot;switch to set 1, camera 1&amp;quot; ... &amp;quot;zoom camera 2&amp;quot; ... &amp;quot;switch to camera 2&amp;quot; ... &amp;quot;prepare camera 1 on set 2&amp;quot; ... &amp;quot;move things around on set 2&amp;quot; ... &amp;quot;switch to set 2, camera 1&amp;quot; ... etc.&lt;/p&gt;
&lt;p&gt;Now, when programming 2D games, I&amp;#39;ve always logically grouped my graphics into layers.&amp;nbsp; There&amp;#39;s usually some sort of background layer which consists of your ground-level surface or a starfield or something else that is simply going to be behind everything else.&amp;nbsp; It may scroll around, but it will otherwise not really interact with anything else in the game and it&amp;#39;s just there for your eyes and brain to have a backdrop on which to make sense of the rest of the game.&amp;nbsp; Then there is usually one or more layers of game objects (these are usually called &amp;quot;Sprites&amp;quot;, and I don&amp;#39;t plan to stray from that norm).&amp;nbsp; These layers might consist of a map layer and a layer for ships and weapons, etc.&amp;nbsp; Basically, I try to group the sprites that may interact with each other (and probably won&amp;#39;t overlap in 2D space) into the same layer.&lt;/p&gt;
&lt;p&gt;Let&amp;#39;s use &lt;em&gt;&lt;a class="" title="Gem Raider Webpage" href="http://www.mwgames.com/gemraider.asp" target="_blank"&gt;Gem Raider&lt;/a&gt;&lt;/em&gt; as a quick example.&amp;nbsp; Look at this screenshot (click it for a big version):&lt;/p&gt;
&lt;p&gt;&lt;a class="" title="Same Screenshot of Game Raider" href="http://www.frontiernet.net/~mattandbritt/GR7_SingleBlackWithOrange.jpg" target="_blank"&gt;&lt;img height="150" alt="Example Screenshot of Gem Raider" src="http://www.mwgames.com/_uimages/GR7_SingleBlackWithOrange_sm.jpg" width="200" align="top" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In this game, I had 6 layers (starting back to front) ...&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;div&gt;The grid-like backdrop surface&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;The &amp;quot;under the walls&amp;quot; explosion layer&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;The &amp;quot;walls&amp;quot; layer for the main static map structures&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;The &amp;quot;moving objects&amp;quot; layer for the player ship, the gems, and all of the weapons&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;The &amp;quot;above everything&amp;quot; explosions layer&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;The UI layer to show the score and the quick key listing&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Each layer becomes, essentially, a collection of sprites.&amp;nbsp; Especially if you treat your primatives (drawn circles, rectangles, lines) and text as sprites, which I plan to do.&amp;nbsp; Sprites move around freely in game space.&amp;nbsp; Layers are drawn from back to front, and the current camera determines what part of that game space actually makes it to be displayed on the player&amp;#39;s screen.&lt;/p&gt;
&lt;p&gt;So, why put things in layers?&amp;nbsp; Why not just assign each sprite a &amp;quot;z&amp;quot; (or depth) value and allow DirectX to sort the order to draw things in?&amp;nbsp; Because I would like the programmer to easily be able to apply logic to all sprites in a layer at the same time.&amp;nbsp; Also, it will make for a logical grouping within which to breakup update and draw processes, if the game programmer wishes.&amp;nbsp; While &lt;em&gt;Nimble2D&lt;/em&gt; will be designed to very easily draw everything on screen, it will still allow the programmer some capability to mix in some of their own drawing code if they wish (perhaps to render a true 3D object in amongst the layers somewhere).&lt;/p&gt;
&lt;p&gt;Just as sprites will be able to move around, rotate and scale, cameras will be able to move around, rotate and scale/zoom ... and this will be reflected in how the sprites are drawn to the screen.&amp;nbsp; However, there will also be some &amp;quot;over layers&amp;quot; available within a game space that will not be impacted by the camera.&amp;nbsp; These over layers will be used to render UI components and messages onto the screen (after the camera shot is drawn) and always have them show up in the same screen location, no matter what is going on with the camera.&lt;/p&gt;
&lt;p&gt;For most of what I&amp;#39;ll be doing with &lt;em&gt;Nimble2D&lt;/em&gt; to start, I&amp;#39;m just going to work with a single camera per game space, which will be drawing directly to the backbuffer.&amp;nbsp; However, I will also be keeping in mind that this system will eventually allow for multiple cameras in a game space, which will draw to their own render targets and those resulting graphics will be assembled onto the screen by the game space ... this will make it easy to do split screens for player-versus-player type games or games which might need to track multiple locations in the game space at the same time.&lt;/p&gt;
&lt;p&gt;At the highest level -- the Nimble2D class itself -- each game space that is created will be tracked by the system.&amp;nbsp; A call to Nimble2D.UpdateAll will push update calls down through the camera, layers and sprites of the current game space (and every game space that is setup to do &amp;quot;background updates&amp;quot;, which I will get into at a different time).&amp;nbsp; Drawing everything in the current game space to the screen will be done with Nimble2D.DrawAll, and switching between screens will be as easy as setting a different game space as Nimble2D.CurrentGameSpace.&amp;nbsp; As mentioned, there will also be finer-grain controls available to allow the programmer to update and draw just the pieces as is needed.&amp;nbsp; This also sets a nice framework for easily allowing full-screen fade-in and fade-out and other fun stuff.&lt;/p&gt;
&lt;p&gt;For now, let&amp;#39;s put it all together with this graphic of a single game space:&lt;/p&gt;
&lt;p&gt;&lt;img height="400" alt="Nimble2D Game Space Visualization" src="http://www.frontiernet.net/~mattandbritt/GraphicsLayers.jpg" width="400" align="top" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;It shows multiple layers resulting in a collection of sprites within the game space.&amp;nbsp; A camera presents a portion of the game space to the screen.&amp;nbsp; And over layers are added to give the player a single frame of the game.&lt;/p&gt;
&lt;p&gt;2D game programmers will need to shift their thinking a bit from managing things within the scope of &amp;quot;screen space&amp;quot; to managing things within &amp;quot;game space&amp;quot; and grouping those things into layers ... and to how they wish to position the camera to show the game to the player.&amp;nbsp; (This also presents a programming challenge for the NimbleInput class -- giving mouse coordinates in both screen and game space ... but that&amp;#39;s exactly where a library like this is supposed to make things easy on the game programmer, right?)&lt;/p&gt;
&lt;p&gt;There is a lot of class skeletons and methods to get into place just to draw some simple sprites on the screen.&amp;nbsp; But once those are in place, the actual game code writing should become much easier, and we can then start fleshing things out to add value quickly.&lt;/p&gt;
&lt;p&gt;-Matt&lt;/p&gt;&lt;img src="http://ilovevb.net/Web/aggbug.aspx?PostID=80" width="1" height="1"&gt;</description><category domain="http://ilovevb.net/Web/blogs/nimble2d/archive/tags/Nimble2D/default.aspx">Nimble2D</category><category domain="http://ilovevb.net/Web/blogs/nimble2d/archive/tags/GameSpace/default.aspx">GameSpace</category><category domain="http://ilovevb.net/Web/blogs/nimble2d/archive/tags/Layers/default.aspx">Layers</category><category domain="http://ilovevb.net/Web/blogs/nimble2d/archive/tags/Sprites/default.aspx">Sprites</category><category domain="http://ilovevb.net/Web/blogs/nimble2d/archive/tags/Cameras/default.aspx">Cameras</category></item><item><title>Graphics Enumeration and Launching the Game Form</title><link>http://ilovevb.net/Web/blogs/nimble2d/archive/2008/01/21/graphics-enumeration-and-launching-the-game-form.aspx</link><pubDate>Tue, 22 Jan 2008 03:41:00 GMT</pubDate><guid isPermaLink="false">f079997d-67b3-4d49-aaea-86507d683840:78</guid><dc:creator>MattWorden</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://ilovevb.net/Web/blogs/nimble2d/rsscomments.aspx?PostID=78</wfw:commentRss><comments>http://ilovevb.net/Web/blogs/nimble2d/archive/2008/01/21/graphics-enumeration-and-launching-the-game-form.aspx#comments</comments><description>&lt;p&gt;When it comes time to write a new game, I&amp;#39;d like to be able to tell my graphics library the various screen styles that the game wants to make available to the player and then have the library figure out which ones are supported by the player&amp;#39;s computer.&amp;nbsp; This will be how Nimble2D does things ... receive a list of requested screen styles, look at each available adapter for support for the requested style, and provide back a list of available screen styles.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Here&amp;#39;s how the graphics enumeration testing app starts things off:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Nimble2D = New clsNimble2D()&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#39;At least 1 video adapter is needed to continue ...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If Nimble2D.Adapters_Count &amp;lt; 1 Then&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; Application.Exit()&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; Exit Sub&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#39;--- Change this list to reflect requested screen styles ---&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Nimble2D.AddRequestedScreenStyle(800, 600, False)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Nimble2D.AddRequestedScreenStyle(800, 600, True, clsNimble2D.enumColorDepth.CD_32bit)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Nimble2D.AddRequestedScreenStyle(800, 600, True, clsNimble2D.enumColorDepth.CD_16bit)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Nimble2D.AddRequestedScreenStyle(900, 400, False)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Nimble2D.AddRequestedScreenStyle(1024, 768, True, clsNimble2D.enumColorDepth.CD_32bit)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Nimble2D.AddRequestedScreenStyle(1024, 768, True, clsNimble2D.enumColorDepth.CD_16bit)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#39;---&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Then the start-up form cycles through the available styles for the selected adapter:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#39;Load Screen Styles List Box&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If modGame.Nimble2D.AvailableScreenStyles_Count(Me.cboAdapters.SelectedIndex) &amp;gt; 0 Then&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; For j As Integer = 0 To&amp;nbsp;&lt;/em&gt;&lt;em&gt;modGame.Nimble2D.AvailableScreenStyles_Count(Me.cboAdapters.SelectedIndex) - 1&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; Me.lstScreenStyle.Items.Add(modGame.Nimble2D.AvailableScreenStyleName(Me.cboAdapters.SelectedIndex, j))&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Me.lstScreenStyle.SelectedIndex = 0&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;That gets us this far:&amp;nbsp; &lt;img height="204" alt="Nimble2D Graphic Enumeration Startup Form" src="http://www.frontiernet.net/~mattandbritt/Nimble2D_GfxEnum_1_small.jpg" width="228" align="top" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;Once the&amp;nbsp;player selects the adapter and screen style and clicks &amp;quot;Launch&amp;quot;, the game&amp;#39;s code creates an instance of a game form and asks Nimble2D to launch it on the requested adapter in the requested screen style:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GameForm = New frmGame()&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Nimble2D.LaunchGameScreen(GameForm, AdapterIndex, ScreenStyleIndex)&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Which results in this:&amp;nbsp;&amp;nbsp; &lt;img height="200" alt="Nimble2D Graphics Enumeration Launched Game Form" src="http://www.frontiernet.net/~mattandbritt/Nimble2D_GfxEnum_2_small.jpg" width="450" align="top" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;So ... how&amp;#39;s it done?&amp;nbsp; Well, SlimDX (which is what Nimble2D uses to access DirectX) makes a number of enumeration functions and properties available.&amp;nbsp; The available adapters are grabbed when Nimble2D is first constructed, using this code:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Direct3D.Initialize()&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Me.varAdapters_Count = Direct3D.AdapterCount()&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; For j As Integer = 0 To Me.varAdapters_Count - 1&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; Me.varAdapter(j) = Direct3D.GetAdapterIdentifier(j).Description&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;The handling of requested screen styles is a bit more complicated.&amp;nbsp; So, instead of giving code here, I&amp;#39;ll walk through the steps.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;div&gt;The supplied parameters for screen style are:&amp;nbsp; Width, Height, FullScreen, and ColorDepth&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;If FullScreen = False, then the ColorDepth is assumed to be whatever the primary adapter is currently set to, and the screen style will be considered available as long as the Width and Height are smaller than the current screen size&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;If FullScreen = True, then each adapter is run through the various formats for the given ColorDepth in preference order.&amp;nbsp; As soon as a supported format in the given Width and Height is found, then it is marked as available for that adapter.&amp;nbsp; The first-found supported format is noted to be used later if that screen style is selected for the launch.&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;When the game requests for the game form to be launched, Nimble2D resizes the supplied game form to the width and height of the selected screen style, shows the form, and creates the Direct3D Device:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GameForm.Size = New Size(varSelectedScreenStyle.Width, varSelectedScreenStyle.Height)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GameForm.Show()&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim presentparams As New PresentParameters&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; presentparams.BackBufferWidth = varSelectedScreenStyle.Width&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; presentparams.BackBufferHeight = varSelectedScreenStyle.Height&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If varSelectedScreenStyle.FullScreen Then&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; presentparams.BackBufferFormat = varSelectedScreenStyle.BackBufferFormat&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; presentparams.Windowed = False&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Else&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; presentparams.Windowed = True&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; presentparams.DeviceWindowHandle = GameForm.Handle&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; varD3D_Device = New Device(AdapterIndex, DeviceType.Hardware, GameForm.Handle, CreateFlags.HardwareVertexProcessing, presentparams)&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;The next thing to tackle is the main skeleton structure that will be used to get graphics on the screen ... Game Spaces (and their cameras), Layers, and Sprites.&lt;/p&gt;
&lt;p&gt;-Matt&lt;/p&gt;
&lt;p&gt;p.s. When requesting a screen style that is full screen, only 16- and 32-bit color depths are allowed.&amp;nbsp; The various formats (5 to 6 in each color depth) are checked in order of &amp;quot;preference&amp;quot;.&amp;nbsp; If someone reading this has strong knowledge about graphics formats and in what order preference should be given, please post a comment or send me an e-mail ... I have some questions for you. ;-)&lt;/p&gt;&lt;img src="http://ilovevb.net/Web/aggbug.aspx?PostID=78" width="1" height="1"&gt;</description><category domain="http://ilovevb.net/Web/blogs/nimble2d/archive/tags/Nimble2D/default.aspx">Nimble2D</category></item><item><title>Breaking Up the Solution, and How I Program</title><link>http://ilovevb.net/Web/blogs/nimble2d/archive/2008/01/16/breaking-up-the-solution-and-how-i-program.aspx</link><pubDate>Wed, 16 Jan 2008 17:56:00 GMT</pubDate><guid isPermaLink="false">f079997d-67b3-4d49-aaea-86507d683840:75</guid><dc:creator>MattWorden</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://ilovevb.net/Web/blogs/nimble2d/rsscomments.aspx?PostID=75</wfw:commentRss><comments>http://ilovevb.net/Web/blogs/nimble2d/archive/2008/01/16/breaking-up-the-solution-and-how-i-program.aspx#comments</comments><description>&lt;p&gt;I expect, in the&amp;nbsp;end,&amp;nbsp;&lt;em&gt;Nimble2D&lt;/em&gt;&amp;nbsp;will be a rather full-featured library for making games -- graphics, particles, collisions, input, sound effects, music, etc.&amp;nbsp; But to get there, I will need to break things up into manageable chunks, building higher priority things first, then fleshing-in the more detailed things.&amp;nbsp; I expect there to be a core set of projects to handle graphics, input, and sound, with a few add-on projects to handle more specialized things such as asset handling, multi-language, tile maps, etc.&lt;/p&gt;
&lt;p&gt;The expected core projects:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;&lt;strong&gt;Nimble2D&lt;/strong&gt; -- The Graphics System -- handling graphics capabilities enumeration &amp;amp; screen launching, game spaces, layers, cameras, sprites, trig, primatives, text, particles, and anything else that has to do with graphics.&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;div&gt;&lt;strong&gt;NimbleLog &lt;/strong&gt;-- Easy Log File Writing -- a lowly project, but quite useful ... I like to write log files -- not sure I have more to say on that topic. ;-p&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;strong&gt;NimbleInput&lt;/strong&gt; -- The Input System -- handling keyboard, mouse, and game controller input, mouse-to-game-object relations, key-to-action mapping, and other things having to do with the player interacting with the game.&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;strong&gt;NimbleSound&lt;/strong&gt; -- The SFX &amp;amp; Music System -- for SFX:&amp;nbsp; volume/pan control,&amp;nbsp;sprite-position-based volume/pan, delayed/repeated firing; for music: music file categorizing,&amp;nbsp;queueing &amp;amp; shuffling, fade-in/fade-out ... and other things sound-related.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Some probable add-on projects:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;
&lt;div&gt;&lt;strong&gt;NimbleMap &lt;/strong&gt;-- Tile Map handling -- what&amp;#39;s a good 2D graphics library without a nice-and-easy way to work with tile maps?&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;strong&gt;NimbleAssets&lt;/strong&gt; -- Asset Data handling (aka &amp;quot;Pack File handling&amp;quot;) -- a library-style approach to getting game assets and data out of packed and encrypted data files.&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;strong&gt;NimbleLang&lt;/strong&gt; -- Multi-Language handling -- a library-style approach to getting language-specific text phrases and making multi-language support easier.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;I expect to work on them essentially in the order I listed them.&amp;nbsp; But, as I said, I will probably build working frames around the main features, move on to the next one, then come back to flesh something out in an earlier project as I find it needed.&lt;/p&gt;
&lt;p&gt;This leads into how I work as a programmer.&amp;nbsp; I am quite new to .Net, although I&amp;#39;m not new to VB.&amp;nbsp; I broke my teeth on Commodore BASIC, Quick BASIC, and Pascal while I was in high school and early college.&amp;nbsp; Then, I wandered in the wilderness for a while after changing my major in middle and later college.&amp;nbsp; Once I was out in the working world, I became aware of VB3 and the VBA tucked inside MS Access 2.0.&amp;nbsp; I quickly progressed to VB6 (which I&amp;#39;ve done both business and game programming in) and I&amp;#39;m still working with Access/VBA.&amp;nbsp; So, it&amp;#39;s only been a few months that I&amp;#39;ve seriously tried to work on VB.Net and C# projects,&amp;nbsp;which means that I&amp;#39;m rather new to strong object-oriented approaches -- especially with games&amp;nbsp;... and I will likely be doing things &amp;quot;wrong&amp;quot; and in &amp;quot;non-traditional&amp;quot; ways.&amp;nbsp; If you see something completely out of the norm, or something that can be done much more effeciently in another way, please be sure to make a comment or send me a message about it.&lt;/p&gt;
&lt;p&gt;I&amp;#39;m a very practical worker, and while I can discuss and design just on theory, I usually need a practical example to develop for.&amp;nbsp; In this case, the practical purpose for &lt;em&gt;Nimble2D&lt;/em&gt; is to help me build my current game, &amp;quot;Air Ralley Ace&amp;quot; (ARA), which is an arcade airplane racing game involving scrolling landscapes, layered clouds,&amp;nbsp;and lots of&amp;nbsp;colored smoke.&amp;nbsp; As I make progress, I will very likely be using ARA examples to show off capabilities.&lt;/p&gt;
&lt;p&gt;So ... first-things-first ... I need &lt;em&gt;Nimble2D&lt;/em&gt; to be able to let the game know a bit about the player&amp;#39;s graphics card -- texture size/shape support, supported full screen sizes and color depths -- and be able to launch the selected screen style.&lt;/p&gt;
&lt;p&gt;-Matt&lt;/p&gt;&lt;img src="http://ilovevb.net/Web/aggbug.aspx?PostID=75" width="1" height="1"&gt;</description><category domain="http://ilovevb.net/Web/blogs/nimble2d/archive/tags/NimbleOverview/default.aspx">NimbleOverview</category><category domain="http://ilovevb.net/Web/blogs/nimble2d/archive/tags/Nimble2D/default.aspx">Nimble2D</category></item><item><title>A Nimble Launch</title><link>http://ilovevb.net/Web/blogs/nimble2d/archive/2008/01/15/a-nimble-launch.aspx</link><pubDate>Tue, 15 Jan 2008 19:24:00 GMT</pubDate><guid isPermaLink="false">f079997d-67b3-4d49-aaea-86507d683840:74</guid><dc:creator>MattWorden</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://ilovevb.net/Web/blogs/nimble2d/rsscomments.aspx?PostID=74</wfw:commentRss><comments>http://ilovevb.net/Web/blogs/nimble2d/archive/2008/01/15/a-nimble-launch.aspx#comments</comments><description>&lt;p&gt;&lt;img height="62" alt="Nimble2D Logo" src="http://www.mwgames.com/_uimages/Nimble2D_Logo_Small.jpg" width="168" align="left" border="0" /&gt;On this first post of the new blogspace for &lt;em&gt;Nimble2D&lt;/em&gt;, I&amp;#39;d like to do two things:&amp;nbsp; (1) Give credit where it is due, and (2) give a brief overview of how I see this project at the start.&lt;/p&gt;
&lt;p&gt;So, credit ... First, a big thank you to &lt;a class="" title="Chris Williams Profile" href="http://ilovevb.net/Web/members/admin.aspx" target="_blank"&gt;Chris Williams&lt;/a&gt;&amp;nbsp;for setting up ilovevb.net (a perfectly logical place for a project like this to land), and for providing the space and resources for me to blog about the project.&amp;nbsp; Second, I have to give a lot of credit to Dave Munsie of &lt;a class="" title="JGOware Homepage" href="http://www.jgoware.com/" target="_blank"&gt;JGOware&lt;/a&gt;&amp;nbsp;for his now-extinct DXGame engine, which really opened my eyes to how powerful doing 2D-via-3D could be.&amp;nbsp; (Now go to his site and play &lt;em&gt;Retroblast&lt;/em&gt; ... then read the rest of this.)&amp;nbsp; Third, my recent epiphany on how to approach things with this project came about by reading &lt;a class="" title="the xna machine blog" href="http://xnamachine.blogspot.com/" target="_blank"&gt;the xna machine&lt;/a&gt; blog, where the concepts of matrix math and how game objects relate to one another (and to the camera) really became clear.&amp;nbsp; If you want to see some &lt;strong&gt;very&lt;/strong&gt; neat VB.Net + XNA work taking place, be sure to check out that blog.&lt;/p&gt;
&lt;p&gt;And&amp;nbsp;finally, my traditional shout-out to the crew at the Game Programming Wiki (&lt;a class="" title="Game Programming Wiki" href="http://gpwiki.org/" target="_blank"&gt;gpwiki.org&lt;/a&gt;), who provide a nice combination of friendly interaction and good brains to be picked.&lt;/p&gt;
&lt;p&gt;Now, the project ... as given in the brief description: &lt;i&gt;Nimble2D&lt;/i&gt; is a 2D game development library for .Net, based on SlimDX and DirectX9. It will use Direct3D9&amp;#39;s Sprite functionality to create a fast 2D environment (with real-time rotation, scaling and blending), mobile cameras, sprite-based text and primatives, and real-time sound effect panning and volume based on sprite locations.&amp;nbsp; But first, I&amp;#39;ll explain how I got here ... and where I think I&amp;#39;ll be going.&lt;/p&gt;
&lt;p&gt;I came to the point of writing my own 2D library due to a number of reasons.&amp;nbsp; First, my trusty tools that I&amp;#39;ve been using (VB6 + DXGame) are a bit long in the tooth ... although I&amp;#39;m happy with what they allowed me to do with &lt;a class="" title="Gem Raider" href="http://www.mwgames.com/gemraider.asp" target="_blank"&gt;&lt;em&gt;Gem Raider&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&amp;nbsp; Still, there were things that I wanted to do differently and I wanted to have a reason to get to use the .Net programming languages.&amp;nbsp; I was about half-way done with my &lt;a class="" title="Early Screen Pictures and Info on &amp;quot;Air Ralley Ace&amp;quot;" href="http://www.mwgames.com/MessageBoard/viewtopic.php?t=335" target="_blank"&gt;new game project&lt;/a&gt;&amp;nbsp;when it struck me that I should probably find a new set of tools to make the game with ... it would give me a very practical example of a game that I&amp;#39;d want to make, and a reason to learn how to use those new tools.&amp;nbsp; So, I looked around a bit and didn&amp;#39;t quite find what I was looking for.&amp;nbsp; XNA was a bit requirements-heavy for my taste (I don&amp;#39;t actually have a computer in my house that can install Game Studio Express due to OS or graphics card requirements) ... SDLdotNet didn&amp;#39;t have real-time rotation nor additive blending (DXGame had spoiled me) ... Torque Game Builder didn&amp;#39;t seem to fit my personal style ... and BlitzMax would require learning a BASIC-like language that wouldn&amp;#39;t be very useful in a work setting.&amp;nbsp; So, I settled on VB.Net as my language (although I&amp;#39;ll probably play around with C# as well) and looked for a way to tap into DirectX.&amp;nbsp; That&amp;#39;s when I found &lt;a class="" title="SlimDX Wiki" href="http://slimdx.mdxinfo.com/wiki/index.php?title=Main_Page" target="_blank"&gt;SlimDX&lt;/a&gt;&amp;nbsp;... and suddenly everything came together.&amp;nbsp; Now all I need is to put together a fast, flexible 2D system ...&lt;/p&gt;
&lt;p&gt;And that leads to &lt;em&gt;Nimble2D&lt;/em&gt;.&amp;nbsp; Why &amp;quot;nimble&amp;quot;?&amp;nbsp; Well, frankly, all of the other names that I came up with first were taken or were hard to pronounce.&amp;nbsp; It was while I was describing to my wife (bless her for standing there and listening) how I wanted the cameras to work that I first used the word &amp;quot;nimble&amp;quot; as a descriptive ... and then I paused and ran over to Google for &amp;quot;nimble&amp;quot; combined with &amp;quot;game engine&amp;quot; and for &amp;quot;Nimble2D&amp;quot; ... and then I had the name.&lt;/p&gt;
&lt;p&gt;So, here are some of the main concepts ... Imagine having a &amp;quot;game space&amp;quot; that is a flat surface, like a table top, to work on.&amp;nbsp; All of your in-game objects (sprites) are put down onto the game space in layers.&amp;nbsp; A camera is then hovered above the layered game space and snaps a picture of the current frame.&amp;nbsp; That camera should be able to move to frame the game space in whatever way the programmer would like, including rotation and zooming.&amp;nbsp; Now imagine having multiple game spaces to organize different aspects of a game -- a &amp;quot;main menu&amp;quot; game space, a &amp;quot;high score&amp;quot; game space, a &amp;quot;world map&amp;quot; game space, etc. -- and being able to switch between these spaces the same way a TV show director switches between his various sets.&amp;nbsp; This is the approach being taken with &lt;em&gt;Nimble2D&lt;/em&gt;.&amp;nbsp; It&amp;nbsp;will be&amp;nbsp;a sprite-based, camera-based, matrix-based, real-time 2D-via-3D system ... and the library should allow the game programmer to just work with the traditional 2D settings (X, Y, Facing Angle, etc.).&lt;/p&gt;
&lt;p&gt;Along the way, I hope to pack in some tricks I&amp;#39;ve learned as standard goodies within the libraries.&amp;nbsp; So now all I need to is write some code ... ;-)&lt;/p&gt;
&lt;p&gt;-Matt&lt;/p&gt;&lt;img src="http://ilovevb.net/Web/aggbug.aspx?PostID=74" width="1" height="1"&gt;</description><category domain="http://ilovevb.net/Web/blogs/nimble2d/archive/tags/NimbleOverview/default.aspx">NimbleOverview</category><category domain="http://ilovevb.net/Web/blogs/nimble2d/archive/tags/KudosToOthers/default.aspx">KudosToOthers</category><category domain="http://ilovevb.net/Web/blogs/nimble2d/archive/tags/Nimble2D/default.aspx">Nimble2D</category></item></channel></rss>