Monday, March 30, 2009

Monthy Checkup

It's been a whopping two weeks since I started this blog, but it's also the end of the month, which means it's checkup time! At the end of each month, I will review my incomplete goals and determine how I'm progressing toward becoming a Game Developer. You may recall some of the following from my Inspiration post and I've added a few new goals too.

Create a finished game.
I'm still in the process of learning Direct3D and playing with various techniques. SkyCop is a wide-open testbed for experimentation, but once I feel more confident in my skills I will design a smaller-scale game that I can actually finish. I've read numerous articles stressing the importance of showing potential employers you can create a finished product.

Use personal projects to test different rendering techniques and programming methods.
Check! See the SkyCop reference above.

Continue learning and be competent enough to explain design decisions.
I've exponentially ramped up my reading of game development blogs and articles on major sites like GameDev.net and Gamasutra. I want to get another book or two to learn technical/design concepts; I've heard Game Coding Complete is a good reference.

Start networking!
I've started participating in the Game Career Guide forum; they have a bunch of bright and friendly people willing to help newcomers to the scene, and I'm hoping I will be able to contribute positively to the community. I'm also learning about different game development conferences and considering a trip to GDC next year or possibly attending SIEGE this year.

Play more games!
I love playing video games, and remember the thrill of playing multiplayer Quake 2 and Unreal Tournament back in the day. It's hard to find the time these days, but in order to understand modern game concepts I really should buy a new game. That's my rationalization, anyway ;)


Dave Ramsey, creator of Financial Peace University and an awesome motivational speaker, says "If you wanna be rich, you gotta do rich people stuff." Likewise, if you wanna be a Game Developer, you gotta do Game Developer stuff! I found these testimonies of actual developers/designers working in the field to be quite interesting. They're a good reminder that there's more than one way to break into the games industry, and I know that I can do it!

Friday, March 27, 2009

Recommended Reading: Artificial Stupidity

Gamasutra recently featured an article titled Intelligent Mistakes: How to Incorporate Stupidity Into Your AI Code by Mick West. It's a great read that I highly recommend for anyone, including non-programmers, regarding the topic of Artificial Intelligence.

For the uninitiated, Artificial Intelligence (AI) is the logic used in a game by your computer "opponent". The fun part of playing a video game in the absence of human vs. human interaction is the ability to play against the machine, which simulates the actions of a human opponent. However, knowing that a computer relies on logic, mathematics, and the ability to perform a million computations per second, there is no reason for the computer not to win every single time.

It wouldn't be fun to play against an opponent that never loses, which is why we need to decrease the computer's IQ! But as Mick points out, simply reducing the number of computations the machine is allowed to perform before making a decision would cause it to make abnormal blunders; it would be too easy to defeat and once again, not fun. Instead, a better approach is for the AI to perform its normal amount of computation and earnestly try to win, occasionally making a move that is more advantageous to the human player. If the human player takes advantage of these "thrown a bone" moves frequently enough, they have the opportunity to win. Yet they can still enjoy the challenge of playing against an opponent that is trying hard to win (and will win if the player fails to take advantage of certain opportunities).

My quick summary hardly does it justice. Read the full article now!

Thursday, March 26, 2009

Program-ictionary

This post is dedicated to my good friend over at Heart Like Jesus blog, who recently reminded me we don't all speak geek. For those of us who do, even seemingly-simple concepts can deteriorate in the absence of a common terminology. The table below takes a stab at defining some key phrases used on this blog.

PhraseDefinition
C++Currently the most common game programming language.
OOPObject Oriented Programming. This is a conceptual way of structuring code to represent objects in the real world (e.g. creating a Person class that has properties such as Name and Age).
DirectXMicrosoft's collection of APIs for multimedia development for Windows-based systems. A few specific APIs include Direct3D (for graphics), DirectShow (for presentations), and DirectSound (for audio).
Direct3DThe DirectX API for creating computer graphics.
APIApplication Programming Interface. An API simplifies work for programmers by providing them with a list of functions they can use to perform specific tasks in a program.
PixelShort for picture element, a pixel represents a single dot displayed on your computer monitor.
TexelShort for texture element, a texel represents a single dot displayed in a texture (image) file.
Texture MappingSee my post Texturing Fundamentals for a definition of textures. Texture mapping is the process of texturing.
PointA position in 2-dimensional space specified by a horizontal X value and a vertical Y value.
VertexA position in 3-dimensional space specified by a horizontal X value, a vertical Y value, and a depth Z value.
Direct3D VertexA vertex that may contain properties (such as color, texture coordinates, etc.) in addition to a position (x,y,z) value.
Vertex BufferA hardware-dependent structure, accessible via Direct3D, to hold a list of vertices.
RenderThe act of drawing content from a vertex buffer to the screen.
Object Geometry  Set of vertices that make up a 3D object.
GeometryMath stuff I learned freshman year in high school and wish I could remember better now. Very important for graphics development!
This list is by no means comprehensive, but it's a start. I'll try to make sure I define new concepts clearly and am always open to correction from wiser experts. It's been said that blog comments are often better than the original blog post, and I'm excited to see if that proves true on GDJ!

