-
Notifications
You must be signed in to change notification settings - Fork 0
/
movment.js
125 lines (105 loc) · 2.6 KB
/
movment.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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import {
BOARD,
BOARD_LIMITS,
BALL_RADIUS,
PADDLE_SIZE,
BRICK_SIZE,
} from './constants';
import {
ballPosition,
paddlePosition,
bricks,
ballMovment,
paddleMovment,
turnBallMovment,
allowBrickCollision,
increaseScore,
score,
life,
decreaseLife,
} from './state';
import * as painter from './painter';
import * as events from './events';
const bricksCollision = (position) => {
if (!allowBrickCollision) {
return;
}
const collidingBrick = bricks
.filter((brick) => brick.hitpoints > 0)
.find((brick) => {
if (
position.x + BALL_RADIUS >= brick.x &&
position.x <= brick.x + BRICK_SIZE.width &&
position.y + BALL_RADIUS >= brick.y &&
position.y <= brick.y + BRICK_SIZE.height
) {
brick.hitpoints -= 1;
increaseScore();
return true;
}
});
return !!collidingBrick;
};
export const moveBall = () => {
// X Axis movment
let potentialXPosition = ballPosition.x + ballMovment.x;
if (
potentialXPosition <= BOARD_LIMITS.left ||
potentialXPosition >= BOARD_LIMITS.right
) {
turnBallMovment('x');
}
// Y Axis movment
let potentialYPosition = ballPosition.y + ballMovment.y;
let isAbovePaddle =
potentialXPosition > paddlePosition.x &&
potentialXPosition < paddlePosition.x + PADDLE_SIZE.width;
const bottomLimit =
BOARD_LIMITS.bottom + (isAbovePaddle ? -PADDLE_SIZE.height : 0);
if (
potentialYPosition <= BOARD_LIMITS.top ||
potentialYPosition >= bottomLimit
) {
turnBallMovment('y');
}
// Bricks collision
if (
bricksCollision({
x: potentialXPosition,
y: potentialYPosition,
})
) {
if (score === bricks.length) {
events.bus.trigger('win');
console.log('Game Won!');
return;
}
turnBallMovment('y');
}
painter.ball({
x: ballPosition.x + ballMovment.x,
y: ballPosition.y + ballMovment.y,
});
if (potentialYPosition >= bottomLimit) {
const bottomCollision =
ballPosition.x < paddlePosition.x ||
ballPosition.x + BALL_RADIUS / 2 > paddlePosition.x + PADDLE_SIZE.width;
if (bottomCollision && life <= 0) {
console.log('Game over');
events.bus.trigger('game-over');
return;
}
bottomCollision && decreaseLife();
allowBrickCollision = true;
}
};
export const movePaddle = () => {
paddlePosition.x = paddlePosition.x + paddleMovment;
if (paddlePosition.x < 0) {
paddlePosition.x = 0;
}
if (paddlePosition.x + PADDLE_SIZE.width > BOARD.width) {
paddlePosition.x = BOARD.width - PADDLE_SIZE.width;
}
painter.paddle(paddlePosition);
};