]> git.plutz.net Git - flarejs/commitdiff
movement functions
authorPaul Hänsch <paul@plutz.net>
Tue, 11 Feb 2020 03:08:08 +0000 (04:08 +0100)
committerPaul Hänsch <paul@plutz.net>
Tue, 11 Feb 2020 03:08:08 +0000 (04:08 +0100)
engine.js

index 7c9263202202a02a8e57746f96c5be29da08c4c7..faeecc2a97cb35576f71a30b90e4c39ff8842415 100644 (file)
--- 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 );