Back to Lee's Homepage
Grinning Lizard Main Page
Screenshots
The Making of BEM
Grinning Lizard and BEM 1993-1996

General

BEM was written in C++ with the IBM cset compiler for OS/2. It has 745K of source code that took over two years to create. Most of the code has been re-written: parts of graphics engine are third iteration, while most of the code is second iteration.

Animation

BEM uses both traditional stop-frame animation and computer-generated animation. For the stop-frame animation I made models out of clay and cheap action figures gathered from bargain stores all over Blacksburg. Then they were sanded, painted, and mounted on a platform that could be rotated. Each animation frame was then "photographed" with a video grabber and video camera. Each figure has six walking frames, so the first frame was positioned, photographed from eight directions, then the second frame was positioned, etc. Many models had two additional frames: a "recoil" frame if the character got shot, and a "shooting" frame if it could fire. The images were cleaned with PhotoShop, then processed with in-house utilities, and inserted into the game.

These are partial animation frames for the Rhino Commander (RhinoCom, a wordplay on Rhintek's product.) I think it was my favorite character in the game to make. It has leather armor, a black battle skirt, and a very big gun.

The drone BEM got cut from It Crawled from the Net. (As did the Brainiac BEM.) The most complicated model, it has four arms as well as knee and ankle joints.

BEM also uses computer generated animation. (I used trueSpace 2.) I created the models on the machine, and told it to render away. You don't get the detail and "grittiness" of the clay models. On the other hand, the process is faster and one doesn't have to worry about all that video noise. The lighting was more accurate. There are some occasional inconsistencies between the light on the clay models and the light on the backgrounds, which were generated with trueSpace as well.

The Plants (partial frames.)

Room Graphics

The room graphics were rendered with trueSpace, and then retouched and modified with PhotoShop. Most room graphics have both pristine and mangled versions, which the game switches as the rooms get beat up. The path of every bullet fired is meticulously modeled by a 3D vector engine.

Putting it All Together

I wound up writing all this code to make the game run that's not in the game. There are programs to process images, assemble all the pictures into one big-honkin' graphics file, a construction set to build rooms (that was an undertaking), utilities to do math and make sure everything fits together correctly, etc. The assembly of all the pieces is a big process.

But it was a wonderful moment (after Bill and I also wrote part of the multi-player engine) when we connected the two computers and opened fire.

Opinion on C++ (Warning, techno-speak in this section)

I like C++ and think it was a good choice. C++ is a good tradeoff between speed and usability, at least for a video game. Adding encapsulation of variables (classes) and polymorphism to C was a beautiful idea and well thought out. "Messages" sent to a class are resolved as function calls by the linker, and I believe this is both wise and efficient. Languages that have objects throw run-time errors when asked to execute a function the object doesn't support have gone, in my opinion, way to far into OOP la la land. (I might eat these words later.) Another thing I like about C++ code is that with a header file, you have a roadmap to what the heck is going on, even with less than perfect commenting. A C header is just a list of function names, and one prays the programmer is also a good writer and explains well.

On the other hand, some of the syntax could be a wee bit less confusing. (Like declaring pointers constant, for instance.) I think C++ is becoming much too large and complex. They should have stopped adding to the language somewhere back at templates. The most dangerous pitfall of C++?

array = new int[15];
...
delete array;
Is a memory leak! There had to be a better way. That one is tedious to keep track of and every beginning C++ programmer does it. Whenever someone starts talking about their weird memory problems I search for that bug.


I'M MAD. YOU'RE MAD. WE'RE ALL MAD HERE.