Today it dawned upon me that I forgot something important in the geometry
generation engine of my game: How can the player distinguish the goals from the
traps? Both are holes, only that the former one makes you win the game while
the latter one makes you lose the game. Oops! 🙂
After today’s changes, the maze consisted of three parts: The walls, the floor
(with donut gaps around holes that are goals) and the goal rings. The goal rings
fill the gaps left open in the floor and use a different effect that draws a
checkered flag texture so the player can clearly recognize the goal holes.
All that’s left now is to polish the game a bit, add gamepad support and create
the 10 challenge mode levels. Looking back at the progress, I have to say that
I underestimated the amount of work required quite a bit. It’s great to see
some interest from the XNA community, some people have linked me in their blogs
and I even got interviewed about my game and my thoughts on XNA. More on that if
everything works out as expected.
The release of “Project Balance” will be on December 11th the same day the
XNA final is due.
Finally got a new graphics card. I had seriously considered buying a GeForce 8800,
but given the card’s insane price tag, the fact that I’m developing for XNA
(nothing to gain from DirectX 10) and ATI’s recent announcement about their
next generation GPU being out soon to lower the prices, I decided to go for a
cheap ATI Radeon X1950 card.
I didn’t totally stop working on the game, however, and wrote a small menu system
that I now use to display the game’s main menu and the level selector. Debugging
could still be accomplished running the game in a 320×240 window by using the
reference rasterizer for rendering, which produces about 1 frame in the time it
takes you to wash your car, take a walk or phone a friend…
Aforementioned menu system is already being used to drive the main menu and
a level selector, both fully working at the time of this writing. The buttons
themselfes are looking rather dull and I’m not sure yet whether I should just try
to do my best in Paint.NET or whether I should go looking for an artist…
There will be 10 built-in levels that the player can try to beat in a certain
time to complete the game. I think 10 levels are just right to entertain the
player for a while and then let him off before the game gets boring. I truly
think it’s a nice and fun game, but, after all, it’s just a ball rolling around
on a table — hardly enough variety to make 100 levels worthwhile 🙂
This Monday, my graphics card decided that 18 months of service
are more than enough and, well, quit. During bootup, it now displays
utter garbage and as soon as windows loads the graphics driver,
it hangs. The only good thing is that, as long as I run the
generic VGA driver, my desktop displays fine.
I guess I should have taken the scratching noises that the card’s
fan made for some months now more serious. The fan is still
rotating, but probably not at full speed. Needless to say that this
is quite a show stopper for my XNA development during this week,
still hoping that the new card I ordered will be here before the
Becoming an independent software developer is the dream of many people
doing their daily 9-to-5 slavery. It is mine, too. However, you can’t just
decide to do this step, quit your job and tomorrow you’re
an independent developer.
If you decide to walk this path, you will first be forced to give up a lot
of your precious free time by working on your own projects on the evenings
and weekends in addition to your day job. You’ll have to do this for months
or even years to come in order to build a portfolio of products
that generate enough additional income so you can switch to only working
your day job half-time.
That’s exactly the point I’m at now and I’ve got the feeling that, just
like in a marathon race, there will be a time when you reach the thirty
kilometer mark and you’ll ask yourself: “Why am I doing this?”. Then you
need a good answer that keeps you going, one that gives you drive.
My 5 reasons for becoming and indie, for going all the way, will be:
I want to set my own times. With a job, I cannot just
decide to go out jogging on sunny days or when I feel like it. It’s
depressing to get up while it’s dark, work the entire day and drive
home in the dark again during the winter months.
I want to decide what I do, and why. In the corporate
environment, you are assigned a task and then that’s what you’re going
to do. Granted, I have quite some influence here in my current job,
but I still have to help fulfill the company goal. It’s like driving
in a bus: You are free to choose your seat, but you have to cope with
other passengers and neither the route nor the time are under
I want to be proud of what I produce. At least for me, things
produced in the corporate environment never live up to my standards. There are
other developers with other priorities that produce tons of uncommented, badly
abstracted code all the time. I’m not free to choose whether I accept these
people on my team or not. I have to live with them.
I want to become rich. You’re reading right. Call me a dreamer
then, a heretic even, for thinking that I can become rich as an indie developer.
But fact is, I do. One thing should be clear: You will not become rich as
a corporate working slave. If you want to get the money, you need to be the one
in control. Maybe I’ll have to turn my indie business into a startup game
development company some day to achieve this goal. So be it. I will not stop there.
I want to be in control. Have a bad feeling about some concept and
would rather put it aside to see how it develops before doing the grunt work?
Forced to do crunch time but know for sure that the deadline is but
an artificial one? It’s not about choosing the easy way out – it’s about
who decides what to do!
I have found a way to solve the ball-falling-into-hole simulation that I am
quite happy with as it won’t let the ball sink into the solid parts of the floor
and still looks convincing. As soon as the ball crosses a hole, I remember that
hole and start the ball’s downward acceleration. While the ball is falling, I
adjust its position towards the holes center as far as needed so it doesn’t
intersect with the outline of the hole.
With the gameplay mechanics working well, I spent some more work implementing the
actual logic. The gameplay controller now knows the game status and updates it
accordingly when the time runs out, the ball falls into a wrong hole or into
the exit hole.
Next component to implement was a simple game state management system. Originally
I didn’t want to do this, but as I see it now, I would otherwise end up coding
all the different states (main menu, level selector, ingame) into several big if
or switch statements which would be a very awkward way to handle this.
The first thing I did this day was to implement the Farseer physics engine into
my project. What a tremendous step forward. Not only was it easy to do, it also
delivered the results I had been hoping for from the moment on I got it working.
I’m still not sure what to do about the holes in the floor. Farseer is a pure
2D physics engine and it simulated the effect of tilting the maze board simply
by applying forces to the ball, but, essentially, the ball is a circle that’s
moving around inbetween rectangles for Farseer. Maybe I can get away with a fake
simulation where I apply forces that push the ball further towards the center of
the hole and let it accelerate downwards on the Y axis without the knowledge of
The ball is still looking rather dull and I’m beginning to think about
implementing real-time reflection mapping in my little game, so it properly
reflects the walls around it. The other solution would be to make the ball
non-reflective, however, however, the ball must not be textured since the
rotation would never be right as long as the physics are 2D.
Beta 2 of XNA Game Studio Express has been released to the public today. Porting
my code to Beta 2 took me about one hour since some genius decided to make the
all the model framework classes sealed and remove their generic versions. Also,
the GameServices collection now lost its generics as well and requires manual
While updating the code, I also broke something in the stencil buffer drawing
code which now, instead of limiting the shadow to shadowed regions, limits the
walls to holes in the floor. Fiddling around with the shader effect files for the
stencil and shadow drawing solved the problem.
Next, finding some swept circle vs. aligned rectangle collision detection code on
the net has prooven itself to be harder than it seemed. I don’t have the strong
math backgound needed to code such stuff myself. I ported the only code that
seemed usable, even thought it was originally intended for sphere/polygon
collisions. My first attempt at simple ball physics doesn’t go to well and I fear
I will have to integrate something like Ode at the end. Maybe the pure .NET
Farseer Physics Engine can fill this gap?
I just couldn’t stop thinking how cool it would be if the walls of the maze would
cast realistic shadows, so on Day 7, I began implementing stencil shadow volumes
in my little game. Generating the silhouettes, something I was scared of, has
been extremely easy since all you need to do is find all neighboring triangles
in a mesh where one triangle is facing away from the light source and the other
is facing towards the light source.
Generating quads for the silhouette edges wasn’t exactly difficult either after
I already generated the entire maze geometry programmatically. However, I didn’t
know what to do about the shadow caps, so I just left them be. This is not a
problem because the camera will never enter a shadow volume and the caps will
always be clipped by the Z buffer.
Finally, it was time to start with the gameplay code. I still needed to a
main menu, level selector, the game itself, maze/ball collision detection and
some dummy physics to make the ball behave in a realistic manner.
If you’re wondering why this screenshot now shows a Windows Vista frame,
this afternoon Windows XP self-destructed and took the whole partition with it.
Forced to reinstall from scratch, I decided to check out Windows Vista RC2…
On day 7, I finally completed the scene graph component. With this component,
it is easy to place the meshes of my game in relation to each other.
For example, the physics for the ball in my game are actually 2D (the ball
will never hop, no matter how quick or hard you tilt the maze). The ball will
be a child of the maze scene node. That means I only need to modify the ball
scene node’s position and do not have to take into account the maze’s current
rotation or where in the scene the box is placed. The scene graph handles
that automatically and efficiently for me.
There also is a new component to manage effect files: The
EffectManagerComponent. It loads and compiles effect files so
I don’t have to do it all manually.
I spent some time cleaning up what I had so far. The GameComponents
now make proper use of the GameServices concept and can handle
device resets as well as do clean shutdowns. Models can now release their resources
and will do so when it is required. All this has been implemented in a way that
I can still develop care-free and happens seemingly on its own.
My texture coordinates had some minor issues as well. Thanks to the
“show normals” shader in ATI RenderMonkey I was able to visually verify that
all normals and texture coordinates are continuous and correct.
I also spent some time writing code to generate the tilt knobs that will be
on the sides of my mounting box and added code to generate polygons for the
underside of the maze. So theoretically, you could now view the maze from
below as well. This also makes my entire geometry solid, meaning that there
are no leaks where you could see ‘inside’ an object, which is important if
I decide to try myself at shadow volumes later in the project.
For the rest of the day, I’ve been improving on my usage of the XNA model
classes and then designed a little scene graph system, as seen from the
current state of things, this is the cleanest way to decouple the scene
from the game logic. I need the scene building stuff separate because I want
to create a cool level selection system which renders previews of the maze.
It wouldn’t be the best thing to always have the game logic all over the
place when I just need an image of the maze!