En estos días he estado trabajando en un simple framework para desarrollar juegos en javascript+html5.
Por ahora solo llevo un 20% pero ya tengo un par de cosas necesarias para crear juegos como por ejemplo escenas, colisiones, sprites y assets manager con preloading. También tiene clases de rectángulo, puntos 2d y map sorting.
Aun me falta trabajar en el rendering y el game loop ademas de agregar otras cosas como animaciones, tilemaps, camaras, websockets, etc.
Acá pueden ver un simple demo que muestra preloading, assets managing, cambios de escena y colisiones rectangulares con separación.
http://shin.cl/shinlib/Acá esta el codigo de el demo, y mas o menos como se trabajaría con shinjs:
World.init(
function()
{
Assets.addImage("1","http://24.media.tumblr.com/tumblr_m2l87ml9X71r0ralmo1_500.gif");
Assets.addImage("2","http://25.media.tumblr.com/tumblr_lzz242aMJB1qje0eqo1_500.jpg");
Assets.addImage("3","http://24.media.tumblr.com/tumblr_m3q5mhSl4I1ruo5glo1_500.jpg");
Assets.addImage("4","http://24.media.tumblr.com/tumblr_m0ix4iEUVM1qjogmno1_500.jpg");
Assets.addImage("5","http://25.media.tumblr.com/tumblr_m39ojeujQE1rpg9v8o1_500.gif");
}
,640,480,60,true,true);
World.backgroundColor("#5a5a5a");
World.run = function()
{
var scene = new Scene();
scene.set(
function init()
{
//init.
trace("Init scene 1.")
this.r1 = new Rectangle(0,100,100,100);
this.r2 = new Rectangle(300,150,100,100);
this.speedx = 5;
this.speedy = 5;
this.count = 500;
},
function update()
{
//update.
this.r1.x+=this.speedx;
this.r1.y+=this.speedy;
if(this.r1.x>World.width-this.r1.width || this.r1.x<0 ) this.speedx*=-1;
if(this.r1.y>World.height-this.r1.height || this.r1.y<0) this.speedy*=-1;
if(this.r2.x>World.width || this.r2.x<-this.r2.width || this.r2.y>World.height || this.r2.y<-this.r2.height)
{
this.r2.x = 300;
this.r2.y = 150;
}
this.count--;
if(this.count<1) World.setScene(scene1);
},
function render()
{
//render.
World.canvas.drawImage(Assets.getImage("2"),0,0);
World.canvas.fillStyle = "#ff0000";
World.canvas.fillRect(this.r1.x,this.r1.y,this.r1.width,this.r1.height);
if(Collision.overlap(this.r1,this.r2))
{
World.canvas.fillStyle = "#ffff00";
Collision.separate(this.r1,this.r2);
}
World.canvas.fillRect(this.r2.x,this.r2.y,this.r2.width,this.r2.height);
}
)
World.setScene(scene);
var scene1 = new Scene();
scene1.set(
function init()
{
//init.
trace("Init scene 2.")
this.count = 500;
},
function update()
{
//update.
this.count--;
if(this.count<1)
{
World.setScene(scene);
}
},
function render()
{
//render.
World.canvas.drawImage(Assets.getImage("3"),0,0);
World.canvas.strokeStyle = "#ffffff";
World.canvas.font = "30px Verdana";
World.canvas.strokeText("Scene 2",100,100);
}
)
}
Saludos!