-
Notifications
You must be signed in to change notification settings - Fork 0
/
spaceship.js
104 lines (84 loc) · 2.34 KB
/
spaceship.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
102
103
104
// The Nature of Code
// Daniel Shiffman
// http://natureofcode.com
// Chapter 3: Asteroids
class Spaceship {
constructor() {
// All of our regular motion stuff
this.position = createVector(width / 2, height / 2);
this.velocity = createVector();
this.acceleration = createVector();
this.ps = new ParticleSystem();
// Arbitrary damping to slow down ship
this.damping = 0.995;
this.topspeed = 6;
// Variable for heading!
this.heading = 0;
// Size
this.r = 16;
// Are we thrusting (to color boosters)
this.thrusting = false;
}
// Standard Euler integration
update() {
this.velocity.add(this.acceleration);
this.velocity.mult(this.damping);
this.velocity.limit(this.topspeed);
this.position.add(this.velocity);
this.acceleration.mult(0);
this.ps.run();
}
// Newton's law: F = M * A
applyForce(force) {
let f = force.copy();
//f.div(mass); // ignoring mass right now
this.acceleration.add(f);
}
// Turn changes angle
turn(a) {
this.heading += a;
}
// Apply a thrust force
thrust() {
// Offset the angle since we drew the ship vertically
let angle = this.heading - PI / 2;
// Polar to cartesian for force vector!
let force = p5.Vector.fromAngle(angle);
force.mult(0.1);
this.applyForce(force);
force.mult(-2);
this.ps.addParticle(this.position.x, this.position.y, force);
// To draw booster
this.thrusting = true;
}
wrapEdges() {
let buffer = this.r * 2;
if (this.position.x > width + buffer) this.position.x = -buffer;
else if (this.position.x < -buffer) this.position.x = width + buffer;
if (this.position.y > height + buffer) this.position.y = -buffer;
else if (this.position.y < -buffer) this.position.y = height + buffer;
}
// Draw the ship
display() {
stroke(0);
strokeWeight(2);
push();
translate(this.position.x, this.position.y);
rotate(this.heading);
fill(175);
if (this.thrusting) fill(255, 0, 0);
// Booster rockets
rectMode(CENTER);
rect(-this.r / 2, this.r, this.r / 3, this.r / 2);
rect(this.r / 2, this.r, this.r / 3, this.r / 2);
fill(175);
// A triangle
beginShape();
vertex(-this.r, this.r);
vertex(0, -this.r);
vertex(this.r, this.r);
endShape(CLOSE);
pop();
this.thrusting = false;
}
}