From f9db9da6b9274fabb7c322db4e45018eaa8126d2 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Paul=20H=C3=A4nsch?= Date: Tue, 11 Feb 2020 04:08:08 +0100 Subject: [PATCH] movement functions --- engine.js | 69 ++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 55 insertions(+), 14 deletions(-) diff --git a/engine.js b/engine.js index 7c92632..faeecc2 100644 --- a/engine.js +++ b/engine.js @@ -117,8 +117,13 @@ function Map(textdef) { 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)); } } @@ -255,22 +260,56 @@ function Hero(gender = "female", hair = "short"){ } 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;"); @@ -290,6 +329,8 @@ map = new Map("/maps/arrival.txt"); 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 ); -- 2.39.2