December 15, 2008

a walk at night

This is an excellent third-party level for Knytt Stories. It is short but the atmosphere is fantastic.



You can download it here. Direct download link here.

December 11, 2008

back from the dead

I've finished another semester of school. I will be posting some of my work soon, but for now here is an animation I discovered in my old files:



It was made in QBasic using arrays of colour values for the frames. It's my earliest character animation (unless you count ascii graphics). The file is dated February 2002.

September 21, 2008

flash platformer physics

I've been experimenting with platformer physics using the Flash version of Box2D in order to familiarize myself with ActionScript. I gave the character the ability to hang on edges and climb ropes by using joints in ways they were never meant to be used.



click to activate and use the arrow keys to control the character

September 01, 2008

yet more physics animation

Here is a better example of a physics-based walk:



It's still a bit crude but it's approaching something that could be used in the game. The animation system controls the rotation of the box that the feet are attached to, the feet being IK handles that control the animation of the legs. The walking animations are played when the appropriate keys are pressed.

In other news, I'm starting to see the true enormity of this project, and scaling my plans down accordingly by stripping them of unnecessary features. Fortunately, I hadn't posted about those features so there is nobody to disappoint except myself. I think this may strengthen the game though, by removing distractions that could obscure its core.

August 24, 2008

jumper 3



I don't normally have the patience for these types of games, but Jumper 3 was fun enough to keep me playing until the end. In it you control Ogmo through over 50 stages, switching between five separate forms with different abilities. For an additional challenge you can try to collect the coins and medals. I really liked the simple graphics and the music, as well as the general atmosphere created by the story and setting.

I personally would have enjoyed this game more if the controls were a little easier. The way Ogmo accelerates when moving horizontally makes it hard to predict his movement, and each of Ogmo's forms have different physics properties which make it even more difficult to learn. But overall it's a very polished experience.

August 17, 2008

more physics animation

I decided to try integrating physics right into the character editor. I'm not completely sure yet if it's going to work the way I expect it to, but the plan is to have both the skeletal animation and the physical movement of the character controlled through the animation system.

For example, consider a character that is made up of joints and quads and attached to a box which is connected by a revolute joint to a circle (as in the screenshots). The walking animation would animate the joints to make it look like the character is walking and it would also animate the motor of the revolute joint to rotate the circle so that the character moves along the ground.





I'm still working out the complexities but I think this system has a lot of potential for awesomeness. It is basically a way of doing data-driven character movement, which gives character creators a lot of freedom without having to write any code.

July 28, 2008

more concept art

I'm thinking about going with a more abstract style than the textured/painted look I was originally planning. The graphics would be much easier to make - I could possibly even do all the artwork for an entire game by myself.





The sprites look to be a little too detailed for the environment. Flat colours might be more suitable there instead of the shading.

July 25, 2008

physics based animation

I was experimenting with physics based animation with Box2DX:



I don't think it would work well for my project, but the results are entertaining. The movement of the bodies is controlled by joints (revolute and prismatic), with motors enabled. The speed of a motor is modified to target a certain angle/translation based on keyboard input.

July 13, 2008

PSA



I haven't been posting lately because I haven't been able to come up with anything worth posting. I took a break from coding for a couple of weeks, and then (re)started working on the game editor/map editor for my project. It's going well, but it is still in its early stages. Posting will resume as soon as I have something interesting to show.

June 21, 2008

animation system


I don't feel like making a new screenshot so here are some tulips instead.


This is a general overview of the way my character editor works.

To recap from my last post about aiming, all of the objects in the editor are nodes in a hierarchy. They are derived from a base class that I call TransformNode. The specialized nodes that I have so far are the Joint, IKHandle, and Quad. Joints are nodes that form a skeleton and can be affected by IK, IKHandles are nodes that control an IK chain (of joints), and Quads are the textured quads that make up the visible part of an entity.

All nodes contain a collection of attributes that are used in animation. The base node has translation and rotation attributes, and specialized nodes can add other attributes to the collection. The Quad, for example, has additional attributes for width, height, and texture coordinates. (This means that texture/sprite animation can be used in combination with skeletal animation.) New attributes are animateable as soon as they are added to the node and exposed to the interface (via a public property with get/set accessors so that they show up in the property grid).

Attributes are animated by setting keyframes in the animation curve that is associated with that attribute. A curve contains a set of keyframes and a reference to the node it affects, along with the attribute index. Keyframes contain data for control points on the animation curve and their tangents. The positions of the points on the curve are the frame of the animation (x) and the value of the attribute at that frame (y). Bezier interpolation is used to interpolate the values between keyframes. An animation is simply a set of curves.

Aim animations have an additional bit of data called an AimVector. It has minimum and maximum rotation values and is attached to a node in the hierarchy. Aim animations are like regular animations except that there are only two keyframes. When aiming, the angle of the vector between the aim vector node position and the target position is compared to the minimum and maximum angles to get an interpolation value. This value is used to do a linear interpolation between the two frames of the aim animation.

When exporting animations, the curve data is interpolated and values are saved for every frame in the animation (so that interpolation does not need to be performed in game).

This editor has evolved a lot over the time I've been working on it. I'm finally satisfied with this particular implementation, although a lot of the functionality was copied from Maya.

June 14, 2008

animated gif creation

In my previous post, I included an animated gif showing my editor in action. I thought a gif was appropriate in this situation because it was a short animation, uploading it to YouTube caused serious distortions, Photobucket doesn't allow me to host swf files, and because the limited colours make it suitable for gif compression. I used several free tools to make this gif, and thought I'd describe the process in case others find it useful.

First I used CamStudio to record the demonstration. It's a really simple app that outputs avi files and has the option of converting them to swf files.

After that I used RAD Video Tools to convert the avi file into a series of gif files. I set "Adjust (adds/removes frames) to" to 15, so the output would be 15 frames per second of video.

Then I used GIMP to turn the gif files into a single gif animation using the instructions I found here. Like the post says, I opened the first file and imported the rest as layers using File -> Open As Layers. I saved the file as an animation that loops forever with a 60 ms delay between frames. I also set "frame disposal where unspecified" to one frame per layer, and checked "use delay entered above for all frames" and "use disposal entered above for all frames".

The result was a 523 KB file with 266 frames at 272x248 pixels, 17 seconds at about 15 fps.

June 11, 2008

more aiming

I came up with a better way to do weapon aiming. In order to implement it I had to rewrite some parts of the editor to make it work more like Maya. All of the objects in the editor (Joints, IKHandles, and Quads) are now derived from the same base class, called a TransformNode, which has translation and rotation values. They are all contained in the same hierarchy, with a single root node. Here is an example of how this system can be used for aiming:



In this example, the aim animation rotates the node that the IK handles are grouped to. The shooting/recoil animation moves the IK handles.

It seems so obvious now that this is the correct way to do it; I'm not sure why I didn't think to do it this way earlier. This system uses the IK handles directly, so the hands are always placed correctly. It's also more flexible and consistent than what I had in my previous post.

June 04, 2008

game project



I figured I should start documenting the development of my game more thoroughly. I've avoided posting my plans because I don't feel certain about them, but there are some things that are not likely to change so I can at least talk about that.

As you can probably tell from previous posts about this project, it's a side-scrolling game inspired by Soldat. I was motivated to start it by the demand from the Soldat community for more modding possibilities in Soldat. I'm borrowing heavily from Soldat in several aspects (2D skeletal animation, terrain made of textured polygons, combat with projectile weapons, mouse aiming) but the similarities mostly end there.

My game is going to be a single-player Metroidvania-style platformer with a focus on exploration and the use of a variety of weapons and items to defeat monsters and progress through the world. I plan to incorporate elements inspired by the Zelda series, especially Wind Waker, into the gameplay and visual style. Like Zelda, it will have a fantasy theme, with possibly some steampunk thrown in (see Chrono Trigger). Features include vehicles, water, and dynamic lighting.

