Categories
Game Design Game Development Geek / Technical

The 2012 0h Game Jam

For a lot of people in the world, it is time to set the clocks back an hour. Thanks, Benjamin Franklin.

During the daylight time change, there’s an hour between 2AM and 2AM on Sunday, but due to the fact that it looks like no hours have passed, the question remains: can you make a game in 0 hours?

You can check on the hashtag #0hgame to see how development has gone around the world. Europe has finished their 0h Game Jam. You can see completed games at http://0hgame.eu/games.php. In 0 hours, you can expect some simple yet off-the-wall stuff to be made.

The “keynote” is a bit odd as well:

I’m getting ready for 0h game development by seeing Wreck-It Ralph tonight. Even if it doesn’t help provide any inspiration, it should be a fun time with friends.

Are you participating? How are you preparing?

Categories
Game Design Game Development Games Geek / Technical Linux Game Development Personal Development

LD24: Evolution Game Post Mortem #LD48

My last few Ludum Dare entries have missed the main compo deadline and had to be submitted to the Jam, but my entry for Ludum Dare #24 was finished in time to get judged along with the other 1,000+ entries. That was a big win for me, since my game development in general has felt quite slow.

The theme for LD24 was Evolution, which always makes it to the final round and has never won as a theme until now. I ended up creating a simplistic side-scrolling shooter. It definitely wasn’t my best entry, but health problems made it difficult to do better in the 48 hours.

What Went Right

  1. Leveraging existing tech

    Since LD#18 (“Enemies as Weapons”), I’ve been slowly building up a game engine for Stop That Hero!, my casual strategy game that lets you summon minions to fight heroes who want to put a stop to your evil empire. As I am using test-driven development to work on that game, I ended up with code that is relatively loosely coupled and cohesive. It was quite simple to gut out the STH! parts and leave behind a way for me to immediately create a menu, game play screen, and ending. Instead of spending the first six or twelve hours trying to get an SDL window to shut down properly, I could concentrate on more important things.

    My engine isn’t super powerful. People using Unity or Flash had a huge advantage since so many components are fully-formed and well-designed. Still, I had code that I was able to use in multiple games, and I knew how to use it. I was able to put together my game fairly rapidly.

  2. Better familiarity with tools

    My art program of choice is GIMP. While I’ve been known to doodle on paper since I was a child, I haven’t been very practiced with pixel art or image manipulation. I don’t know how to do 3D modeling very well, but if I did, I would use Blender.

    Over the years, I’ve learned how to use GIMP to create some decently functional art and ads. Selecting shapes, making use of layers, and knowing how to manipulate color goes a long way. What I create is not production-quality, but it works for an LD48.

    Evolution Game Play

    Sound effects were made using DrPetter’s sfxr. Even though it is really easy to use if you just want to generate random sound effects, knowing how the various parameters can be tweaked helps a lot in getting an effect to sound just right.

  3. Iterating fairly well

    My biggest victory came from iterating, even if I could have approached it more intelligently.

    After working out some ideas on paper, I had a basic design for a shooter.

    Initial Design of Evolution game for LD#24

    I wanted the controls to be simple. I came up with some different ways for how enemies would evolve, as well as ways the player’s tank might evolve.

    I wanted different kinds of enemies that came in different sizes, used different movement patterns, and attacked the player in different ways. I even had an idea for a boss character.

    Design Notes of Evolution game for LD#24

    I also thought of Evolutionary Upgrades, aka Power-ups, for the player. Some impacted the tank’s weaponry, such as a spread gun or homing missiles, while others affected the tank’s size or armor.

    Design Notes of Evolution game for LD#24

    Once I had an idea of the kind of game I wanted, I set to work. My initial list of tasks:

    – get the player’s character in the game
    – make it controllable
    – add obstacles (most likely boulders)
    – make collisions between the player and obstacles deadly
    – add an enemy
    – create a wave of enemies
    – create a way to modify the wave of enemies so each enemy evolves in some way

    First, I got a scrolling background. In hindsight, maybe this part could have been left until later. My next goal was to get a controllable tank on the screen, complete with the ability to fire bullets. Having something controllable that early meant that throughout the development of the rest of the game, I could get a feel for the controls. As the game came together, the tank’s controls were updated a few times. I originally had the tank’s movement a bit slow to accelerate, as switching a tank’s directions is probably really hard, but I found it was more annoying than fun. It felt too sluggish. I made it more responsive in the end, and it was better for it.

    Next, I added boulders, followed up with collision detection between the tank and boulders. Now tanks have to avoid obstacles, making the side-scrolling environment a bit more maze-like. In terms of the theme, however, perhaps these obstacles were not the best thing to add earlier, although I did have plans for enemies to interact with boulders by pushing them toward the player if they collided with them.

    Finally, I added killable enemies. The enemy was pretty basic. It moved in a straight line toward the player, didn’t attack, and moved through boulders.

    I realized that I was not going to get all of the enemy types and upgrades in, so I focused on making sure what I had was as finished as I could make it. I added enemy waves, which added more enemies and made them harder to kill as the player progressed. I added a score so you could see how well you’re doing, and I even had time to make some points visibly pop up when you kill an enemy. That last bit was a small aesthetic change, but I think it polished the game up quite nicely. Great bang for buck.

    Now, there are some things I spent time on that I could probably have left until later. The scrolling background wasn’t really necessary, was it? And the enemies were supposed to be the main focus of the design, so why did I work on boulders first? I definitely could have prioritized much better.

    Still, what’s key here is what I didn’t spend time on. I didn’t spend time making tank upgrades, which is good because I didn’t have a need to upgrade the tank. I didn’t spend time making lots of enemy types, which is good because I didn’t have the time to intelligently figure out how they should be introduced. I didn’t spend time to figure out boulder/entity interaction, which is good because who knows if it would have added anything?

    By getting something playable and iterating, I was in a position to reduce scope to finish the game by deadline. Along the way, I almost always had something playable that I could submit by the deadline.

