HTML5 and Other Modern Browser Game Tech
Jeff Timanus, November 2nd, 2011
Use arrow keys, space, or click on left and right of slides to navigate.
Ctrl/Command +/- to change zoom.
Jeff Timanus, November 2nd, 2011
HTML5 & Related Technologies
Engines & Mobile Distribution
Learning more
With some of this HTML5 browser tech ...
Platform Reach & Success
Engines & Mobile Distribution
Learning more
SVG
CSS 3D
WebGL
Audio
<video>
WebSockets & Server Tech
WebStorage
Web workers
Native Client
<canvas id="e" width="200" height="100"></canvas> <script type='text/javascript'> var context = document.getElementById("e").getContext("2d"); var cat = new Image(); cat.src = "images/cat.png"; cat.onload = function() { context.drawImage(cat, 0, 0); }; </script>
// Draw eyes ctx.fillRect(160, 130, 20, 80); ctx.fillRect(220, 130, 20, 80); // Draw mouth ctx.beginPath(); ctx.moveTo(100, 230); // Start smile ctx.bezierCurveTo(100, 230, 200, 380, 300, 230); ctx.moveTo(219, 298); // Start tongue ctx.bezierCurveTo(278, 351, 315, 315, 277, 258); ctx.lineWidth = 20; ctx.stroke();
Adapted from an IE 9 sample
Canvas2D
WebGL
CSS 3D
Audio
<video>
WebSockets & Server Tech
WebStorage
Web workers
Native Client
<!DOCTYPE html><html><body> <svg id="mySVG"> <circle id="circle0" cx="100" cy="75" r="50" fill="grey" stroke="black" stroke-width="10" onmousedown="alert('Hello World!');"><\circle> <text x="200" y="70">Hello World</text> </svg> ...
<script> var circle = document.createElementNS( "http://www.w3.org/2000/svg", "circle"); circle.setAttribute('cx', 90); circle.setAttribute('cy', 90); circle.setAttribute('r', 50); circle.setAttribute('stroke', 'grey'); circle.setAttribute('stroke-width', 10); circle.setAttribute('onmousedown', "alert('No, me!');"); document.getElementById("svg0").appendChild(circle); </script>
Canvas2D
SVG
CSS 3D
Audio
<video>
WebSockets
WebStorage
Web workers
Native Client
Check out more cool demos at chromeexperiments.com!
<script id="vshader" type="x-shader/x-vertex"> uniform mat4 u_modelViewProjMatrix; uniform mat4 u_normalMatrix; uniform vec3 lightDir; attribute vec3 vNormal; attribute vec4 vColor; attribute vec4 vPosition; varying float v_Dot; varying vec4 v_Color; void main() { gl_Position = u_modelViewProjMatrix * vPosition; v_Color = vColor; vec4 transNormal = u_normalMatrix * vec4(vNormal, 0.0); v_Dot = max(dot(transNormal.xyz, lightDir), 0.0); } </script>
<script id="fshader" type="x-shader/x-fragment"> varying float v_Dot; varying vec4 v_Color; void main() { gl_FragColor = vec4(v_Color.xyz * v_Dot, v_Color.a); } </script>
var gl = canvas.getContext(“webgl”, args); gl.createShader(shaderType); gl.shaderSource(shader, shaderScript.text); gl.compileShader(shader); var colors = new Uint8Array( [ 0,0,1,1, 0,0,1,1, 0,0,1,1, 0,0,1,1, 1,0,0,1, 1,0,0,1, 1,0,0,1, 1,0,0,1, //… box.colorObject = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, box.colorObject); gl.bufferData(gl.ARRAY_BUFFER, colors, gl.STATIC_DRAW);
function drawPicture(gl) { reshape(gl); gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); // Setup a model/view matrix. mvMatrix.makeIdentity(); mvMatrix.rotate(20, 1,0,0); mvMatrix.rotate(currentAngle, 0,1,0); //... gl.drawElements(gl.TRIANGLES, box.numIndices, gl.UNSIGNED_BYTE, 0); //... }
Aka: Your render loop!
setInterval(draw, 16) setInterval(draw, 16)
function draw() { //... Do drawing work, then ask to be called again: window.requestAnimationFrame(draw); } // Kick off first frame: window.requestAnimationFrame(draw);
// shim layer with setTimeout fallback – Paul Irish window.requestAnimFrame = (function(){ return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function(/* function */ callback, /* DOMElement */ element){ window.setTimeout(callback, 1000 / 60); }; })();
Canvas2D
SVG
WebGL
Audio
<video>
WebSockets
WebStorage
Web workers
Native Client
<!DOCTYPE html><html><body> <style> .css3ddemo { -webkit-transition: all .4s ease-in-out; -webkit-transform-style:preserve-3d; } .css3ddemo:hover { -webkit-transform:rotateY(15deg); }</style> <div style="-webkit-perspective: 400;"> <iframe class="css3ddemo" src="http://sijm.ca/2011/"></iframe> </div></body></html>
Canvas2D
SVG
WebGL
CSS 3D
<video>
WebSockets & Server Tech
WebStorage
Web workers
Native Client
var audio = new Audio(); audio.addEventListener("canplaythrough", function () { audio.play(); }); audio.src = "treasure.ogg";
<audio controls="controls"> <source src="horse.ogg" type="audio/ogg" /> <source src="horse.mp3" type="audio/mp3" /> Your browser does not support the audio element. </audio>
new Audio().canPlayType("audio/ogg");
SoundManager2
Canvas2D
SVG
WebGL
CSS 3D
Audio
WebSockets & Server Tech
WebStorage
Web workers
Native Client
videoElement.play(); videoElement.addEventListener("timeupdate", updateTexture, true); function updateTexture() { gl.bindTexture(gl.TEXTURE_2D, cubeTexture); gl.texImage2D(gl.TEXTURE_2D, 0, videoElement, true); gl.generateMipmap(gl.TEXTURE_2D); }
Canvas2D
SVG
WebGL
CSS 3D
Audio
<video>
WebStorage
Web workers
Native Client
var socket = new WebSocket("ws://server.com"); socket.onopen = function(event) { socket.send("Hello Server"); } socket.onmessage = function(event) { alert("Server says: " + event.data); }
Server - Reply with 'Hello World'
var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World\n'); }).listen(1337, "127.0.0.1"); console.log('Server running at http://127.0.0.1:1337/');
Awesome demo: Plink
Canvas2D
SVG
WebGL
CSS 3D
Audio
<video>
WebSockets & Server Tech
Web workers
Native Client
localStorage["levels-unlocked"] = 5 // or .getItem() / .setItem() localStorage.removeItem("inventory-special-item") localStorage.clear(); // Remove everything
CACHE MANIFEST index.html stylesheet.css images/logo.png scripts/main.js
Canvas2D
SVG
WebGL
CSS 3D
Audio
<video>
WebSockets & Server Tech
WebStorage
Native Client
main.js (main thread):
var worker = new Worker('doWork.js'); worker.addEventListener('message', function(e) { console.log('Worker said: ', e.data); }, false); worker.postMessage('Hello World'); // Send data to our worker.
doWork.js (worker thread):
self.addEventListener('message', function(e) { self.postMessage(e.data + “? ” + e.data + “!”); }, false);
// Output: "Worker said: Hello World? Hello World!"
Canvas2D
SVG
WebGL
CSS 3D
Audio
<video>
WebSockets & Server Tech
WebStorage
Web workers
From Android to NaCl in 8 Weeks
Resources: Open Media Web & W3 Games Community Group
Platform Reach & Success
HTML5 & Related Technologies
Learning more
Platform Reach & Success
HTML5 & Related Technologies
Engines & Mobile Distribution
New Game - HTML5 Game Development Conference
Nov 1-2, San Francisco
Sponsors include Google & Microsoft
Making Isometric Social Real-Time Games with HTML5, CSS3, and JavaScript