One of my main goals with this project is to make content creation relatively easy and fast. To that end, I'm developing powerful tools for use with the engine (the character editor and the map/general editor that I will start re-writing soon). I'm aiming to have the tools and engine ready to use by September 2009, with a demo ready by May 2010 for use in my portfolio. At that point, assuming I get there, I will decide if it is worth turning into a full game (possibly with online play). However this schedule is not fixed.

I'm using C# with MDX, and I intend to port it to XNA 3.0 eventually.

In upcoming posts I will go into more detail on the internal workings of the game and character editor and on my plans for the game itself.

May 25, 2008

box2dx

I've decided to use Box2DX, a C# port of Box2D, for physics.



It was easy to integrate into my program and start using it, and it should save me a lot of trouble. Writing my own code for rigid body dynamics would have taken me forever. It also opens up more potential for physics-based gameplay.

May 18, 2008

newest addiction

Kryzta. TIGSource describes it as:
an “anti-shooter” where you defeat your enemies with their own bullets. Collect the power-ups they drop to shield yourself (or press “Z” to unleash a devastating attack with them).

It was made in only 6 hours - a great example of rapid game prototyping/development.



Last weekend it was Portal: The Flash Version. Portal is one of the few commercial games that I actually kind of want to play, but can't be bothered to, so this was a good way for me to get some portal action.

May 13, 2008

weapon aiming

I got my aiming animation stuff working, sort of. The editor now allows one animation to be added on top of another. This allows me to blend a shooting animation with an aim animation, like this crude example shows:



However it doesn't always give good results. My test animation looks alright when aiming upwards and straight ahead, but not so well when aiming downwards:



As you can see, the support hand doesn't stay where it's supposed to. This could be solved by changing the shooting animation or by using IK for the support hand. In the game, the aim animation would be controlled by the crosshair position.

May 09, 2008

what's taking so long?



You may be wondering why the progress on my project has been so slow. The main reason for this is that as usual, I bit off more than I can chew. It's a much larger project than anything I've done before, and it's somewhat beyond my abilities - that's what makes it such a good learning experience.

I'm not making just a game, but a game engine and a set of tools to go with it. This means that for every feature I want to implement, I have to generalize it. For example, with the weapon aiming system I've been working on, it's necessary to allow any character made in the character editor to be able to aim, and each character will have a different set of weapons that they are able to use. This makes the problem much more difficult to solve than if it only applied to the main character, for example - then it could all be hard coded. I also try to implement each feature that is exposed in the interface in a way that's easy to use when creating content.

When it comes to programming, I look for solutions that are simple and keep the level of complexity low so that it doesn't turn into a maintenance nightmare in the future. In fact I have a hard time getting any code written if I'm not satisfied with the plan I've come up with. This means that I spend a lot of time working stuff out on paper, but it also means that when I do get around to coding, it often works the first time and cuts down on the time I spend debugging.

All of this, plus difficulty concentrating, results in really slow progress. I'm enjoying the process though, and I'll keep chewing on it as long as it's fun.


P.S. I now have access to a camera, so expect more unrelated photos with my posts.

May 05, 2008

update

According to the earliest timestamp I could find on my game-related files, I started working on it in May of 2006 - it's been two years. I've learned a lot, even though much of the work I've put into it hasn't produced tangible results.

All I have to show for now is a rough implementation of the graph editor:



Currently I'm working on having joints be controlled by the crosshair position, to make it possible for characters to aim their weapons in a convincing way.

May 04, 2008

sketch dump

A composite of some random sketches.

May 03, 2008

self-portrait

Self portrait for drawing class. I did the initial drawing in an hour, so it's kind of sloppy and the proportions are off. About another hour was spent adding some shading.

May 01, 2008

another redesign

