Creating 2D Games with JavaScript & HTML5
By Dominic Szablewski, creator of the Impact Game EngineThis post is part of Who's at
Google I/O, a series of guest blog posts written by developers who are appearing in
the Developer
Sandbox at Google
I/O.Impact is a JavaScript game engine that uses the
HTML5
Canvas and
Audio elements for
graphics and sound, instead of relying on any browser plugins. Impact's main focus is on
classic 2D games. Examples include the
Biolab
Disaster Jump'n'Run game and the
Z-Type Space Shooter. These games, like
many other 2D games, draw sprites in front of multiple background layers.
Each background layer is drawn from a
tileset, an image containing all the individual building blocks, and a tilemap, a 2D array
that tells the renderer where to draw each of these tiles. Similarly, sprites are drawn from
an animation sheet, an image with all the animation's frames.
This
technique has proven so efficient and flexible that it was enforced in hardware on early game
consoles: the
Super Nintendo could
not do anything other than draw tiled background maps and sprites. There was no way to
directly access single pixels on the screen.
The HTML5 Canvas element
is perfectly equipped for these kinds of games. Most importantly, the Canvas API's
drawImage()
method allows us to draw only a certain part of a tileset
or animation sheet to the screen. In Impact, however, you don't have to deal with any of the
Canvas API methods directly. Instead, you specify your tilemaps and animation sheets and let
the engine handle the details.
This is how you'd create an animation
from an animation sheet:
// Each animation frame is 16x16
pixels
var sheet = new ig.AnimationSheet( 'player.png', 16, 16 );
// This creates the "run" animation: it has 6 frames (the 2nd row
// in the
image), with each one being shown for 0.07 seconds
var run = new ig.Animation(
sheet, 0.07, [6,7,8,9,10,11] );
Similarly, here's the code needed to
create and draw a background layer:
// Create a 2D tilemap
var map = [
[5, 3, 4],
[2, 7, 1],
[6, 0, 3]
];
// Specify a layer with a tilesize of 16px and our
tilemap
var layer = new ig.BackgroundMap( 16, map, 'tileset.png' );
layer.draw();
You don't have to create these tilemaps by hand.
Impact comes with a powerful level editor called
Weltmeister,
which makes it easy to draw background layers and position your entities (non-static objects
in the game world) in your levels.
When drawing on a Canvas, the performance
is mostly bounded by the number of draw calls. It is far more efficient to draw one or two
very large images than to draw several hundred small ones. This means that drawing background
layers tile by tile can be quite slow, especially on mobile devices.
The Impact engine therefore has a special "pre-render" mode that you can enable on
background layers. This mode will first draw the tilemap into large chunks of 512x512 pixels
when loading a level, and then use these chunks to fill the screen instead of drawing the
layer tile by tile. With this technique, you can get good frame rates even for fast-paced
games on Android and iOS devices.
Impact also handles sound, input,
timing, and much more for you. It's by no means a game engine that can do everything – and it
doesn't try to be one – but it's very good at the things it can do.
Come see Impact
in the Developer
Sandbox at Google
I/O on May 10-11.Dominic Szablewski is the creator of the Impact
Game Engine. He recently finished his Bachelor Thesis about HTML5 Gaming and now lives the
dream by selling Impact and making
games.Posted by Scott Knaster,
Editor