Created
January 27, 2012 15:03
-
-
Save tinyrobot/1689178 to your computer and use it in GitHub Desktop.
Partial Application / javascript games with underscore.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//our simple data structure | |
function Spatial(x,y,vx,vy){ | |
this.x = x; | |
this.y = y; | |
this.vx = vx || Math.random(); | |
this.vy = vy || Math.random(); | |
} | |
//use partial application here so that we can compose this in our main update | |
function processEvents(keys){ | |
return function(spatial){ | |
if(keys[68]){ spatial.vx += 0.1; } | |
if(keys[83]){ spatial.vy += 0.1; } | |
if(keys[65]){ spatial.vx -= 0.1; } | |
if(keys[87]){ spatial.vy -= 0.1; } | |
return spatial; | |
}; | |
} | |
function move(spatial){ | |
spatial.x += spatial.vx; | |
spatial.y += spatial.vy; | |
return spatial; | |
} | |
//use partial application here so that we can compose this in our main update | |
function render(context,image){ | |
return function(spatial){ | |
context.drawImage(image,spatial.x,spatial.y); | |
return spatial; | |
}; | |
} | |
function inViewport(spatial){ | |
return spatial.x < canvas.width && spatial.y < canvas.height; | |
} | |
//we return a function here that closes over the initial local variables | |
//also means we can call _.delay with the same or different args to potentially evolve the loop | |
function iterate(input,spatials,context,image){ | |
return function(){ | |
context.clearRect(0,0,500,500); | |
var _spatials = _.map(spatials,_.compose(processEvents(input),move,render(context,image))); | |
_spatials = _.filter(_spatials,inViewport); | |
_.delay(iterate(input,_spatials,context,image),1000/60); | |
}; | |
} | |
window.onload = function(){ | |
//simple map to hold keys to query | |
var input = {}; | |
window.onkeydown = function(e){ | |
input[e.keyCode] = true; | |
}; | |
window.onkeyup = function(e){ | |
input[e.keyCode] = false; | |
}; | |
//grab stuff for rendering | |
var canvas = document.getElementById("canvas"); | |
var context = canvas.getContext("2d"); | |
var image = document.getElementById("image"); | |
//simple list of spatials | |
var spatials = [ | |
new Spatial(0,0),new Spatial(5,7) | |
]; | |
iterate(input,spatials,context,image)(); | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment