-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscript.js
More file actions
290 lines (265 loc) · 10.7 KB
/
Copy pathscript.js
File metadata and controls
290 lines (265 loc) · 10.7 KB
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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
/*
Author : Abderrahim Ammour
Date : 14 juin 2019
Object : Game Breakout 2D made by Mozzila developer Guide
I'm using pure JavaScript to get a solid knowledge of web
game development and JavaScript language.
Source : https://developer.mozilla.org
Steps TODO list :
1. Create the Canvas and draw on it
2. Move the ball
3. Bounce off the walls
4. Paddle and keyboard controls
5. Game over
6. Build the brick field
7. Collision detection
8. Track the score and win
9. Mouse controls
10. Finishing up
*/
/* Ici on donne la référence à Javascript de canvas*/
var canvas = document.getElementById('myCanvas');
/* la variable ctx est créer pour stocker le contexte de rendu 2D*/
var ctx = canvas.getContext('2d');
/*getContext Est un DOMString contenant l'identifcateur de contexte définissant le contexte de dessin associé au canevas.
Les valeurs possibles sont :
1. 2d", conduisant à la création d'un objet CanvasRenderingContext2D représentant
un contexte de représentation bi-dimensionnel.
2. "webgl" (ou "experimental-webgl") pour créer un objet WebGLRenderingContext représentant un contexte de représentation tri-dimensionnel. Ce contexte est seulement disponible sur les
navigateurs implémentant la version 1 de WebGL (OpenGL ES 2.0).
3. "webgl2" pour créer un objet WebGL2RenderingContext représentant un contexte
de représentation tri-dimensionnel. Ce contexte est seulement disponible sur les navigateurs implémentant la version 2 de WebGL (OpenGL ES 3.0). .
4. "bitmaprenderer" pour créer un ImageBitmapRenderingContext ne fournissant que la
fonctionnalité de remplacement du contenu du canevas par une ImageBitmap donnée. */
//L'algorithme utilisé pour déterminer si un point est
//à l'intérieur ou à l'extérieur du chemin.
var x = canvas.width/2;
var y = canvas.height-30;
var dx = 2;
var dy = -2;
var ballRadius = 10;
var paddleHeight = 10; //hauteur boite
var paddleWidth = 75; // largeur boite
var paddleX = (canvas.width-paddleWidth) / 2;//starting point
var brickRowCount = 3; //ligne
var brickColumnCount = 5; //colonne
var brickWidth = 75; // dimension
var brickHeight = 20;
var brickPadding = 10; // distance entre brique
var brickOffsetTop = 30;
var brickOffsetLeft = 30;
var gameOverNotify = document.querySelector('.game-over-notify');
var interval;
var score = 0;
var lives = 3;
var factor = 1.15;
/***************************************************************
* Creer les Briques
***************************************************************/
var bricks = []; // Nos brique sont des objets dans un tableau 2D
for(var colonne = 0; colonne<brickColumnCount; colonne++) {
bricks[colonne] = [];
for(var ligne = 0; ligne<brickRowCount; ligne++) {
bricks[colonne][ligne] = { x: 0, y: 0, status: 1 }; // propriete localisation
}
}
/***************************************************************
* une fonction drawScore() pour dessiner le score
***************************************************************/
function drawScore(){
ctx.font = "16px Arial"; //set the size and font type
ctx.fillStyle = "#0095DD"; // set the color of the font
ctx.fillText("Score: " + score ,8,20);//to set the actual text placed on the canvas
//last two parameters are the coordinates where the text will be placed on the canvas.
}
/***************************************************************
* une fonction drawLives() pour dessiner le nb de vie
***************************************************************/
function drawLives() {
ctx.font = "16px Arial";
ctx.fillStyle = "#0095DD";
ctx.fillText("Lives: "+lives, canvas.width-65, 20);
}
/***************************************************************
* une fonction drawBricks() pour dessiner les Briques
***************************************************************/
function drawBricks(){
for(var colonne = 0; colonne<brickColumnCount; colonne++) {
for(var ligne = 0; ligne<brickRowCount; ligne++) {
if(bricks[colonne][ligne].status == 1){
var brickX = (colonne*(brickWidth+brickPadding)+brickOffsetLeft);
var brickY = (ligne*(brickHeight+brickPadding)+brickOffsetTop);
bricks[colonne][ligne].x = brickX;
bricks[colonne][ligne].y = brickY;
ctx.beginPath();
ctx.rect(brickX,brickY,brickWidth,brickHeight);
ctx.fillStyle = "#0095DD";
ctx.fill();
ctx.closePath();
}
}
}
}
/***************************************************************
* une fonction drawPaddle() pour dessiner le Paddle
***************************************************************/
function drawPaddle() {
ctx.beginPath();
ctx.rect(paddleX, canvas.height-paddleHeight, paddleWidth, paddleHeight);
ctx.fillStyle = "#0095DD";
ctx.fill();
ctx.closePath();
}
/***************************************************************
* une fonction drawBall() pour dessiner la balle
***************************************************************/
function drawBall() {
ctx.beginPath();
ctx.arc(x, y, ballRadius, 0, Math.PI*2);
ctx.fillStyle = "red";
ctx.fill();
ctx.closePath();
}
/* **************************************************************
* une fonction draw() exécutée en continue, avec un ensemble different de
* valeurs variables à chaque fois pour changer les positions avec calcul
***************************************************************/
function draw() {
ctx.clearRect(0, 0, canvas.width, canvas.height); // pour enlever le dernier tracer
drawBricks(); //appelle la fonction pour dessiner les briques
drawBall(); // appelle la fonction pour dessiner la balle
drawPaddle(); //appelle la fonction pour dessiner le Paddle
collisionDetection(); // activer la collision
//Simple wall collision detection(minius ball radius)
drawScore();
drawLives();
if(x + dx > canvas.width-ballRadius || x + dx < ballRadius) { // rebondir pour les cotes
dx = -dx;
}
if(y + dy < ballRadius) { // Rebondir Pour le haut
dy = -dy;
} else if(y + dy > canvas.height-ballRadius) { // Rebondir Pour le bas
if(x > paddleX && x < paddleX + paddleWidth) {
if(x < paddleX + paddleWidth/3){
// changement de direction pour le paddle
dy = -dy;
if (dx > 0){
dx = -dx;
}
}
else if(x > paddleX + paddleWidth/3 && x < paddleX + 2*paddleWidth/3){
dy = -dy*factor;
}
else{
dy = -dy;
if (dx < 0){
dx = -dx;
}
}
}
else {
if(lives != 0){
lives--;
if(!lives){
gameOverNotify.style.display = 'flex';
clearInterval(interval);
}
else {
x = canvas.width/2; // initial place
y = canvas.height-30;
dx = 2; //revenir au vitesse de debut
dy = -2;
ballRadius = 10;
paddleX = (canvas.width-paddleWidth)/2;
}
}
}
}
if(rightPressed && paddleX < canvas.width-paddleWidth) {
paddleX += 7;
}
else if(leftPressed && paddleX > 0) {
paddleX -= 7;
}
x += dx;
y += dy;
requestAnimationFrame(draw); // ce qui fait la boucle
console.log("dx = "+dx);
console.log("dy = "+dy);
}
draw();
//SetInterval :Appelle une fonction de manière répétée et ainsi
//fonction draw() sera exécutée dans setInterval toutes les 10 millisecondes
// requestAnimationFrame(draw) est une alternative pour donner au browser d'ajuster le frame
/* **************************************************************
* une fonction keyHandler() pour gerer les touche au clavier et controle du Paddle
***************************************************************/
// Controle du Paddle
// 1. Deux variables pour stocker l'information(gauche/droite)
// 2. Deux "event listeners" pour ecouter les commandes clavier(keydown et keyup)
// 3. Deux fonctions qui s'occuperont de keydown et keyup
// 4. La possibilité de bouger le paddle à gauche et à droite.
var rightPressed = false;
var leftPressed = false;
var spacePressed = false;
document.addEventListener("keydown", keyDownHandler, false);
document.addEventListener("keyup", keyUpHandler, false);
document.addEventListener("mousemove",mouseMoveHandler,false);
function keyDownHandler(e){
if(e.keyCode == 39 || e.keyCode == 68){ //keyCode pour le clavier touche droite
rightPressed = true;
console.log("droite");
}
else if(e.keyCode == 37 || e.keyCode == 65){ //keyCode pour le clavier touche gauche
leftPressed = true;
console.log("gauche");
}
if(e.keyCode == 32 && score > 10){ //keyCode for space
spacePressed = true;
ballRadius = 20;
console.log("COMBO!");
}
}
function keyUpHandler(e){
if(e.keyCode == 39 || e.keyCode == 68){ //keyCode pour le clavier touche droite
rightPressed = false;
}
else if(e.keyCode == 37 || e.keyCode == 65){ //keyCode pour le clavier touche gauche
leftPressed = false;
}
if(e.keyCode == 32 && score > 10){
spacePressed = false;
ballRadius = 10;
console.log("COMBO!");
}
}
// fonction pour ajouter le mouvement de la sourie pour deplacer la paddle
function mouseMoveHandler(e) {
var relativeX = e.clientX - canvas.offsetLeft;
if(relativeX > 0 && relativeX < canvas.width) {
paddleX = relativeX - paddleWidth/2;
}
}
/***************************************************************
* une fonction collisionDetection() de détection de collision
***************************************************************/
function collisionDetection(){
for(var colonne=0; colonne<brickColumnCount ; colonne++){
for(var ligne=0; ligne < brickRowCount; ligne++){
var b = bricks[colonne][ligne]; //on catch le table
// Calcul to see if the ball is inside the rectangle
if(b.status == 1){
if(x > b.x && x < b.x+brickWidth && y > b.y && y < b.y+brickHeight){
dy = -dy; //changement de direction en y
b.status = 0;
score++; // si le score est égal au nb de bloc de départ, You Win!
if(score == brickRowCount*brickColumnCount) {
alert("YOU WIN, CONGRATULATIONS!");
document.location.reload();
clearInterval(interval); // Needed for Chrome to end game
}
}
}
}
}
}