Monday, March 23, 2009

Texturing Fundamentals

In my instroduction to SkyCop, I briefly mentioned textures without describing what they are or how to use them in game development. I fear I may still not be capable of providing a full explanation, but here is what I know so far.

The tricky part of defining the word "texture" is that it can be both a noun AND a verb. That is, you use a texture file (like the image at left) to texture an object. The process of texturing can be thought of as clothing an object. No object in a Direct3D game is particularly interesting without some color or texture applied to it, and textures are the most common means of adding realism to our favorite games.

To understand how a 3D object is textured, consider the SkyCop ship below. Every Direct3D object starts as a wireframe model having a certain number of vertices. Each vertex (think point) consists of a position (x, y, z) value and a texture coordinate (u, v) value. The texture coordinate points to a position in the texture file; the point referenced in the texture file is called a texel (short for texture element). Direct3D is able to wrap the texture onto the object by using a universal address scheme for texture coordinates; the values range from 0.0 to 1.0 inclusive, both horizontally and vertically. As you can see in the image above, the top-left texel is represented by texture coordinate (0.0, 0.0) and extends to the bottom-right texel at coordinate (1.0, 1.0).

So to map the tip of the SkyCop ship with the green tip in the image, we tell Direct3D to map the vertex at the tip of the ship with horizontal u = 0.5 and vertical v = 0.0. Similarly, we map the left and right wing tips with (0.0, 0.5) and (1.0, 0.5) respectively. Are you starting to see how the texture is wrapped onto the wireframe model?

I was planning to describe the SkyCop background texturing method, but this post is already getting lengthy and I think I have more to learn on environment mapping to get it done "the right way" first. Note that this post barely touched the basics of texture-mapping. There's a lot more to learn about how textures can be used to create cool effects, and this will likely be the focus of upcoming posts.

Saturday, March 21, 2009

A Really Simple, Devious Guide to RSS

This is one of very few selfish posts on this blog, as you will soon see. If you already know what RSS feeds are, you may be more interested in skipping to one of my more technical posts. For the curious or those who, like myself just a year ago, have never used RSS, I urge you to continue reading and learn of my devious plans...

What is RSS? Wikipedia tells us that "RSS (abbreviation for Really Simple Syndication) is a family of Web feed formats used to publish frequently updated works—such as blog entries, news headlines, audio, and video—in a standardized format." Simply put, it allows authors on the web to say "hey everyone, I've published something new!" and people who are interested in the author's website to be informed of the new content.

How does it work? How do I use RSS? Technically, the author of a site sets up an XML standard-formatted file somewhere on their site. When they add new content, they also update the XML file. There are many sites (like Blogger) that automatically update this file when new content is added.

You use a program, called an "aggregator", to stay up-to-date with an author's latest content (e.g. to know automatically when a new blog post is published). A feed aggregator, more commonly known as a feed reader, is an online or offline tool that keeps track of your subscriptions (by checking those XML files) and shows when your favorite sites have new content to be viewed. You have the option to just view summaries, view full content of new articles, or go to the author's website. There are many feed readers available, but I personally prefer Google Reader. Using the Google Reader gadget on my iGoogle home page means I have quick access to my favorite content every time I open my web browser, as you can see at right (click to enlarge).

How is any of this selfish or devious? I'm glad you asked. I know you're thinking up til this point you've seen nothing but great information. But of course my purpose is to enlist as many new Game Developer Journey readers as possible! :)

Click either of the links shown in the screenshot at left (click to enlarge) to subscribe to GDJ. If you click the icon at the top (shown in IE7) you will be taken to the general feed page; the URL displayed at the top of the page can be copied into ANY feed reader of your choice. Clicking either link shown near the bottom of the screenshot allows you to subscribe to the feed using a specific reader.

So now you know that anytime you see the orange feed icon above or see a link on a page that simply says "RSS", you can subscribe to keep up-to-date with that site. My hope, of course, is that you will subscribe to GDJ and also provide some feedback! I've found numerous game developer blogs with only a few posts or that are now defunct, so please feel free to offer your insights and help me stay motivated to post frequently. If you have any questions, let me know with a comment and I will respond soon.

Until next time, happy (GDJ) reading! ;)

Friday, March 20, 2009

2009 Game Developers Conference

