dx = posx + (w + x - y) * tw /2;
dy = posy + (x + y) * th / 2;
this.draw_tile(bg[i], dx, dy);
+ }
+ for ( y = 0; y < h; y++ ) for ( x = 0; x < w; x++ ) {
+ i = y * h + x;
+ dx = posx + (w + x - y) * tw /2;
+ dy = posy + (x + y) * th / 2;
this.draw_tile(ob[i], dx, dy);
- if (mm[i]) mm[i].forEach(m => m.draw(dx, dy));
+ if (mm[i]) mm[i].forEach(m => m.draw(m.position[0] + posx, m.position[1] + posy));
}
}
}
function Controls(hero, map){
+ var kbdmap = {
+ up: 87, altup: 38,
+ down: 83, altdown: 40,
+ left: 65, altleft: 37,
+ right: 68, altright: 39,
+ }
var keys = [];
+ var col = map.info.layer.find(l => l.type == "collision").data;
+
+ window.addEventListener("keydown", e => keys[e.keyCode] = true );
+ window.addEventListener("keyup" , e => keys[e.keyCode] = false);
+ setInterval(() => input(), 33.33)
+
+ function translate(x, y){
+ var sx = map.info.header.tilewidth * hero.stats.speed / 33.33;
+ var sy = map.info.header.tileheight * hero.stats.speed / 33.33;
+ var dx = x * sx, hx = hero.position[0];
+ var dy = y * sy, hy = hero.position[1];
+ var f = 2.1;
+
+ if (col[map.tileAt(hx + dx, hy + dy)] == 0 )
+ hero.place(hx + dx, hy + dy);
+ else if ( dy == 0 && col[map.tileAt(hx + dx / f, hy + sy / 1.5)] == 0 )
+ hero.place(hx + dx / f, hy + sy / 1.5);
+ else if ( dy == 0 && col[map.tileAt(hx + dx / f, hy - sy / 1.5)] == 0 )
+ hero.place(hx + dx / f, hy - sy / 1.5);
+ else if ( dx == 0 && col[map.tileAt(hx + sx / 1.5, hy + dy / f)] == 0 )
+ hero.place(hx + sx / 1.5, hy + dy / f);
+ else if ( dx == 0 && col[map.tileAt(hx - sx / 1.5, hy + dy / f)] == 0 )
+ hero.place(hx - sx / 1.5, hy + dy / f);
+ else player.stance();
+
+ map.center(hero.position[0], hero.position[1]);
+ }
function input(){
- var d = {};
- d.l = keys[65] || keys[37]; d.r = keys[68] || keys[39];
- d.u = keys[87] || keys[38]; d.d = keys[83] || keys[40];
- if ( d.l ) hero.direct(0).run(); if ( d.r ) hero.direct(4).run();
- if ( d.u ) hero.direct(2).run(); if ( d.d ) hero.direct(6).run();
- if ( d.u && d.l ) hero.direct(1).run();
- if ( d.u && d.r ) hero.direct(3).run();
- if ( d.d && d.l ) hero.direct(7).run();
- if ( d.d && d.r ) hero.direct(5).run();
- if ( ! (d.l || d.r || d.u || d.d) ) hero.stance();
+ const dir = [ -1, 0, 4, -1, 2, 1, 3, 2, 6, 7, 5, 6, -1, 0, 4, -1 ];
+ const trans = [ [-1.4,0], [-1,-1], [0,-1.4], [1,-1], [1.4,0], [1,1], [0,1.4], [-1,1] ];
+ var k = 0;
+
+ k += (keys[kbdmap.left] || keys[kbdmap.altleft]) ? 1 : 0;
+ k += (keys[kbdmap.right] || keys[kbdmap.altright]) ? 2 : 0;
+ k += (keys[kbdmap.up] || keys[kbdmap.altup]) ? 4 : 0;
+ k += (keys[kbdmap.down] || keys[kbdmap.altdown]) ? 8 : 0;
+
+ if (~dir[k]) {
+ hero.direct(dir[k]).run();
+ translate(trans[dir[k]][0], trans[dir[k]][1]);
+ } else hero.stance();
}
- window.addEventListener("keydown", function(e){ keys[e.keyCode] = true ; input();} );
- window.addEventListener("keyup" , function(e){ keys[e.keyCode] = false; input();} );
}
document.querySelector("body").setAttribute("style", "margin: 0; padding: 0;");
player.place(map.info.header.hero_pos.split(/,/)[0] * map.info.header.tilewidth,
map.info.header.hero_pos.split(/,/)[1] * map.info.header.tileheight);
player.direct(5).stance();
+
+map.center(player.position[0], player.position[1]);
c = new Controls(player, map);
-setInterval (function() { map.center(player.position[0], player.position[1]).draw([player]);}, 33.33 );
+setInterval (() => map.draw([player]), 16.66 );