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)
http://jawsjs.com/docs/index.html - Jaws documentation
http://jawsjs.com/ - Official Jaws homepage. Overview and design choices.
http://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
http://ippa.se/webgames/the_escape/index.html - “The Escape” - My Ludum Dare #21 entry. Adventure/Puzzle.
http://ippa.se/webgames/unexpected_outcome/index.html - A 10-minute adventure game with pixel-perfect collisions
http://ippa.se/webgames/unwaivering/index.html - A Jaws-game for www.ludumdare.com/compo/2011/01/25/minild-24/
http://h31p.com/save-atherton/ - A political satire mini-game from github.com/dalethatcher
http://www.mcfunkypants.com/LD22/ - a Ludum Dare #22 entry by Christer Kaitila
http://nibster.net/LD/ - a Ludum Dare #22 entry by github.com/Nibster
http://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>