Hot Topic: This year's Game Developers Conference (GDC09) is almost here! Sadly, I don't have the time off nor the money to attend this year but would definitely like to go next year! This year's conference will be held March 23-27 at the Moscone Center in San Francisco, California. Check out the GDC website linked above for more information. If you are going, you might want to use the online schedule builder to make sure you have an awesome, jam-packed week. Also check out Grant Shonkwiler's tips to make sure you're ready and don't get burned out!

Are you going to GDC? I know it's highly acclaimed for the educational presentations and great networking opportunities and would be interested in the impressions of anyone who has previously attended.

Also, are there any similar conferences closer to those of us living on the eastern-US border?

Thursday, March 19, 2009

Introducing SkyCop v0.7

I think it's about time I introduce my pet project. You'll be happy to note the screenshot to the left is not all there is to it, though it represents the base from which I started. The project shown to the left comes directly from Engel's Beginning Direct3D Game Programming book. It features two ships, both capable of turning left/right, rolling left/right, pitching up/down, and moving forward and backward in three-dimensional space. Even though Engel discusses basic texturing early on, I find it odd that he didn't include any simple textures for the ship objects, just coloring one yellow and the other red. Leaving various enhancements to the reader is, of course, a challenge I willingly took head-on!

Part of why I never get to the later chapters in the book is because I very much enjoy enhancing this basic project. I don't expect it to become a full-fledged game; it's primarily a demo project for my own experimentation, but only time will tell if it becomes something more. The screenshot below displays my updated project, tentatively named SkyCop.

You'll notice from the screenshot the first thing I added was some fancy textures, not only for the ships but also to create a background (more on textures in another post). Additional enhancements include: multiple camera modes, dynamic background switching, multiple enemy ships, a pyramid-shaped target indicator (lower left), speed boost for the primary ship, and custom key configuration.

I plan to provide the code and running executable so you can download and play with it soon. I'm open to constructive criticism, just try not to be too harsh. I am still learning, after all ;)

Next up: Guns, Collisions, Explosions, oh my!

Tuesday, March 17, 2009

Quick Tip: Ready, Fire, Aim!

I ran across this article a few days ago titled Start to Finish: Publishing a Commercial iPhone Game by Niklas Wahrman. Interestingly, Niklas didn't initially develop his Asterope game for the iPhone. It started as a project for a Google Android developer competition and he didn't win, but I like to think he's raking in the big bucks now that it's available in the iTunes Appstore.

I think the most important point he makes is for the independent developer to take a "Ready, Fire, Aim!" approach to development. Simply put, don't over-plan, over-design, or over-engineer. It's easy to get caught up in the design of the game engine, the layout of the world system, and minute details. But getting bogged down in the design phase ("Ready, Aim, Aim, Aim..." as Niklas puts it) can be a major inhibitor to getting the job done.

I've also seen it mentioned in a couple different articles that getting the graphics nailed at the beginning, giving your early prototypes a polished look before working on gameplay mechanics, can be a big motivator to continue working on your game. Food for thought.

Monday, March 16, 2009

OOP & Vertex Buffers

In my previous post, I listed some minor issues I had with the book Beginning Direct3D Game Programming, 2nd Edition. And I have another one: the book does not teach good class-based design. Admittedly it's hard to blame the author though -- he has a lot of material to cover and is trying to illustrate core concepts without bogging us down in extraneous code.

However, realizing that my simple flight simulator needed a CShip class, I dutifully created one to encapsulate the required functions (InitDeviceObjects, RestoreDeviceObjects, InvalidateDeviceObjects, etc.) of the Common Files Framework. I thought it pretty slick that I could simply call m_MyShip->Render() inside my application class' Render method, and I didn't have a problem with my custom ship class having it's own vertex buffer until I read Bubba's post (#9) on this forum. Although I certainly am leery about taking coding advice from a guy named "Bubba", I'm curious about his comment that "The renderer should draw all objects from one vertex buffer."

Understandably, if I have multiple ships with the same geometry it is somewhat wasteful to use multiple vertex buffers (one in each ship instance, used by its Render method). So which way is best?

It may be time for me to invest in a "best practices of game development" book.

Book Report: Beginning Direct3D Game Programming, 2nd Edition


Courtesy: Amazon
I've been reading Wolfgang Engel's Beginning Direct3D Game Programming, 2nd Edition for quite some time now. And by that, I mean I've made numerous attempts at reading it over the past couple years. I diligently read through the first six chapters, as I have yet again quite recently, and inevitably get hung up on the texturing concepts in the later chapters. Part of my problem is that there is quite a bit of material covered and I like to try every example in code. I'm thinking I will put in less effort coding and focus more on the concepts for this read through so I can actually finish the book this time ;)

