Depends on JavaScript Edition 5. Works with Chrome 9+, Firefox 3.6+, Safari 5+ & IE9.
Licensed under LGPL so you’re free to use it for commercial projects.
-
Animation(), Sprite(), SpriteSheet(), TileMap(), Assets() and other useful constructors
-
Easy and robust game state system to switch between menus, play, high score lists and settings
-
JSDOC Documentation & commented examples
Jaws also:
-
Does <canvas>-sprites and exprimental HTML-based sprites
-
Does not depend on any other JavaScript library
-
Doesn’t try to force a certain “JS class pattern” on you, just pure JavaScript as mother nature intended it
-
Tries to make assets (images, music, json data) in webgames as easy as possible
-
Often does object literals as arguments for readabillity (ie. new Sprite({image: “player.png”, x: 100, y: 100})
-
Builds on lessons learned from years of developing github.com/ippa/chingu (Ruby game lib)
-
jawsjs.com/docs/index.html - Jaws documentation
-
jawsjs.com/ - Official Jaws homepage. Overview and design choices.
-
jawsjs.com/jawsjs/test/index.html - Jaws testsuite (QUnit)
Jaws is well suited for “classic” side/top scrolling games (tile based or not) where you have a number of sprite-sheet-animated sprites. Jaws comes with basic rect-vs-rect/circle-vs-circle collision detection that works well in most cases. If you have tons of sprites (for example, a bullet hell schmup) you probably want to use a physicslib like Box2D or spatial hashing like quad trees to speed things up. Jaws use of canvas makes pixel perfect collisions and worms-style terrain relatively easy to develop. If your game is very GUI-heavy you might want to base your game on pure HTML-elements instead of canvas-sprites.
Check out the sourcecode for comments and explanations:
-
jawsjs.com/jawsjs/examples/example0.html - get a Jaws-app working with as little code as possible
-
jawsjs.com/jawsjs/examples/example1.html - basic example with manual setup of canvas
-
jawsjs.com/jawsjs/examples/example2.html - jaws game states
-
jawsjs.com/jawsjs/examples/example3.html - jaws.Animation
-
jawsjs.com/jawsjs/examples/example4.html - jaws.Rect based collision detection
-
jawsjs.com/jawsjs/examples/example5.html - the jaws.Sprite({anchor: “…”}) parameter
-
jawsjs.com/jawsjs/examples/example6.html - jaws.Parallax
-
jawsjs.com/jawsjs/examples/example7.html - simple DOM-based sprite
-
jawsjs.com/jawsjs/examples/example8.html - jaws.TileMap
-
jawsjs.com/jawsjs/examples/example9.html - jaws.Viewport (The basics for a sidescrolling platformer right here)
-
jawsjs.com/jawsjs/examples/example10.html - jaws.game_states.Edit, a simple map editor
-
jawsjs.com/jawsjs/examples/example11.html - jaws.gfx.retroScaleImage and Literal Notion game state
-
jawsjs.com/jawsjs/examples/example12.html - jaws.viewport.drawTileMap() - optimized tile map drawing
-
ippa.se/webgames/the_escape/index.html - “The Escape” - My Ludum Dare #21 entry. Adventure/Puzzle.
-
ippa.se/webgames/unexpected_outcome/index.html - A 10-minute adventure game with pixel-perfect collisions
-
ippa.se/webgames/unwaivering/index.html - A Jaws-game for www.ludumdare.com/compo/2011/01/25/minild-24/
-
h31p.com/save-atherton/ - A political satire mini-game from github.com/dalethatcher
-
www.mcfunkypants.com/LD22/ - a Ludum Dare #22 entry by Christer Kaitila
-
nibster.net/LD/ - a Ludum Dare #22 entry by github.com/Nibster
-
memetika.com/iron_santa/ - a Ludum Dare #22 entry by github.com/dmitrizagidulin
… missing your game here? Msg me on github!
-
jaws.js - includes the whole framework in one easy-to-include file.
-
jaws-min.js - same as jaws.js but minified with Googles closure compiler. This is probably what you want to include in your project.
-
jaws-dynamic.js - dynamically loads all separate jaws files. Useful for debugging errors in Jaws. Warning, jaws-dynamic.js loads all jaws source-files asynchronously meaning Jaws might not be fully loaded before the browser
-
reaches your game.js or likewise. Jaws tries to solve this issue by calling jaws.onload() when all files are loaded.
You can also link to invidual files in your HTML:
<script src="/jawsjs/src/core.js"></script> <script src="/jawsjs/src/sprite.js"></script>
NOTE: core.js is always needed but after that you can pick and choose depending on what you need. A rule of thumb is that a file named “foo.js” will include a contructor named Foo().
Jaws accepts contributions, some simple guidelines:
-
Formatting: oneFunction(), OneConstrutor() and one_variable
-
2 spaces for indentation
-
Don’t patch jaws.js or jaws-min.js
-
Please bundle tests with non-trivial patches
-
For bigger patches/feature additions, please contact me beforehand to discuss if/how it fits into Jaws and how to form the API
-
Naming shouldn’t consist of abbreviations, let’s use “context”, not “ctx”
Jaws has gotten bigger contributions from: github.com/dmitrizagidulin - SpriteList() rewrite github.com/gregmax17 - Viewport related stuff
If you find an issue with Jaws githubs issue-tracker is the place to go. Easiest for the developers is if you put your game online. If you don’t have any hosting check out pages.github.com/. Pasting your problematic code in the issue-ticket itself will usually mean a lot of hassle with supportcode and assets to actually be able to test the code in question.
/*
* Jaws will provide powerful functions like jaws.start() to quickly get a robust gameloop running.
* It's also possible to do it more manually, fetch your own canvas context and sent it to new Sprite() for example.
* Nothing stops you from using jaws.assets or other jaws.helpers with your own game loop either.
*
* Below code shows the preferred way, letting jaws worry about most of the boring setup stuff
* so we can get straight to get game logic.
*/
<html>
<script src="jaws.js"></script>
<body>
<canvas width=500 height=300></canvas> <!-- don't set width/height of canvas with CSS -->
<script>
/*
* Jaws encourages the use of game states to separate various parts of your game.
* We send MyGameState to jaws.start() to start with.
* You can later switch to another game state with jaws.switchGameState(OtherGameState)
*/
function MyGameState() {
var player;
var robot;
/* Put your one-time initializing here. Will get called once each time this game state is activated. */
this.setup = function() {
/*
* Make a sprite, place it at position 10/200
* The string "player.png" will resolve to a previously fetched resource
* We let jaws worry about what canvas to paint to here.
* If we want we could simple pass {context: my_canvas_context} to Sprite constructor
*/
player = new jaws.Sprite({image: "player.png", x: 10, y: 200});
/* Let's create an animated robot sprite */
robot = new jaws.Sprite({x: 200, y: 200});
robot.animation = new jaws.Animation({sprite_sheet: "images/droid_11x15.png", frame_size: [11,15], frame_duration: 120});
}
/* update() is called each gametick with given FPS. Put your game logic here. */
this.update = function() {
if(jaws.pressed("left")) { player.x--; }
if(jaws.pressed("right")) { player.x++; }
robot.image = robot.animation.next();
}
/* draw() is called each gametick just after update() is done. Put your drawing/canvas stuff here. */
this.draw = function() {
player.draw();
robot.draw();
}
}
/*
* jaws.start(YourGameState) is the easiest way to get something up and running. It will in this order:
*
* 1) Call jaws.init() that will detect <canvas> (or create one for you) and set up the 2D context
* - then available in jaws.canvas and jaws.context
*
* 2) Pre-load all assets
* - player.png image is then available with jaws.assets.get("player.png")
*
* 3) Create an instance of YourGameState and call setup() on that instance
* - in setup() you usually create your gameobjects, sprites and so forth
*
* 4) Loop calls to update() and draw() with given FPS (default 60) until game ends or another game state is activated
*/
window.onload = function() {
/*
* Add to jaws internal list of assets.
* You can then either:
* - have jaws.start() load them automatically for you
* - or load them manually with jaws.assets.loadAll({loaded: myAssetsAreReadyCall})
*/
jaws.assets.add("images/droid_11x15.png");
jaws.assets.add("images/player.png");
/*
* ... or nicer when you have a lot of assets:
* jaws.assets.path = "images/"
* jaws.assets.add(["droid_11x15.png", "player.png"])
*/
jaws.start(MyGameState);
}
</script>
</body>
</html>