Asteroids/scripts/Ship.js
Tyler Williamson 43c64d4e61 Initial Commit
2018-03-23 17:26:30 -04:00

98 lines
2.9 KiB
JavaScript

var Ship = function () {
this.x = 400;
this.y = 300;
this.dx = 0;
this.dy = 0;
this.angle = 0;
this.tri = [[0,0],[0,0],[0,0]];
this.MAX_SPEED = 4.5;
this.ACCEL = .08;
this.TURN_SPEED = .06;
this.SHIP_WIDTH = 4 * Math.PI / 5;
this.tri[0] = [this.x + 15 * Math.cos(this.angle),this.y + 15 * Math.sin(this.angle)];
this.tri[1] = [this.x + 10 * Math.cos(this.angle + this.SHIP_WIDTH), this.y + 10 * Math.sin(this.angle + this.SHIP_WIDTH)];
this.tri[2] = [this.x + 10 * Math.cos(this.angle - this.SHIP_WIDTH), this.y + 10 * Math.sin(this.angle - this.SHIP_WIDTH)];
};
Ship.prototype.moveAndDraw = function (ctx) {
this.x += this.dx;
this.y += this.dy;
this.x = (this.x + 800 ) % 800;
this.y = (this.y + 600 ) % 600;
//TODO: add fire!
this.tri[0] = [this.x + 15 * Math.cos(this.angle),this.y + 15 * Math.sin(this.angle)];
this.tri[1] = [this.x + 10 * Math.cos(this.angle + this.SHIP_WIDTH), this.y + 10 * Math.sin(this.angle + this.SHIP_WIDTH)];
this.tri[2] = [this.x + 10 * Math.cos(this.angle - this.SHIP_WIDTH), this.y + 10 * Math.sin(this.angle - this.SHIP_WIDTH)];
ctx.beginPath(); //Centre
//ctx.arc(this.x,this.y,1,0,2*Math.PI);
ctx.stroke();
ctx.beginPath();
ctx.moveTo(this.x + 15 * Math.cos(this.angle + this.SHIP_WIDTH), this.y + 15 * Math.sin(this.angle + this.SHIP_WIDTH));
ctx.lineTo(this.tri[0][0], this.tri[0][1]);
ctx.lineTo(this.x + 15 * Math.cos(this.angle - this.SHIP_WIDTH), this.y + 15 * Math.sin(this.angle - this.SHIP_WIDTH));
ctx.moveTo(this.tri[1][0],this.tri[1][1]);
ctx.lineTo(this.tri[2][0],this.tri[2][1]);
ctx.stroke();
};
Ship.prototype.turn = function(direction) {
if (direction)
this.angle += this.TURN_SPEED;
else
this.angle -= this.TURN_SPEED;
};
Ship.prototype.accelerate = function () {
this.dx += this.ACCEL * Math.cos(this.angle);
this.dy += this.ACCEL * Math.sin(this.angle);
speed = Math.sqrt(this.dx * this.dx + this.dy * this.dy);
if (speed > this.MAX_SPEED) {
this.dx *= this.MAX_SPEED / speed;
this.dy *= this.MAX_SPEED / speed;
}
};
Ship.prototype.isCollision = function (x,y,r) {
var flag = false;
for (var i=0;i<3;i++) {
var m = (this.tri[i][1] - this.tri[(i+1)%3][1])/(this.tri[i][0] - this.tri[(i+1)%3][0]);
var c = (m * this.tri[i][0]) - this.tri[i][1];
var xproj = ((x+m*y)+m*c)/(m*m+1);
var yproj = (m*(x+m*y)-c)/(m*m+1);
var d = Math.pow(y - m * x + c,2) / (m*m + 1); //distance squared
if (d < (r * r) &&
((xproj > this.tri[i][0] && xproj < this.tri[(i+1)%3][0]) || (xproj < this.tri[i][0] && xproj > this.tri[(i+1)%3][0])) &&
((yproj > this.tri[i][1] && yproj < this.tri[(i+1)%3][1]) || (yproj < this.tri[i][1] && yproj > this.tri[(i+1)%3][1]))) {
flag = true;
break;
}
if (Math.pow(x - this.tri[i][0],2) + Math.pow(y - this.tri[i][1],2) < r * r) {
flag = true;
break;
}
}
return flag;
};
Ship.prototype.hide = function () {
this.x = -100;
this.y = -100;
this.dx = 0;
this.dy = 0;
}