Gil Megidish
And I love writing / rewriting / reverse engineering games
Canvas Video Audio Web Sockets Web Storage Web Worker Web Database Selectors Validation File API Semantic Elements What The Heck is HTML5
Games + Javascript? = wtf
Why Bother With Javascript? Fun to develop –Hacker ’ s spielplatz! Fast deployment –Serve static files Easy to debug –alert(), firebug.. Still better than the alternative! Open source and free tools –Notepad, vi, emacs B.Y.O. framework –jQuery? spielplatz
But Why REALLY? Has been around for ages Won ’ t go away any time soon Wide support: –Web browsers –Mobile devices –Facebook applications –On a rocket near you
LOGIC GRAPHICS INPUT SOUND Anatomy of a Game MUSIC MULTIPLAYER GAME ASSETS
LOGIC GRAPHICS INPUT SOUND Anatomy of a Game MUSIC MULTIPLAYER GAME ASSETS javascript code onkeydown, onmousedown ajax, WebSocket Images, Audio, Video and Binary supported by browsers
Graphics
Framebuffer (raw) 0,00,10,20,30,40,50,60,70,x 1,01,11,21,31,41,51,61,71,x y,0y,1y,2y,3y,4y,5y,6y,7y,x x y … … …
Tile + Sprite Memory
Scene Graph Placeholder For Future Presentation
Canvas is King
DEMO TIME!
Three Demos To Rule Them All Framebuffer demo Sprites demo Vector graphics demo
Catch me a canvas Guru Meditation: No canvas supported! var canvas = document.getElementById(“graphics”); var context = canvas.getContext(“2d”);
Drawing Primitives ctx.fillStyle = “#c80000"; ctx.fillRect (10, 10, 55, 50); ctx.fillStyle = "rgba(0, 0, 200, 0.5)"; ctx.fillRect (30, 30, 55, 50); Other drawing methods: arc, bezierCurve, lineTo, quadraticCurve, rect, stroke, fillText, strokeText, beginPath/closePath and fill
(but who needs that ?)
Drawing Images var sprite = new Image(); sprite.src = “ luigi.png ” ; var x = 0, y = 0; ctx.drawImage(sprite, x, y);
Drawing Images 2 var spritemap = new Image(); spritemap.src = “ sprite-map.png ” ; ctx.drawImage( spritemap, sx, sy, sw, sh, dx, dy, dw, dh ); Sprite maps save loading time by fewer requests and better compression. drawImage() also provides scaling and cropping.
Going Crazy With Images // context state checkpoint ctx.save(); ctx.translate(0, 80); ctx.rotate(-45 * Math.PI / 180.0); ctx.scale(3.0, 1.0); ctx.drawImage(luigi, 0, 0); // revert all context changes ctx.restore();
Accessing Pixels var block = ctx.getImageData(sx, sy, sw, sh); block = { width: width in pixels, height: height in pixels, data: array of 4*width*height bytes }; Alternatively: ctx.createImageData(w, h);
Accessing Pixels var block = ctx.getImageData(0, 0, canvas.width/2, canvas.height); for (var y=0; y<block.height; y++) { for (var x=0; x<block.width; x++) { block.data[(y*block.width+x)*4+0] ^= 0xff; block.data[(y*block.width+x)*4+1] ^= 0xff; block.data[(y*block.width+x)*4+2] ^= 0xff; } ctx.putImageData(block, 0, 0);
Why Access Pixels ? Complicated things impossible without putImageData() Read image pixels getImageData combined with primitive drawing = save image to disk! These examples are available to
The Jazz Singer
Let There Be Sound! $( “ sfx001 ” ).play();
Let There Be Sound! $( “ sfx001 ” ).play(); Other methods: $( “ sfx001 ” ).pause(); Other attributes: $( “ sfx001 ” ).currentTime = 35.0; $( “ sfx001 ” ).volume = 0.5; $( “ sfx001 ” ).duration (read only)
Putting It All Together
Typical Game Loop function gameTick() { processKeyboard(); moveEnemies(); drawGraphics(); updateAudio(); } var fps = 60; setInterval(gameTick, 1000 / fps);
The Future is Upon Us!
Quake2 HTML5
What ’ s Coming Up Next WebGL –OpenGL interface for Javascript –As of May, 2010: good luck finding a stable browser! WebSocket –UDP and nonblocking transport layer –Not there yet! (KAAZING?) WebStorage –Save games?
Code Like It ’ s 2020! ftw! ‘s‘s Blackberry coming June 1 st !
Q&A
Yes! You can use in Internet Explorer 6? PS. Remember to upgrade your mother ’ s IE!
Links! Chrome Experiments: Not Your Momma ’ s JS – Appcelerator ’ s Titanium – Box 2D: real time physics for JS games – Mozilla ’ s Canvas tutorial –
GO MAKE GAMES!