Monday, 07 May 2007


Link of the day:

Sauerbraten (a.k.a. Cube 2) is a free multiplayer/singleplayer first person shooter, built as a major redesign of the Cube FPS.

Friday, 04 May 2007

First Model

Whoohoo. My first real model: a speed sign.

I used a combination of Inkscape (to draw the initial idea), Milkshape3D (create the model), Unwrap3D (to do UV mapping) and Photoshop (to create textures).

More models to come.

Thursday, 03 May 2007

Rocket Commander

David blogged about this in his blog and I just want to reiterate it:

Rocket Commander is a... well... interesting little game that, personally, I found pretty boring as far as gameplay is concerned. However, from a technical-learning-games-programming point of view it is a goldmine of useful information. The game was written by Benjamin Nitschke and is free--with source code.

There's a very informative page on MSDN that has a few tutorials on Rocket Commander. Check it out--they're really, really useful.

Now I just gotta get my hands on Benjamin's book.

Tuesday, 01 May 2007


I've been playing around a lot and browsing copious amounts XNA tutorials. Some of them amazing, some of them outright lame (I'm not going to link the lame ones).

I figured out how I'm going to do gamestate. I've tried a number of different ways and the one that I think works best is to maintain a stack of "GameScreen" objects. Each game screen is loaded on the top of the stack and disables the one before it. As the screen is dismissed, it reveals the previous one.

I have a working copy--screenshot won't show much though:

I've also been playing around with additive transparency on sprites. Most notably, for glowy bullets. I managed to get bullets but they're not really "glowy":

Oh, and ArcTan(x/y)--how I hate thee. Turns out that if you divide a negative by a negative then you get a positive--who would have guessed *grin*.

I had to do this hacky check to get my firing angle to work:

firingAngle = (float)(Math.Atan((double)y / (double)x));
if (x < 0) firingAngle += MathHelper.Pi;

And with that, it's off to bed.