What Went Wrong

  1. Dealing with Back Pain
  2. Shortly before the theme was announced, I was working to get the next release of my casual strategy game Stop That Hero! out the door. Between that project and my responsibilities as President of the Association of Software Professionals, I was sitting at my desk a lot, and it was taking its toll on me. I could feel some tightness in my hip, and so I decided to try to setup my environment so I was standing more.

    I placed a container under my keyboard, and it was raised to the perfect height to let me stand while I work. Everything was great, until I had to use the mouse for some reason, which was still on the desk. I leaned to the right to reach for it, and I didn’t realize I was going to be mousing like that for long. Standing in such an awkward way, coupled with the tightness I was experiencing from sitting for so long for days on end, I ended up with some very, very annoying back pain.

    The Friday before the compo, I went to a massage therapist since I figured it was just tightness that needed to be massaged away. After the compo, I went to a chiropractor because it clearly wasn’t getting better and in fact felt worse.

    But during the compo, I was taking a lot of breaks. I could sit or stand for a period of time, but when the pain started getting distracting, I’d go lie down on my back for a time before I could start working again.

    I lost a lot of productivity to that pain, and I’m still recovering from whatever happened to cause it.

  3. Being Uncool

    My entry didn’t get a rating. It seems that in the time since my last LD, there was a change that if you don’t have a high enough cool rating, you don’t get a listed rating. As I was a bit busy and couldn’t dedicate the time to reviewing other games post-compo, I didn’t get many reviews done. Reviews translate into coolness. With over 1,000 entries, people aren’t expected to review everyone’s games, but there is an expected minimum you should rate. I rated a few immediately after the competition, but between not being able to play Unity-based games and having other priorities, I didn’t get back to it. My only listed rating is Coolness, and I was ranked #986 with a rating of 22% cool.

    There were quite a few 100% Coolness ratings, and those people are awesome. Or they just have a lot of time. Either way, I’m glad they exist.

  4. Doing a poor job of including the theme

    Evolution is always a contender for the finals of theme selection, and I was caught off-guard when it actually won.

    I could have tried to design something involving random genetic changes in entities and seeing which one adapts better to changing circumstances, but it sounded too obvious and also too open-ended. I wanted to try to keep my entry simple and straight-forward since I wanted to submit an entry to the compo instead of the Jam.

    While I had some design notes that I called “evolution,” such as tweaking variables to create new enemy behaviors and types, it really wasn’t evolving so much as creating variations, the kind of thing you’d see in any shooter and most games in general.

    Perhaps I should have thrown a few more ideas at the wall before settling on this side-scrolling shooter. My wife suggested the idea of an “evolving door” which has the benefit of being pun-tastic, but I couldn’t find a good way to incorporate it into my existing design. Judging by the variety of entries, I could have been a bit more creative.

What I Learned

  1. Iterate like you mean it. This is where Agile software development experience really comes into play. If you can create the simplest bit of value, and then build on it, you’re going to ship. If instead you build up scaffolding code to prepare to provide some unknown, vague value, you’re probably going to get mired in delays.

    In previous competitions, I’ve found that I didn’t introduce basic interactivity until a bunch of other things were ready, and I’ve suffered as a result. By getting something player-controllable right away, I was able to not only get a game around it much more quickly, but I was also able to make small changes to the controls until it felt right.

  2. Having good tools and knowing how to use them is great for productivity. To iterate quickly, you need to be able to produce functionality quickly.

    I used to try to create decent art, but between not having much practice and not being familiar with GIMP, I would spend way too much time on art, and in the end, it still looked really bad. I wasn’t getting the return on investment.

    Now, my art skills are still not production-quality, but they are passable, and I am able to create decent programmer art in minutes when it used to take me hours.

    Also, experience counts in general. I write way better code today than I did just a few years ago, and I do so much faster. I terrify myself when I look back on earlier Ludum Dare compos and read through my code.

  3. I need to take care of myself. Up until the compo, I had been doing yoga and taking regular walks. However, poor posture in front of the computer and sitting for way too many hours at a time in those postures did me in. It’s over a month later, and I’m just now feeling fine enough to start stretching and taking walks again. Maybe I need to seriously investigate the standing desk option and even look into a much better office chair.

Summary

If I could do LD#24 over again, what would I do differently? I’d spend more time upfront trying to create a design better suited for the theme that is also simple enough for me to make. I’d make sure my list of tasks was prioritized so that at all times I was working on implementing something that served the core design. And I’d make sure that I had set aside time after the compo and Jam to rate other games. People worked hard on their entries, and with over a thousand of them submitted, it’s unfortunately easy to get buried. I think the coolness rating does a great job of making things fair, and the name is perfect. I want to be cooler next time.

Being able to get a game submitted is still a great feeling, though. In 48 hours, I created a game where there once wasn’t one. Next time, I should hopefully be healthier and able to focus more on game development, and my next entry should be not only minimally complete, but actually enjoyable to play. I’m still aiming for getting #1 in the Overall category, and while it feels like I’m a long way away from challenging other entrants for that position, I’m definitely way closer than I was when I was participating in LD#11 four years ago.

How did your LD#24 go?

Categories
Game Design Game Development Geek / Technical Personal Development

Join Me in the Weekly GBGames Game Dev Co-op Hour

Last week, I decided to try something new. Every week, I’ll do an hour of game development in a Google Hangout, and you’re invited to come along.

Synchronize Your Watches

What: Weekly GBGames Game Dev Co-Op Hour, an hour of game development with you, me, and anyone else who shows up.
When: Every Wednesday morning at 6:00 AM (Central Time) for an hour.
Where: In a Google Hangout. The link will be posted on Twitter and on my Google+ profile a few minutes before the hour starts.

It’s a bit early here, and depending on where you are in the world and your schedule, it may or may not be convenient for you, but I hope you’ll join me. We can discuss game design, talk about what you’re working on, or simply work silently together. I see this weekly hour of public-facing work to be an opportunity to connect with other indie game developers. We’ll laugh. We’ll cry. We’ll become better game developers.

Do you plan to attend the Co-Op Hour?

Categories
Geek / Technical

Why Is It So Difficult to Submit Games to Linux Gaming Sites?

On Monday, I posted the official announcement that the next version of “Stop That Hero!”, aka the Sound Update, has been released.

Existing customers received an email with a link to their copy a couple of weeks ago. There’s a demo available this time, and I’m looking forward to getting feedback about this new version.

I wanted to submit the news to a few Linux-focused sites, but it’s been a bit of a pain to do so. For some reason, many sites don’t seem to handle form data correctly.

When I went to submit a news item to LXer.com, I had some difficulty with a difference between what I submitted and what came back when I previewed the item. It did get published, but the headline was changed by someone to “Announcing the Sound Update”, which makes sense on a site about the game, but isn’t so attention-grabbing on a site that publishes many posts each day.

I learned that The Linux Game Tome updated their forums this past summer, and now submitting or updating entries in their game database is broken. Since no new submissions have arrived since June, according to their main page, I’m going to assume that other people haven’t been able to do so either. I sent an email to the staff and am waiting to hear back.

SubmitANewsItem

And LinuxGames.com needs you to use HTML to format your entry, but if you click Preview, the page reloads and your text is gone. If you click submit, it looks like the same result, only it takes a lot longer to load, so hopefully it got through? You’d have no idea because the site doesn’t indicate that you’ve submitted anything.

And these sites aren’t the only ones with problematic submission forms. In some cases, I have no obvious way to contact the site owners, so I can’t even email someone to say, “Hey, I think I’m having trouble using your site.”

What gives?

It’s 2012. Haven’t best practices for HTML form validation been around for long enough? Why do your users need to be aware of HTML markup to correctly use your website? Why does it feel like there is some trick to it? It’s too bad because I really like these sites, but contributing to them is always awkward and confusing.

What has your experience been when it comes to submitting news of your game to enthusiast sites?

Categories
Game Design Game Development Geek / Technical Linux Game Development Personal Development

LD24: Development Timelapse, or The Evolution of My Game #LD48

48 hours of game development has been condensed into a little over a minute and a half of video.

It looks as if a lot of the creating parts happened in small bursts of a few seconds, done around IRC and eating. B-)

Categories
Game Design Game Development Geek / Technical Linux Game Development Personal Development

LD24: FINISHED! #LD48

It is done.

It doesn’t have nearly as much as I wanted. I had design notes for different enemies with different movement patterns, weapon types, power-ups evolutionary upgrades, and bosses.

What I do have is a basic enemy that gets more and more health and moves faster and faster in each wave. You have three lives. And each killed enemy gives you 10 points.

It has some basic sound effects.

Evolution Game

And you can get the files here:

Windows .zip 5.2 MB
Linux tar.gz 4.7 MB
Source .zip 4.0 MB

And now, I will celebrate with a peanut butter covered chocolate chip cookie.

Peanut butter covered chocolate chip cookie

Categories
Game Design Game Development Geek / Technical Linux Game Development Personal Development

LD24: Bug-killing Game Play #LD48

I managed to get a lot accomplished in a couple of hours.

– get the player’s character in the game
– make it controllable
– add obstacles (most likely boulders)
– make collisions between the player and obstacles deadly
– make collisions between bullets and boulders result in bullets disappearing
– add an enemy
– make collisions between bullets and enemies result in damaged enemies
– make collisions between player and enemies result in killed player
– create a wave of enemies
– create a way to modify the wave of enemies so each enemy evolves in some way

Right now, you can shoot enemies as they approach, and when they die, they become harmless and visibly destroyed. If you crash into an enemy that is still alive, you both die.

Evolution Game Play

Enemies are mindless right now. They simply move forward in a straight line to the left. While I have a bunch of random enemies that looks like a wave, I don’t really have waves as a concept in the game. And with less than four hours left, I don’t think I’ll be adding lots of visibly different enemies and power-ups. We’ll see.

Oh, and my wife was nice enough to bring me something to snack on.

Got any gwapes?

Grapes

Categories
Game Design Game Development Geek / Technical Linux Game Development Personal Development

LD24: Sub Sandwich and Enemies #LD48

I woke up with a sore back. I was lying down on the floor with my legs up on the ottoman since that’s supposed to help your muscles relax if you do it for about 30 minutes. Then I went back to bed, and I didn’t wake up for a few hours. Then it was time to go to church with my wife, and we had lunch:

Planet Veggie Sub sandwich

That’s a Planet Veggie from Planet Sub. It has provolone, cheddar, fresh red peppers, artichoke hearts, sun-dried tomatoes, and a tangy olive spread. I washed it down with lemonade.

I wish I can say I’ve made progress, but sitting at the computer has been incredibly uncomfortable. But lying on the floor seemed to have helped, so I’ll be back at this project today.

A reminder of what I’m doing:
– get the player’s character in the game
– make it controllable
– add obstacles (most likely boulders)
– make collisions between the player and obstacles deadly
– make collisions between bullets and boulders result in bullets disappearing
– add an enemy
– create a wave of enemies
– create a way to modify the wave of enemies so each enemy evolves in some way

There’s a little over 6 hours left in the compo. I can do this.

Categories
Game Design Game Development Geek / Technical Linux Game Development Personal Development

LD24: Deadly Boulders #LD48

The player can control the tank, including firing bullets. I’ve also added boulders.

They are randomly placed in the environment, and when the player passes them, they are removed from the game. If there are no boulders left, more are generated.

Collision between the player and a boulder is deadly, as demonstrated by the randomly controlled tank in this video:

I had some difficulty with handling bullet collisions with the boulders. Right now, they shoot right through them. I want them to disappear. Boulders are not affected by bullets. I have plans for boulders interacting with enemies and explosives, though. If an enemy hits a boulder, I think it would make for an interesting mechanic if the boulder starts to move towards the player. Explosives should be the only thing that destroys boulders.

My current plan:
– get the player’s character in the game
– make it controllable
– add obstacles (most likely boulders)
– make collisions between the player and obstacles deadly
– make collisions between bullets and boulders result in bullets disappearing
– add an enemy
– create a wave of enemies
– create a way to modify the wave of enemies so each enemy evolves in some way

One thing I was hoping to use was my component system, but so far I’ve represented bullets and boulders as positions, along with constants representing their collision radius. It’s working well enough.

Once I get bullets working right (I’ll need that collision detection working for the enemies anyway), I can finally start working on the first enemy so I can get around to doing some evolving.

Categories
Game Design Game Development Geek / Technical Linux Game Development Personal Development

LD24: A Second Dinner Today? #LD48

So while the pasta was ok, apparently I was still hungry.

Cheeseless pizza

As for the game, I realized that my code that wraps libSDL and allows the rest of the code to be easily unit tested has a problem. It only knows if a key is currently being pressed or is currently released. It has no easy way to tell if the key has just been pressed or released.


case SDL_KEYDOWN:
{
m_keyboardState.setKeyDown(event.key.keysym.sym);
}
break;
case SDL_KEYUP:
{
m_keyboardState.setKeyUp(event.key.keysym.sym);
}
break;

Typically you would check SDL_KEYDOWN/SDL_KEYUP events in the event pump, and if those events occurred, you could handle them directly. Since I wanted my code to be unit tested, I created a HardwareLayer that wraps all of this functionality, and I used a KeyboardState class (that’s m_keyboardState) to track key status. Then, in my game, I can check the keyboard state for individual keys to see if anything is being pressed.

What this means in practice is that SDL is already creating an event for a key press/release, but then I ignore the existence of the event, tracking only the status. If I want to know if a key has been pressed this update, I essentially have to write code to track the state of the key and do a few if statements to know if I’ve already processed it or not.

But why do that when SDL has already done the work for me?

So I’m modifying my keyboard state to track not only the status of a key, but to also track the fact that it has been pressed or released this update. Then my game can check for this list of events, do whatever it needs, and at the end of the update, the keyboard state will clear out the list.

And this is why LD is fun.