Monday, October 26, 2009

Changing address

Chris Unarmed was submitted into formal play-testing yesterday. With just weeks to go before its release, this blog has served its purpose and I've decided to start a new blog pitched to to the masses.


Thanks to those who have kept me accountable (that's you, Debstar!). You can find the new blog here.


Chris out.

Tuesday, October 20, 2009

Getting serious


A wonderful thing happened this weekend. I realized that I'm on the verge of completing my game. All levels... done. Loading and saving... done. Sound effects and music... not quite. Oh well, 2 out of 3 isn't bad!


I began to realize that with less than 2 months to go, only a few people even know Chris Unarmed exists. Time to do something about it. And I have!


Check out the first trailer for Chris Unarmed!


As if that wasn't enough, I decided to start raising awareness too. Check it out:



  1. Emuholic's Game Blog

  2. xnPlay

  3. XBLIG



I've even created a Facebook page!

Friday, September 4, 2009

Windows beta 1 now available


I'm far from finished my game, but all the core gameplay is complete and I need to finish the level design, backgrounds, music, sound effects, etc. Now is a good time to share a beta with some friends, and start collecting feedback. So I've cut out all the Xbox dependencies, and I've published a Windows beta and given it to some friends.


Here is what I've learned so far:



  • It is too difficult! I've been playing it since January as I've been building it, so I know the controls and the levels intimately. But what normally takes me 40 seconds took one of my friends 12 minutes. I need to find a balance between incorporating cool elements into the early levels to keep people's interest, and making it easy enough to support a learning curve.

  • Rather than returning to the last door when the player dies, I need to have other points midway through each level where the player will spawn if they die after that point. Someone commented that the game is too slow, and I think this comes from his frustration when dying towards the end of a level and having to replay it over and over.

  • I might consider adding difficulty levels, because there is a clear difference in skill amongst my friends, and the game is a little slow for the more skilled players.

  • Wall jumping needs to be refined. Currently, if you're in the air and facing a wall, you press jump and the character will leap off the wall. But everyone's intuition is to press jump and to move the character away from the wall, and this often leads to the wall jump not registering properly (because the character has already left the wall by the time they try to jump). I've already started making refinements to how this works, but I may need to do more.

  • The controls take a bit of getting used to. If you jump through the air the character will maintain their horizontal velocity (unlike many other games, that quickly bring the character to a near vertical fall) unless you steer them back in the opposite direction. I don't really want to change this, but I'll continue to observe players and see if this is a problem.



I'm glad to see people finally playing my game, even if my first review is "It's like watching paint dry" (thanks Brad :). I'll continue to refine things over the next few months.

Level 3


I'm still slogging away creating levels. There are 4 levels in all, and I've now finished 3 of them. So I'm getting there!


Here is a short preview of level 3.


The platform shoots up quickly, so get off or meet the spikes:






Grab the green key to proceed:






So many doors to choose from:






Hanging out with my evil twin:






Flying through a tunnel of spikes:




Thursday, August 27, 2009

Name that game


With about 3 months until its release, my game is in search of a name. My favorite so far is "Chris: Zero to Hero", but "Zero to Hero" has heaps of Google hits and is probably trademarked. As of today, the working title is "Chris: Unarmed", which is a play on the fact that the character has no arms.






Can you do better?

Wednesday, August 26, 2009

Conveyor belts


In case you were wondering what the amplifier-looking things were in my previous post, they are conveyor belts. Check it out:






You can even use them to scale walls, which opens up some interesting puzzle situations. Anyway, here is a sample room from level 3 of my game. As usual, ignore the red and yellow borders and the palm trees in the background:






Slowly but surely, things are coming together.

Sunday, August 23, 2009

Faker


Most people who know me well will know that I'm a huge Masters Of The Universe fan from way back. I collected the action figures as a boy, and more recently as an adult when the new series came out in 2002. The 2002 release even marked the only time I've ever bought a comic book. Not to mention the time I turned up to a Lord Of The Rings themed birthday party as He-Man because... well... He-Man is better than Aragorn.


Which brings me to the newest enemy in my game. Since my game's inception, I wanted to incorporate some puzzle elements, and I've had an idea of an enemy who responds to the player's movements and mimics their every action. Introducing... Faker!






His name and his blue skin are a tribute to the Faker character from Masters Of The Universe, a robotic replica of He-Man. In this game, he is a replica of Chris, except for his spiky hair and pointed chin (and a couple of subtle touches, like removing his eyebrows to make him appear more evil). He makes for some interesting puzzles too!


Here is just one example:






Avoiding a Faker is no small feat. For instance, jump a little too high and the Faker beneath you will land on the same platform as you and you will die. Try to wall jump with a Faker beside you, and you'll find yourself colliding with them as they too jump towards the wall. Time to get your thinking cap on.

Level 2


The last month has mainly been creating new levels, so there hasn't been a heap of new things to talk about. However, Liz kindly reminded me that I'm doing an injustice to the 1 or 2 people still reading this by posting nothing. In fact, I just checked my Google Analytics, and my Minnesota hits are as strong as ever. I promise to do better!


Anyway, you've seen screenshots from the outdoors area. The next level is full of ice, snow and water. Actually, the tiles are just a different color, but that doesn't sound as good. Check it out:


The tall guy makes his first appearance:






The easiest move in the game. Just hold right, and let the wind do the rest. Looks cool, though:






The Super Mario fireball thingy. Grab the key as it spins, then head for the bonus room:






One of many bonus rooms:






Underwater! All it really does is slow everything down, but it adds a little variety:






Another bonus room:






The command console in action. I blogged about this in January, but I only started using it recently:






Other things shown in these screenshots include:



  • Status bar now includes a timer. When a player completes a level, they will get a score based on the number of chroins they collected, their time, and maybe the number of times they died.

  • Red and yellow overlay to highlight overscan issues. The guidelines for making Xbox 360 Indie Games is that all important information must be within the main 80% of the screen, because some TVs have overscan problems that means the borders can get cut off. The red and yellow on the border of these screenshots is to help me see these issues, and won't appear on the final version.

  • Status bar transparency. The downside of the overscan guidelines is that, when there is no overscan, things like my status bar are stuck in the middle of the screen for no good reason. Because of this, I've given the status bar lots of transparency, to the point where you can hardly see it so it doesn't get in the way. However, anytime you collect a chroin or a key, the transparency disappears and it can be easily read, then after a couple of seconds it fades back into the background. It works pretty well.

  • I said earlier that the only difference between the levels is that the tiles are a different color. That was a bit of an exaggeration. Ice has very little friction, so the player skids almost endlessly if they are not careful.



You might wonder why an icy, cold area has palm trees in the background. Not to worry. I haven't gotten around to creating proper backgrounds. I'll do that once I've finished the game.


Next update coming soon.

Thursday, July 30, 2009

Face lift


I've given the menu system a bit of a face lift, plus added some proper backgrounds to get a feel for what everything will actually look like. Here is a previous:



Developer logo, which appears when the game is starting up:






Title screen:






Basic outdoors level:






Dark level:






Treasure room within dark level:






In other news, I bought an Xbox 360 last weekend and a Creators Club subscription. As of last Sunday, my game now runs on both Windows and Xbox 360!

Sunday, July 26, 2009

Mi casa es tu casa


I thought it might be interesting to piece together a full room. The repeating status bar and background are just artifacts of the way I put the image together, so ignore them.



Check it out.




Thursday, July 23, 2009

Random


Some random screenshots, just because I can.



Flick the switch to access the key:






My favorite move. Chris falls between the spikes, and catches himself in a wind current and flies up towards the otherwise unreachable door. It has to be seen to be appreciated:






Past my bedtime:






Collect the key to pass through the door:






One of many bonus rooms:






That's all for now.

Wednesday, July 22, 2009

Introducing...


Long before I put out a casting call, the artist formerly known as Debra wanted to be a part of my game. And now she is.



Introducing the quick walking, swift talking, fears zero, super hero, ... Debstar! Check out her transformation below:






And as she appears in the game (ignore the yellow squares, which are sensor points for initiating dialog):




Tuesday, July 14, 2009

Blender


Throw a bunch of random things into a single environment, and see what happens.






So, what's new?



  • You can see all the enemies in action, including how the fireballs form a line and rotate around 1 common point.

  • There is a switch on the ground, and a door with a red indicator on it. Hit the switch, and the door turns green and is unlocked. Moving platforms can be activated in the same way.

  • A log bridge. This acts as a platform, meaning you can jump through it from underneath.

  • A sign post. Hit this, and a bubble appears showing what the sign says.

  • Some coins in the bottom corner. Well... chroins to be exact. You can't see the face clearly because of the angle, but I think you can guess who it is!



And now you're pretty much up to speed with where I'm at.

I'm back


That was a waste of 3 months! Oh well, I have a resolution to complete.


I'm now getting stuck into the art for this project. I have a list of every image I need to build, and I'm working my way through it. Here is a preview of some baddies I've created.


Standard baddies:








A slightly taller version:






This dude always chases the player:






This spiky obstacle moves about the level:






And this fireball typically moves in a circle, ala Super Mario Bros.






That's all for now.

Monday, March 16, 2009

Casting call


You've all seen the lead character, Chris. Debstar, the heckling heroine, is also locked in.


However, the story and all the other roles are still up in the air, and I'm happy to be persuaded in any direction. So, what do you think? I promise to integrate as many stupid ideas as I can.


Bring it!

Sunday, March 8, 2009

The resolution continues!


Refactoring... complete!


But that's not all. Besides improving the health of my code, I've added a bunch of new features. In no particular order, they are:


Moving platforms



Aside from the tile grid, which provides a very simple mechanism for building a level, I can now add arbitrary platforms and obstacles. They can move around, and the player can even wall jump off the side of them.


Friction



Added moving platforms forced me to look closer at my physics engine. In particular, what happens when the player falls straight down onto a platform that is flying past him at a good rate of knots.


The simple answer was that I need to model friction, and I've since applied it to all surfaces in the game. So when the player picks up speed, and jumps onto a block of ice, he will glide halfway across the screen before coming to a stop, whereas he will stop almost instantaneously on any rough surface.


Surface velocity



I was in the area when adding friction to all surfaces, so I took the opportunity to add a surface velocity too. Ryan suggested doing this ages ago, but I shied away from doing it because I was planning to build a very simple game. But the more I add, the more I want to add, and the more my imagination steers my efforts.


I can now add a surface velocity to any surface, and when the player touches that surface their velocity will be influenced by the surface velocity. This will allow me to build conveyor belts and other similar machines.


Multiple tile grids



Whereas previously there was a single tile grid that the player interacted with, an arbitrary number of tile grids can now be added for decoration. Currently, I'm using this to render a simple background, but this will also allow me to render weather effects such as snow and rain later on.


I'm still refining the appearance of the background. I was going to use a photo-realistic background, but was concerned that it might clash too much with the cartoony appearance of the foreground. I quickly browsed the available Paint.NET effects (mental note: check out the PhotoShop ones too), and am experimenting with an oil painting effect. The result is interesting, without distracting from the foreground.






I'd appreciate if you let me know what you think. I've had a couple of positive reviews and one negative so far, and am interested in broader opinions.


Conversations



It isn't fully cooked yet, but the player can now read signs and have conversations with non-playable characters. I have a big list of features to add to this, such as the exchange of items during a conversation and showing different conversations based on context of what the player has and hasn't done in the game, but the foundation is there.






That's all for now. I'll post a video soon.

Wednesday, February 18, 2009

MIA


Ah... refactoring. As much as I like goofing around drawing rocks, grass and of course myself, life is not all fun and games. I'm about ready to start churning out lots of enemies and objects, but the internal architecture of my game code needs some work to make that a productive exercise.


I'm surprised how quickly I've been able to build up the game to where it is, but I've taken a bunch of shortcuts and made some compromises to enable that to happen. So time to go MIA for a few weeks, and when I come out the other side I'll hopefully be in a better position to be churning out features.


I'm going in!

Thursday, February 12, 2009

Ask ed


Have you ever noticed that nearly every magazine has a person named Ed, who is responsible for responding to readers' letters? Well I've just employed such an individual, and his surname is Itor!


Creating a game can be a long and arduous project, but there are moments of pure adrenaline. Now is such a moment! I've just implemented an inline game editor, and it rocks! It only places tiles right now, and you can't actually save yet, but the foundation is there and it just feels like such an important feature in terms of the overall game quality, because it removes all the tedious trial and error that would otherwise be required. Check it out!


Jumping video

As promised, a video of the new wall jumping moves. Enjoy!


Sunday, February 8, 2009

Progress report: Feb 8


Not much to say. Busy week, and I squeezed in just a few hours of work.



I did manage to add a few new moves, specifically 2 variations on wall jumping.



The player can now collect items too. The only items with meaning right now are keys, whereby doors can be locked until a specific key is found and then the door can be unlocked. Over time, items will become a fundamental aspect of the game, as the player will need to explore for items, trade them with NPC, etc.



Stay tuned for a video soon, featuring the new moves.

Saturday, January 31, 2009

Building blocks (part 2)


Let's take a closer look at the new tiles I've created. Keeping with the idea that the center area of the tile should be simple and repeatable, once again I've marked this area with a square.


Rock:






Grass:






Very simple, and hopefully effective.

Progress report: Feb 1


One month in, and I'm still going. That's some kind of record for me. :)


