-
Notifications
You must be signed in to change notification settings - Fork 7
/
Ball.pde
123 lines (116 loc) · 2.62 KB
/
Ball.pde
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import java.awt.geom.*;
public class Ball {
Rectangle rectangle;
// BALL PROPERTIES --
int width = 5;
int height = 5;
boolean hasStroke = false;
color strokeColor = #FFFFFF;
boolean hasFill = true;
color fillColor = #ffffff;
// velocity
int velX = 3;
int velY = 3;
int x;
int y;
int ox;
int oy;
int xcentre;
int ycentre;
Ball(int X, int Y) {
x = X;
y = Y;
rectangle = new Rectangle(width, height, hasStroke, strokeColor, hasFill, fillColor);
rectangle.setPosition(x, y);
}
void refresh() {
updatePosition();
rectangle.setPosition(x, y);
rectangle.drawYourself();
}
void updatePosition() {
// add velocity to position
x+=velX;
y+=velY;
// collision with limits
if (x<=0 || x>=gameFrameWidth-width) {
velX = -velX;
x = constrain(x, 0, gameFrameWidth-width);
}
if (y<=0 || y>=gameFrameHeight-height) {
velY = -velY;
y = constrain(y, 0, gameFrameHeight-height);
}
xcentre = x+width/2;
ycentre = y+height/2;
// collision with paddle
int result = checkCollisionWithRectangle(paddle.rectangle);
// if collides on top, control direction of ball
if (result == 1) {
if (xcentre < paddle.rectangle.x1+paddle.rectangle.width/2) {
if (velX>0) {
velX = -velX;
}
}
else {
if (velX<0) {
velX = -velX;
}
}
}
// collision with bricks
if (result == 0) {
for (int i=0; i<bricks.length; i++) {
if (bricks[i].imAlive) {
int res = checkCollisionWithRectangle(bricks[i].rectangle);
if (res != 0) {
bricks[i].die();
break;
}
}
}
}
ox = x;
oy = y;
}
// collision detection function
// result:
// 0: no collision
// 1: top
// 2: right
// 3: bottom
// 4: left
// 5: couldn't detect which side
int checkCollisionWithRectangle (Rectangle R) {
int result = 0;
if (R.doesPointTouchMe(xcentre, ycentre)) {
// which side did it collide
Line2D lineaBola = new Line2D.Float(xcentre, ycentre, ox+width/2, oy+height/2);
result = R.whatSideDoesLineTouch(lineaBola, velX, velY);
// top
if (result==1) {
velY = -velY;
y = R.y1-height;
// right
}
else if (result==2) {
velX = -velX;
x = R.x2;
// bottom
}
else if (result==3) {
velY = -velY;
y = R.y2;
// left
}
else if (result==4) {
velX = -velX;
x = R.x1-width;
}
else {
result = 5;
}
}
return result;
}
}