-
Notifications
You must be signed in to change notification settings - Fork 1
/
bullet.js
101 lines (94 loc) · 2.75 KB
/
bullet.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/**
* Creates a new Bullet.
*
* @constructor
* @param {number} x The x position of the Bullet.
* @param {number} y The y position of the Bullet (height above the ground).
* @param {number} heading The heading that the Bullet is moving in.
*/
$.Bullet = function(x, y, heading) {
this.x = x;
this.y = y;
this.heading = heading;
this.step = 10;
this.hit = false;
this.size = 10;
this.move();
};
$.Bullet.prototype.findNewPos = function() {
var endStep = Math.round(this.step * $.Game.stepFactor);
var currentStep = 1;
var newXPos, newYPos;
while (!this.hit && (currentStep < endStep)) {
// Attempt to move.
var testX = this.x + Math.cos(this.heading) * Math.round(currentStep);
var testY = this.y + Math.sin(this.heading) * Math.round(currentStep);
var blocked = $.Map.circleIsBlocked(testX, testY, 5);
if (!blocked) {
newXPos = testX;
newYPos = testY;
currentStep++;
} else {
this.hit = true;
}
}
if (currentStep > 1) {
return {newXPos: newXPos, newYPos: newYPos};
} else {
return null;
}
};
/**
* Moves this Bullet based on its current heading and step size.
*/
$.Bullet.prototype.move = function() {
if (this.heading != null && !this.hit) {
var newPos = this.findNewPos();
if (newPos) {
// Apply the new position.
this.y = newPos.newYPos;
this.x = newPos.newXPos;
// Check the map bounds for wrap around.
if (this.x < 0) {
// Increment by width of room in pixels.
this.x += $.Constants.ROOM_X_PIXELS;
}
if (this.y < 0) {
// Increment by height of room in pixels.
this.y += $.Constants.ROOM_Y_PIXELS;
}
if (this.x >= $.Constants.ROOM_X_PIXELS) {
// Decrement by width of room in pixels.
this.x -= $.Constants.ROOM_X_PIXELS;
}
if (this.y >= $.Constants.ROOM_Y_PIXELS) {
// Decrement by height of room in pixels.
this.y -= $.Constants.ROOM_Y_PIXELS;
}
}
}
};
/**
* Draws the bullet.
*/
$.Bullet.prototype.draw = function(ctx, offsetX, offsetY) {
ctx.globalCompositeOperation = "lighter";
ctx.shadowColor = 'rgba(226,88,34, 1)';
ctx.shadowOffsetX = 0;
ctx.shadowOffsetY = 0;
ctx.shadowBlur = 20;
for (var i=1; i<20; i+=4) {
var tempX = this.x - Math.cos(this.heading) * i;
var tempY = this.y - Math.sin(this.heading) * i;
$.Util.fillCircle(ctx,
Math.round(tempX - offsetX - (this.size/2)),
Math.round(tempY - offsetY - (this.size/2)),
Math.round(this.size),
'rgba(226,88,34,' + (0.2 + Math.random() * 0.6) + ')');
}
ctx.globalCompositeOperation = "source-over";
ctx.shadowColor = 'rgba(0,0,0,0)';
ctx.shadowBlur = 0;
ctx.shadowOffsetX = 0;
ctx.shadowOffsetY = 0;
};