I spent a lot of time trying out various art styles this week. My attempts at incorporating real photos failed, primarily because there was always a dominant artifact in each picture which ruined the effect when repeated over and over.


I've finally settled back into a simple cartoon style similar to the placeholder art I've been using until now.


The big news is that I've designed the lead character. Check him out, along with simple grass and rock tiles:






If the character looks familiar, here is why:












You don't need a single bone of artistic talent to trace. :)


I'm not sure what I'll do next week. I need to add a wall jump move, because I want to start designing levels soon and that requires knowing what the player can do. But I'm also really keen to implement NPCs, as I have some ideas to make conversations interesting and context-sensitive without requiring much work. Stay tuned.

Saturday, January 24, 2009

Progress report: Jan 25


I've totally disregarded the goals I outlined for this week. The good news is that I have made progress, and some of the things are pretty cool! Introducing:


XML loading



Pretty much everything is now loaded from XML files. 1 goal achieved. :)


Intelligent tile rendering based on adjacent tiles



No need to specify whether you're defining a top-left corner tile, a bottom tile, etc. The tile engine looks at all adjacent tiles and automatically determines which sprite to render, so I only have to deal with a handful of truly distinct tiles rather than 16 separate sprites for each.


In the absence of a level editor, this makes the grid definition easy to read and to change. Did somebody say ASCII art? Check out the sample definition below.