As you can see, things have changed. Here is a list.
  • Template - It's green! This theme was inspired by the GDNet classic theme. Hopefully I didn't break anything with my lack of CSS skills. Also, no more bunnies.
  • Display name - I've ended my half-assed attempt at anonymity. The blog is now on my main Google account, which is more convenient for me.
  • Title - I still suck at coming up with names for things. Might as well call it what it is.
  • URL - I wanted something related to what this blog is about. It's hard to come up with decent sounding names that aren't already taken.
  • Stat counter - Now I can keep track of my readers. All three of them.

April 28, 2008

level

Some screenshots of my unfinished level for intro to games class:



April 27, 2008

work dump

This is some of the work I did in school this year that I hadn't posted yet. All done in Maya and Photoshop.

Lighting assignment for rendering class:





Coffee cup for rendering class:




Obligatory crate:




My can and logo design for the falcon punch commercial:




Character model for modelling class (textured as a statue):



April 26, 2008

knytt stories

I've just finished replaying Knytt Stories (The Machine and A Strange Dream). It's a 2D platformer by Nifflas that came out in 2007. I meant to post about it earlier, but didn't get around to it until now. I have much love for this game - I think it's as close to perfect as a game can get.



First off, it's very easy to pick up. The interface and controls are extremely simple. The game is all about exploration (which happens to be my favourite thing to do in a game). As the player advances through the world, they gain new abilities that allow them to reach places they couldn't access before. I like that it does not rely on the kill-or-be-killed mechanic (it's just "be killed," but still, it's refreshing). There are infinite lives and plenty of save points, which cuts down on the frustration. Story is minimal: just enough to provide context, the way I prefer it. The retro style music and graphics are great and combine to make a fantastic atmosphere. Levels are short, which is good because I don't have a lot of patience these days, and it makes for a tightly focused experience. Nothing is out of place; all the elements fit together to form a cohesive whole.

This article goes into more depth on the gameplay.

I also recommend previous games by Nifflas: Within A Deep Forest and Knytt.

April 25, 2008

level concepts updated

I made my level concepts more prettyful:





The graphics in my game might look something like this.

April 16, 2008

falcon punch

This was part of a group project for my presentations class. Excruciatingly intense hilarity provided by Colin and Steve:

April 13, 2008

comic

After a solid week of work, I bring you my amazing two page comic spread for rendering class:



I used Maya and Photoshop, with various screentones found on the internets. Models were provided for this assignment. This has got to be the worst way to make a comic. It would have taken me a fraction of the time to just draw it out by hand. The screentoning was fun though.

April 11, 2008

level concepts

Some really quick concepts for a flash project for school:



April 03, 2008

another character design

For drawing class:

March 23, 2008

i'm not dead

...just really busy with school. This is a screentone test for a two-page comic spread for my rendering class. I'm aiming for a black and white manga style:



(Maya + Photoshop; model provided by the teacher; various screentones found online.)

February 10, 2008

bezier interpolation

I just got my Bezier interpolation working:



This thread was very helpful, and I stole the code for the cubic equation solver from here. The code to draw Bezier curves is from here.

Now I have to apply it to my animation curves.

February 02, 2008

animusic loop

A looping musical animation:



I was working on this all week - 14 hours straight on Thursday to get it in before the end of the day. It was heavily inspired by the Animusic videos.

Here are some lovely curves:



[edit: made it loop 4 times instead of once]

February 01, 2008

love letter

Dear Maya Animation Curves,

I'm hopelessly addicted to you. I can't stop thinking about setting your keyframes. I want to run my cursor over your splines. Let me unlock the weighting of your tangents, and manipulate your control points. I'll gently scrub back and forth along the timeline, and then we'll edit until our motions are in synch with the music. We can cycle to infinity all night long. Or at least until after the buses stop running.

Love,

Anna

January 21, 2008

musical primitives

This is a Maya animation I made for school. I had to animate some primitives to music: