2d engine

broken skeleton system

by Tgwizman

HTML

<canvas id="c"></canvas>
<div id="menu" hidden=true>
  <input type="button" value="Fullscreen">
  <input type="button" value="Exit Menu">
</div>

CSS

* {
  position: absolute;
  top: 0;
  left: 0;
  margin: 0;
  padding: 0;
  width: 100%;
  height: 100%;
  background: #0F0;
  overflow: hidden;
}

#menu {
  background: #0009;
}

#menu * {
  left: calc((100% - 20em)/2);
  width: 20em;
  height: 3em;
  background: #999;
}

#menu *:hover {
  background: #CCC;
}

JavaScript

class Vec {
	constructor(x, y) {
  	this.x = x || 0;
    this.y = y || 0;
  }
  
  plus(p) {
  	return new Vec(
    	this.x + p.x,
      this.y + p.y
    );
  }
  
  minus(p) {
  	return new Vec(
    	this.x - p.x,
      this.y - p.y
    );
  }
  
  times(p) {
  	return new Vec(
    	this.x * p.x,
      this.y * p.y
    );
  }
  
  divide(p) {
  	return new Vec(
    	this.x / p.x,
      this.y / p.y
    );
  }
}

var canvas = document.getElementById('c'),
  ctx = canvas.getContext('2d'),

	debug = false,

  time = {
    debug: false,
    now: new Date().getTime(),
    delta: 0,
    count: 0,
    tick: 0,
    logs: [],
    fps: 0
  },

	tileSize = 120,

  keys = {},
  player = false,
  menu_showing = false;

var menuActions = {
	'Fullscreen': e => {
  	if (document.fullscreenElement) {
    	document.exitFullscreen();
    } else {
    	document.body.requestFullscreen();
    }
  },
	'Exit Menu': () => toggleMenu()
};

function toggleMenu() {
	if (menu_showing) {
  	document.getElementById('menu').style.display = 'none';
  } else {
  	document.getElementById('menu').style.display = 'block';
  }
  menu_showing = !menu_showing;
}

function initMenu() {
	let list = document.getElementById('menu').children;
  for (let i=0; i<list.length; i++) {
  	let item = list[i];
    if (item.value in menuActions) {
    	item.addEventListener('click', menuActions[item.value], false);
    }
  }

	menu_showing = !menu_showing;
  toggleMenu();
}

function shineAlpha(t) {
	let i = t/20, a = i * Math.PI/180
  	r = (Math.sin(a) + 1) / 2;

	r = r + 0.3;

  r = Math.min(1, Math.max(0, r));
	let s = Math.round(r * 15).toString(16);
  return s;
}

var camera = {pos: new Vec(0, 0)};

function rotate(origin, point, angle) {
	let pos = point.minus(origin);
  
  let p = new Vec(
  	pos.x * Math.cos(angle) - pos.y * Math.sin(angle),
    pos.x * Math.sin(angle) + pos.y * Math.cos(angle)
  );
  
  return origin.plus(p);
}

class Entity {
	constructor(color, pos, size) {
		this.color = color ||...