Another Page for Project Shift

It’s been a while since my last video, but it was definitely time away well spent; this is the latest with my Project Shift. The game engine is running very smoothly, and as you can see in the video, I’ve added some fun and interesting things–hint hint, elevators, mine carts, and explosive needles.

Enjoy the video, and as always, feel free to leave some feedback.

Leave a comment

Number Display

In my previous post, I mentioned a Number Display that I had created in order to display numbers to the screen without creating any garbage. I thought some people might find it useful, so here it is. It’s relatively simple. You initialize it with a GraphicsDevice, SpriteFont, and some magnitude to define the general size. The Number Display will then create a number palette to be used in displaying the numbers. To draw a number, use the Draw(…) function passing in the number you want to display. The Number Display will finally use a Spritebatch to draw all of the different digits from the palette. Since no strings are used, no garbage is created.

public class NumberDisplay
    GraphicsDevice drawDevice;
    SpriteBatch drawBatch;
    Texture2D numberTex;
    Rectangle[] aryNumberRects = new Rectangle[10];

    public NumberDisplay(GraphicsDevice newDevice, SpriteFont newFont, int digitMagnitude)
        drawDevice = newDevice;
        drawBatch = new SpriteBatch(drawDevice);

        int rectSize = 2 * digitMagnitude;
        RenderTarget2D newRender = new RenderTarget2D(drawDevice, 10 * rectSize, rectSize, false,
            SurfaceFormat.Color, DepthFormat.None, 0, RenderTargetUsage.PreserveContents);

        // Create draw rects and texture map

        Vector2 digitDim;
        for (int i = 0; i < aryNumberRects.Length; i++)
            digitDim = newFont.MeasureString(i.ToString());
            aryNumberRects[i] = new Rectangle(i * rectSize, 0, rectSize, rectSize);
            drawBatch.DrawString(newFont, i.ToString(), new Vector2(
                aryNumberRects[i].Center.X, aryNumberRects[i].Center.Y), Color.White,
                0.0f, Vector2.Zero, rectSize / Math.Max(digitDim.X, digitDim.Y), SpriteEffects.None, 0.0f);

        numberTex = newRender;

    // ***** ACCESSORS *****

    public Texture2D NumberPalette { get { return numberTex; } }

    // ***** USER METHODS *****

    public void Draw(int drawNum, Vector2 drawPos)
        int drawDigit = drawNum;
            drawDigit = drawNum % 10;
            drawBatch.Draw(numberTex, drawPos, aryNumberRects[drawDigit], Color.White);
            drawPos.X -= aryNumberRects[drawDigit].Width;
            drawNum = drawNum / 10;
        } while (drawNum > 0);

Leave a comment

More on the Garbage Collector

Pooled Objects

I had been meaning to come up with some sort of number display so I can write numbers (like the amount of Garbage) to the screen without worrying about it creating garbage. Well, I finally got around to it, and low and behold, my GC came to a complete halt. At first, I wasn’t so sure–perhaps my new number display was a bit off–so I threw in a couple lines that would specifically create garbage. Sure enough the GC kicked right back up again.

As you can imagine, I’m very happy. Now I can know what, exactly, is causing garbage the second I add it in. And already I’ve realized that I was wrong in thinking every class object that is added to a list creates garbage; it doesn’t! When I added those lines to test my display, I apparently had made an error. I added some class objects to a list that were from my already created pool of objects. The problem was that I still wasn’t seeing any garbage. I got a little worried because I figured that that meant there was a bug in my number display, but after a few minutes, I discovered the error.

Rather than adding objects from my pool, I added some newly creates ones–empty objects created in-line with the list. I ran the program and there it was; the GC was creating garbage again.

All this time, I always thought that that adding any class reference to a List would create garbage, but that’s not the case. As long as you add a reference form an object that will never be destroyed–say, one from an object pool–then no garbage will be created.


Leave a comment

Project Shift Teaser

Still no name, but it’s got a lot of game play.


Leave a comment

Project Shift: After the Crash

I decided it was time to make the first map. A lot of the game engine is functioning pretty well though the AI needs some work. I’ve already got most of the story laid out, but now it’s just a matter of creating all of the different models, textures, etc. I have to say that I’m very pleased with the Fbx Custom Processor. I don’t think I could ever have imagined creating a map like this one using Natur.

Check out the video; I would love some honest feedback.

Leave a comment

Project Shift: Still Going Strong

It’s late so I’m not going to write much, but I’ve been working hard on my current project. Here’s a little blurb on some of the things taking shape. I basically spent the weekend reshaping my engine a bit to¬†accommodate¬†a campaign type system. Still using Blender along with my Fbx Map processor to create everything.

Leave a comment

Project Shift and a new Fbx Map Processor

I’ve been working on a new custom content pipeline that reads maps, including bounding meshes and game logic, from an Fbx file. In the video below, I created the entire map using Blender.

1 Comment