-
Notifications
You must be signed in to change notification settings - Fork 0
/
SpaceObj.java
90 lines (85 loc) · 3.22 KB
/
SpaceObj.java
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
import java.awt.image.BufferedImage;
import java.awt.*;
import javax.swing.*;
import java.util.*;
import java.awt.event.*;
import javax.imageio.ImageIO;
import java.io.*;
public abstract class SpaceObj {
public int shipID;
// Structural integrity.
public int structInteg;
public int maxStructInteg;
// Current angle in radians.
// East is 0, west is -pi. Pi is outside the range of directions.
public double angle;
public double x;
public double y;
// This variable is protected because we need to check if the new assigned
// velocity is greater than maxVelocity.
protected double dx;
protected double dy;
// Absolute maximum velocity.
public double maxVelocity;
public double mass;
// Rate of acceleration or dv/dt.
public double baseAccelRate;
public double turnRate;
// Is accelerating.
public int isAccel;
public boolean isBoosting;
public boolean turningLeft;
public boolean turningRight;
public boolean firing;
public BufferedImage origObjImg;
public int diam;
protected SpaceObj() {}
public SpaceObj(double mv) {
maxVelocity = mv;
isBoosting = false;
}
public void accelerate() {
double accelRate = baseAccelRate;
double currentMagnitude = Math.sqrt(dx*dx + dy*dy);
if (isBoosting) {
accelRate *= 2;
} else if (this instanceof Ship && currentMagnitude < accelRate) {
// If currently travelling slowly, then accelerate slowly.
accelRate *= .2;
}
// Determining new velocity: Take the vector representing the current
// velocity and the vector representing the addition of this increment
// of acceleration, and add them together. If the magnitude of this
// new vector is less than or equal to maxVelocity, we're done. If it's
// greater, then we need to find the vector with length maxVelocity and
// with direction of the sum vector. (Another way to visualize this is
// where the sum vector intersects a circle with radius maxVelocity.)
// Take the vector representing the current velocity...
double startDX = dx,
startDY = dy;
// and the vector representing the addition of this increment of
// acceleration...
double accelDX = Math.cos(angle) * accelRate,
accelDY = Math.sin(angle) * accelRate;
// and add them together.
dx += accelDX;
dy += accelDY;
// If the magnitude of this new vector...
double newMagnitude = Math.sqrt(dx*dx + dy*dy);
// is less than or equal to maxVelocity, we're done. If it's greater...
if ((newMagnitude > maxVelocity && !isBoosting)
|| newMagnitude > maxVelocity * 2) {
// then we need to find the vector with length maxVelocity and with
// direction of the sum vector.
double theta = Math.atan(dy/dx);
if (dx < 0)
theta += Math.PI;
dx = Math.cos(theta) * maxVelocity;
dy = Math.sin(theta) * maxVelocity;
}
}
public void applyInertia(SpaceObj s) {
s.dx += dx * mass / s.mass;
s.dy += dy * mass / s.mass;
}
}