My making
of Santa’s Snowball was originally going to be just a single article but as I
was covering so much of the various Create.js librarys the article kind of grew
much longer than I had anticipated. This means that it will be broken into
multiple parts which will be immediately followed by the making of game 2 in my
Santa trilogy (to be announced next week) and that will probably be followed by
the making of game 3 which means that I will not be able to get back to my
creation of an assembler until late December, though I will have some progress
reports if significant progress is made.
Santa's Snowball was an
interesting project as I wanted to have a Christmas game for this year and
noticed that there were three games that formed a trilogy. I decided that I
would port all three games to get into the Christmas spirit as well as to practice
my Create.js skills as I am working on a book on that subject so the more
familiar I am the better. More about the books in February.
I had performed
a quick port of the game to Create.js using Animate only to discover that the
size of the assets when converted to JavaScript were huge. The only asset that
I bothered keeping was the snowball. For everything else, I created an image
atlas that held everything. An image
atlas is simply just a large image that contains other images, including sprite
sheets, with the idea that you only load the single image. When dealing with 3D
APIs such as Open GL, this is extremely desirable as switching textures is very
costly so having everything on a single texture can greatly boost speed. The
key thing to remember when creating an image atlas is that you need to leave
space between images otherwise you may end up with fringes. I did not remember
this so there are some minor fringing issues with Santa’s Snowball but nothing overly
concerning.
The sprite sheet
support in Create.js is great with the ability to specify complex animation
sequences. The class even has support for spreading your images across multiple
image atlases which could be an effective way of organizing complex character
animation but not something I had to worry about.
Having just
a single image that multiple sprite sheets would access meant that I could
preload the image. As I have a bunch of sounds to load as well, the preload.js
library would be useful. Sound.js is the Create.js sound library and while
sounds do not need to be preloaded, if they have not been preloaded they will
not play the first time they are called. The preload.js is the preloading
library and simply takes a manifest array to determine what gets preloaded.
Events are generated for things such as loading a file, problems with a file,
and completing the manifest. I simply captured events for the completion of the
loading and for errors. It is important to point out that a file that can not
be loaded does not block completing the preloading so if you have files that
you require then make sure to detect errors in loading. Here is my code for
setting up the preloading.
function init() {
// setup preload.js with necessary drivers
preload = new createjs.LoadQueue(true);
createjs.Sound.registerPlugins([createjs.HTMLAudioPlugin]);
preload.installPlugin(createjs.Sound);
// preload.addEventListener("fileload", handleFileLoaded);
preload.addEventListener("error", handleQueueError);
preload.addEventListener("complete", handleQueueComplete);
preload.loadManifest(
[
{src:"images/SantaSnowball_atlas.png", id:"SantaSnowball_atlas"},
{src:"sounds/SnowSplat1wav.mp3", id:"SnowSplat"},
{src:"sounds/WishTest.mp3", id:"WishTest"},
{src:"sounds/woosh1wav.mp3", id:"woosh"}
]
);
}
Notice that
there is an additional step that I did not mention in the prior paragraph. Not
registering a plugin can result in pounding your head against a wall trying to
figure out why sounds won’t play. A plugin needs to be registered for sound. Other
plugins can be installed for different types of data so it is conceivable that
you could create your own datatype and write a plugin that handles it. A good
example of where this would be handy is for a game that uses maps or some other
type of level data.
Another
thing that could be done when creating image atlases is break things into two types
of atlases. Sprites, which have transparent areas, can be placed into png files
while solid backdrops can be placed into jpeg files which would allow for much
better compression. This is not something I did with Santa’s Snowball, but will
be a consideration for future projects that I work on.
Next week
we will take a look at how I assembled the seven scenes that make up the game.