<TileTemplate
IsLeftSolid="false"
IsTopSolid="true"
IsRightSolid="false"
IsBottomSolid="false"
>
<Acceleration Horizontal="-0.25" />
<TileSize Width="40" Height="40" />
</TileTemplate>

<TileGrid IsActive="true">
<TileSize Width="40" Height="40" />
<GridSize Width="16" Height="9" />
<TileTemplates>
<TileTemplate
Path="Object/Tile/SolidTile"
GridSymbol="1"
/>
<TileTemplate
Path="Object/Tile/PlatformTile"
GridSymbol="-"
/>
<TileTemplate
Path="Object/Tile/WindLeftTile"
GridSymbol="("
/>
<TileTemplate
Path="Object/Tile/WindUpTile"
GridSymbol="^"
/>
</TileTemplates>
<Rows>
<Row Tiles="1111111111111111" />
<Row Tiles="1111000000001111" />
<Row Tiles="1100000110000011" />
<Row Tiles="110(((^110000011" />
<Row Tiles="1--(((^110011001" />
<Row Tiles="1(((((^110000001" />
<Row Tiles="100----110001111" />
<Row Tiles="1000000110000001" />
<Row Tiles="1111111111111111" />
</Rows>
</TileGrid>

Wind



If you were paying attention, you would have noticed that the tile template above includes an Acceleration tag. When a character's position is updated, acceleration from the tile at the center point of that character's position is also applied.


Terrain



In my last progress report, I toyed with the idea of modelling terrain using a very simple technique of enforcing a minimum and maximum height at each point in a level. It is now working, albeit with some limitations.


In order to be able to draw terrain that transitions smoothly from each point to the next, I decided that each terrain would have a fixed number of available increments to choose from, and each of these increments would have an associated sprite. This could mean having to create a lot of sprites, but I'm leaning towards each segment in the terrain being very small (~10 pixels), in which case I shouldn't need more than 10 sprites for every terrain. I'm also planning to use the effect sparingly, partly to limit the amount of art I need to create.


Sound effects



Making sound effects should be a crime. It is ridiculously fun!


Microsoft has a tool called XACT, that can be used for managing sound effects and music. It is the same tool they give to AAA game publishers for the Xbox 360. You don't have to use it, but it gives you a lot of flexibility.


The general approach is that I fire off an audio cue from my code, and the audio system responds with a sound or set of sounds. For example, if I was making a tennis game I might fire off a "HitBall" cue, and the audio system would play the sound of a ball hitting a racquet (and possibly also a grunt, if it was a womens' match).


Where it gets really cool is that you can provide multiple sounds for a single cue, and specify the probability of each sound playing. In testing my code, I had the main character saying "Jump!" whenever he jumped. But very rarely, he would instead yell out "I'm flying!!!". You probably had to be there.


Anyway, here is an example of how to hook in an audio cue to an animation:


<Sprite Name="JumpRight">
<SpriteAnimationFrames>
<SpriteAnimationFrame
Duration="0"
AudioCue="MainCharacterJump"
>
<TextureRegion
Left="0"
Top="50"
Width="50"
Height="50"
/>
<DisplayOffset
Width="-3"
Height="-2"
/>
</SpriteAnimationFrame>
</SpriteAnimationFrames>
</Sprite>


In my code, every sprite is also an animation, so I could create a singing, dancing tile if I wanted to. That might sound silly, but I am considering building a grass tile where the blades of grass slowly sway in the wind.



Here is a short video of some very basic terrain and wind effects:




Thursday, January 22, 2009

Hello world



Building blocks


I want to share a cool technique for quickly building tiles for 2d worlds. In particular, avoiding the need to design separate blocks for perimeter tiles. Take the following screen:






Although the effect is subtle here, notice that all walls carry a black border. To achieve this, tiles positioned at the top-left of a structure must look different from those at the bottom, etc. There are 16 combinations in all, and we want to avoid having to design them all individually.


Here is the single tile I used to achieve the screen above, magnified 4x:






The key is to make the tile a little bigger than it should be, in this case 40x40, and to position the black lines outside of this area. Here is the same tile with its 40x40 region shown with a square:






As long as the area inside the square can be tiled nicely, you can pretty much go for your life in the outside area, and then chop up the tile in various ways to create the 16 images you need. Here is how the tile would be chopped up for the top-left tile:






While this example is very simple, the concept is very useful. For example, in the next couple of weeks I'm going to create a tile containing a nice grass texture and with blades of grass protruding out of the top of the tile.


The only requirement is that the sprite engine you're using must support position offsets, otherwise the extra size will stuff up the screen position of the tile.