Sunday, March 1, 2009

How do I start and complete a new game?

How do you start a project and bring it to completion? This isn't as easy as it sounds. We all have different level of motivation for making projects at home on our own time. Personally, I'm somewhat of a self learner in the programming profession. I started sharpening my programming skill before I was in high school, and the only way I could really learn anything was to create projects for myself almost every other month. Have I finished many of those applications? I've sold one of my programs to a few schools; one out of hundreds of applications that I "completed". My point is that "complete" needs to be defined, for any projects. My personal projects were always more about the learning experience than the end utility about the program in question. Once I learned what I needed from the experiment, I would move on, hence "complete".

The definition of "complete" is no more well defined in most work places. How often a programmer is given a certain task, asked how much time he thinks it will take him to complete it and the reply would be something like "Oh, for that no more than an hour". An hour goes by, you come back to the programmer and ask if it's done and he says "Yep, all done, I'm just finishing the review of it now. I'll have Jake go over it to make sure I didn't break anything, then I need to make sure it also builds and run on the target". Huh? What just happened, it's not done is it? Well, the programmer has a very different definition of done than a delivery manager or a producer. It might still need to be committed to the SCM and then submitted against a specific enhancement request, or maybe a defect. After that, it might need to be build as part of an automated build process and be unit tested. Then there's the smoke test on the build, installing on the target and QA finally needs to go through it. Ok, so maybe it's not to this extreme everywhere, but you get the point.

Define Complete
The best thing you can do to avoid a miscommunication of what you thought "complete" meant is simply to define it. Does complete means "when I'm done with it", or "when it's ready to be in the customers' hand". When you have a personal project, make sure you define what it is your goal. Do you want to make money out of the application, make a prototype that might get you some funding, or just playing around with a cool idea cause you want to learn? There's no bad answers, just make sure you know what it is.

Since I have starting working on my own time to develop on the IPhone, I now have different goals. Some of those goals are conflicting unfortunately. For example, the platform is rather new to me. I never did Objective-C or Cocoa programming before and never even owned a Mac. This means that I need to create some projects to learn. Thankfully, learning new language for me now isn't the same as when I was in 7th grade, when I did not quite understand how pointers worked. This means that my projects can be a little more varied and elaborate. I just need to accept that their might a bit of overhead to my normal programming velocity. I'm very surprised at how low that overhead is, to be honest. So it is possible to learn while making application that would be somewhat fun and useful. Ok, I'm not talking about Valentine Tips here. I didn't particularly enjoy working on that project, but I did learn a lot. My goal was mainly understanding the process that I was going to need to go through to publish the application on the Appstore. As such, it was a great success. A money maker, it was not :)

Come up with ideas
Duh! I know sounds stupid. What I mean by this is not to limit yourself at the first idea that pops into your mind. You need to come up with a TON of ideas. Don't go into too much details at first, prefer to go wide instead of deep. So you got a pirate game idea that you like; great, pirates are always cool. But wait, before you go into too much detail you come up with a cool Zombie idea. Obviously, those always work right? Now, what if you take the two games and take elements of each and turn it into a game? What do you have? Probably a law suite from Disney for infringing on Pirates of the Caribbean! So go back to the drawing board and start again! Every year, has a game contest, check out Four Elements IV Contest. Replace the pirates with robots and Zombie with Ninjas and your back in business. If you need inspiration, read books and comics, watch movies or watch sports. Look inside of you for different experiences that shape the person you are and see if you can use it to make a game (Think the game Bully was created by a bully or the person being bullied?). Could be either really, the point is that they had experience with the subject in question. Learn as much as possible once you have identified raw ideas, the learning process might give you new and better ideas.

It's not easy to have a brainstorm of 1 person, so if you can, try to bounce ideas off your spouse, friends, dog or mirror. Talk through your ideas out loud, it helps to make them clearer. Write everything down, so walk around with a piece of paper and a pen. Your memory will FAIL you, even if you think you have this great idea and you can't possibly forget it, POOF, it's gone 10 minutes later.

If you are not the only working on the project, then awesome! You are in a much better spot when it comes to coming up with game ideas. Brainstorming with a group of people (2-4) is great for generating ideas very fast. People truly feed on ideas from others and morph them for the better. Again, write down everything. Don't be rational at this point, you should be saying stuff like "Oh you can't do that cause bubbles can't bounce off walls, they would explode". This isn't the time for killing ideas, just generating them (unless your ideas is exploding bubbles, which might work). When it comes down to narrowing down ideas, keep your ego in check. It's not always easy to have your ideas shot down; keep them for another time or forget about them completely. Just be ready to move on with the project, it will need your buy-in.

Do your research
Over the years, I've created many games that was never truly finished, some new ideas and quite a few clones. In 1998, I created a 3D tetris using Java and VRML as the rendering engine. I was very proud of myself for creating this somewhat original idea. Later I found out that Blockout existed for almost 10 years prior than my version. Humph, but it wasn't running in a browser now could it? There's nothing wrong with making a clone, but it would be really nice to know that's what you are making. For working on the IPhone, I personally use AppShopper to see if what I want to make already exist in some form or another. If you decide to continue, you should know the price point of your competition and what feature you can include that will differentiate yourself from them. So be ready to buy someone else's game/software.

Flush out the design
Make sure you understand what it is that you are creating. Once that's done, make sure you can give a document to someone else so that she can understand it also. I'm not saying that things won't be changing throughout the life cycle of the project, but that's ok, you can change the document as you are going through the development process. Just remember that the latter you change things, the more work you'll need to redo. Changing zombies to ninja will require a lot of remodeling and texturing and animations (unless they are zombie ninjas?).

Awesome, you got your great idea! Now what? Well, with any projects (game or application software), the first thing you need to do is to create a risk list and provide solution for them. Most likely, the solution will come in form of prototypes. Prototyping doesn't necessarily mean creating a program in this case. If you came up with a card game idea, you can always play it with real deck before writing any line of code. If you do some kind of manual prototype, be wary of how it will port to the target platform. Not to long ago, my father, who is an avid game maker (puzzles), came to me with a few new puzzles to see if any of them would fit the IPhone platform. We played a few hands with cutout card boards of one of the puzzles and the game was fun and fast enough, but there was many times when neither of us could make any moves. So we had to pick another piece and skip. This happens very fast when you are playing on a table, but I'm not sure how it would have transfered on the IPhone. I think the pacing would have been a bit wrong. So it might be that the game needs a bit of tweaking before it's ready for the IPhone, but it makes a very fun puzzle game nonetheless.

I'm currently making a board game for the IPhone. Because my board was going to be a certain size, I knew the squares of the board were going to be too small to be easily picked by anyone with fat fingers. So what's the first thing I did? That's right, I prototyped a board to test how I could resolve this. No fancy graphic, and no picking as of yet, but I did create what I think is a solution to my problem. I'm still not sure my current solution will be my final approach, but my top risk as at least been mitigated and I can move on to my next biggest risk. The next risk isn't actually a technical risk, but more of a design risk because of how the AppStore works. How do I provide a free version of the game that leaves the player wanting more? It seems like you need to provide a free version of the game to be on the map on the AppStore. I understand why, I just wish that there was a better way to go about it then to write a slightly different application. Unfortunately, the AppStore doesn't allow time based trial or anything of the sort. I'm afraid that a simple prototype might not do here, so I'm looking at it from a game design and architectural design instead. If I can identify game design aspect that I think I can play with, then I can design the application to enable certain hooks that can disable or enable different game type (for example), depending on what version I'm compiling. What I want to minimize is to have 2 different code branches. I'll keep you updated on how this will progress.