<!DOCTYPE html>
<html>
<head>
 <meta charset='utf-8'>
 <title> Ship </title>
 <style>
 #c { border: 1px solid black; }
 </style>
</head>
<body onkeydown='keydown(event);' onkeyup='keyup(event);' onload='start();'>
<canvas id='c' width=1024 height=768></canvas>
<script>
var ctx = document.getElementById("c").getContext("2d");

var rocks = [];
function start() {
  for(var i=0; i < 5; i++) {
    rocks.push(new Rock(100, R(0,1023), R(0,768)));
  }
  for(var i=0; i < 5; i++) {
    rocks.push(new Rock(75, R(0,1023), R(0,768)));
  }
  for(var i=0; i < 5; i++) {
    rocks.push(new Rock(40, R(0,1023), R(0,768)));
  }
}

var thrusting = false;

var ship = {
  x : 1024/2,
  y : 768/2,
  dx : 0,
  dy : 0,
  angle : 0,
  da : 0,

  draw : function() {
    ctx.clearRect(0,0,1024,768);
    ctx.strokeStyle = "black";
    ctx.lineWidth = 3;
    ctx.save();
    ctx.translate(this.x,this.y);
    ctx.rotate(this.angle);
    ctx.beginPath();
    ctx.moveTo(20,0);
    ctx.lineTo(-20,10);
    ctx.lineTo(-16,7);
    ctx.lineTo(-16,-7);
    ctx.lineTo(-20,-10);
    ctx.closePath();
    ctx.stroke();
    if (thrusting) {
      ctx.strokeStyle = "red";
      ctx.beginPath();
      ctx.moveTo(-18,6);
      ctx.lineTo(-35,0);
      ctx.lineTo(-18,-6);
      ctx.moveTo(-18,6);
      ctx.closePath();
      ctx.stroke();
    }
    ctx.restore();
  },
  update : function() {
    if (thrusting) {
      this.dy += .15 * Math.sin(this.angle);
      this.dx += .15 * Math.cos(this.angle);
    } else {
      this.dx *= .997;
      this.dy *= .997;
    }
    this.x = this.x + this.dx;
    if (this.x <= -20) this.x = 1024+20;
    else if (this.x > 1024+20) this.x = -20;
    this.y = this.y + this.dy;
    if (this.y <= -20) this.y = 768+20;
    else if (this.y > 768+20) this.y = -20;
    this.angle = this.angle + this.da;
  }
};

function update() {
  ship.draw();
  ship.update();
  for(var i = 0; i < rocks.length; i++) {
    rocks[i].draw();
    rocks[i].update();
  }
  setTimeout(update, 16);
}

setTimeout(update, 16);

function keydown(e) {
  console.log(e.key);
  switch(e.key) {
    case 'ArrowUp':
    case 'w':
      thrusting = true;
      break;
    case 'ArrowDown':
    case 's':
      break;
    
    case 'ArrowLeft':
    case 'a':
      ship.da = -5 * Math.PI/180;
      break;
    case 'ArrowRight':
    case 'd':
      ship.da = 5 * Math.PI/180;
      break;
  }
}
function keyup(e) {
  switch(e.key) {
    case 'ArrowUp':
    case 'w':
      thrusting = false;
      break;
    case 'ArrowDown':
    case 's':
      break;
    case 'ArrowLeft':
    case 'ArrowRight':
    case 'a':
    case 'd':
      ship.da = 0;
      break;
  }
}

function R(a, b) {
  var range = Math.abs(a-b)+1;
  var min = Math.min(a,b);
  return Math.floor(Math.random()*range) + min;
}

function Rock(size, x, y) {
  this.size = size;
  this.x = x;
  this.dx = R(-4,4);
  this.y = y;
  this.dy = R(-4,4);
  this.angle = 0;
  this.da = R(-8,8)*Math.PI/180;

  this.draw = function() {
    ctx.strokeStyle = "black";
    ctx.save();
    ctx.translate(this.x,this.y);
    ctx.rotate(this.angle);
    ctx.beginPath();
    ctx.rect(-this.size/2,-this.size/2,this.size,this.size);
    ctx.closePath();
    ctx.stroke();
    ctx.restore();
  };

  this.update = function() {
    this.x = this.x + this.dx;
    if (this.x <= -20) this.x = 1024+20;
    else if (this.x > 1024+20) this.x = -20;
    this.y = this.y + this.dy;
    if (this.y <= -20) this.y = 768+20;
    else if (this.y > 768+20) this.y = -20;
    this.angle = this.angle + this.da;
  };
}

</script>
</body>
</html>