For the most part, I'm happy with what I've learned from this book. Wolfgang does a great job of getting the reader up to speed with the development environment and provides the necessary DirectX 9 SDK and other tools on an included CD. He provides a good overview of the history (DirectX version 2 thru 9) and concepts (HAL, COM, shading and texture mapping) in the first few chapters and then moves on to the more interesting concepts involved in 3-dimensional rendering: axes, vertices, matrix and quaternion rotations, etc. Chapter six is a heavy but highly valuable chapter on the basics of animation in three dimensions and provides you with a framework for creating your own flight simulator. I have of course written my own derivative, which I hope to post for your enjoyment soon.

As much as I enjoy this book, I do take issue with it on some points. Firstly, I believe a large number of mistakes slipped into the book. For example, if the author indicates that matrix values must be entered row-wise, the code sample should do the same; these kind of minor errors have caused me to scratch my head more than once. Secondly, the author tends to explain some concepts with assumed knowledge instead of explaining everything in detail for the student who is "beginning Direct3D game programming." Minor issues aside, I think this book is a great reference and look forward to the upcoming texture-mapping and HLSL (High-Level Shader Language) programming chapters.

If you've read this book, let me know what you thought of it. Also post a comment to let me know your favorite Direct3D books. I want to learn as much as I can and could use some good references!

Sunday, March 15, 2009

Inspiration

GameDev.net recently linked to this Game Career Guide interview with Jean-Francois Lévesque, describing his path toward becoming a Game Developer at Ubisoft Montreal in Canada. This post is one of a few leading to my recent fervor to work harder to break into the field. As I read the interview, I kept saying to myself "check, check, got that... I can totally DO THIS!!!"

I'd like to summarize what I believe were his most important insights and define where I am with each:
  • Learn the English language. -> Check!
  • Have a plan. Read as much as you can on game development and work on your own games/projects in your spare time. -> Check!
  • Have at least one complete personal project to show to potential employers. -> I'm still working on this one.
  • Use personal projects to test different rendering techniques and programming methods. Continue learning and be competent enough to explain design decisions. -> I'm working on this one too.
  • Expect rejection in the beginning. It may take a couple times, more college courses, or simply meeting the right people to succeed. -> This might be tough!
  • Be willing to step up and ask for more challenges/responsibilities once you do get hired. -> This is me!
  • If you start getting in over your head once you land the job, seek help and learn from your co-workers. -> No problem.
  • Be prepared for a personal component AND technical test at your interview. Be passionate about what you do! -> I plan to keep learning as much as I can to improve my technical competency, but I know I can easily show my desire to work on games!
  • Have a personal website so employers can learn more about you. -> Check!
  • Start networking! Attend job fairs and gaming conferences, participate in video game-related forums, and do everything you can to make new contacts in the field. -> I need to work on this one.
Clearly I have my work cut out for me, but I definitely believe it is possible. I plan to keep checking this list to see how I'm progressing. In the meantime, for those of you with game development experience, what pointers might YOU add to this list??? I know this blog is new and won't have many readers yet, but please add your comments even if this post is a couple years old by the time you find it!

Saturday, March 14, 2009

About Me

Welcome to my Game Developer Journey blog!

My name is Jeromie Walters, and I promise this is the only personal post you will ever see on this blog. Having held a long-time bias that many blogs simply disseminate unwanted TMI, this is a huge step for me. Having started the discipline of reading blogs related to the field of software development, particulary Jeff Atwood's Coding Horror and certain others I will add to my links section soon, I've come to learn that some blogs can be of great informational value and hope that this one will do the same. Jeff and others have convinced me that I should just start writing. Obviously my personal opinions will be expressed on topics related to game development, but my promise is that there will be no posts simply stating what I had for lunch.

Who am I? I am a software developer for a small engineering company in Ohio. I graduated from The University of Akron with a Master's Degree in Computer Science and truly enjoy the art of programming. Of course, I got into it with the idea of writing games but eventually learned that I couldn't translate my general software development knowledge into game creation. At my current job, I work on a large web application that helps companies manage their business. It's a great company to work for and I get to use the latest and greatest web technologies, but I still feel like something is missing.

I believe my passion is game development. I love to work on something and get to SEE something visibly change on the screen! It's such an amazing rush to work on something and see your creation come to life. I took a couple (sadly underwhelming) graphics courses in college and have spent some time learning Direct3D on my own, especially recently.

I've always been a highly-motivated, goal- and detail-oriented person and I figure if this person can use a blog to try to get a better job, why can't I? I don't expect the game development companies to come knocking quickly (though that would be great!), but even if this blog helps me to just capture my own progress and have a chance to learn from others' experiences (please comment!), it will have been a success. I believe the Internet is an amazing tool for knowledge sharing and hope you will enjoy following my journey to become a true Game Developer!