View difference between Paste ID: nAaHSYb2 and cghhay5B
SHOW: | | - or go back to the newest paste.
1
/* Initialisation des variables */
2
	/* Informations passés par les fichiers de niveaux */
3
		/* Carte du jeu -> 0 = sol ; 1 = mur ; 2 = sol traversé */
4
			/* A revoir -> Carte du jeu -> 0 = mur ; 1 = sol traversé ; 2 = sol */
5
		/* Informations sur le joueur */
6
7
	var
8
		canvas = document.getElementById('canvas'),
9
		context = canvas.getContext('2d'),
10
		niveauLargeur = 0,
11
		niveauHauteur = 0,
12
		nbCasesVide = 0,
13
		nbCaisses = caisses.length,
14
		nbDeplacementsTotalNecessaire = 0,
15
		nbDeplacementsJoueur = 0,
16
		nbDeplacementsCaisses = 0,
17
		image = {},
18
		images = {
19
			joueur: 'images/joueur.png',
20
			mur: 'images/mur.png',
21
			sol: 'images/sol.png',
22
			solTraverse: 'images/solTraverse.png',
23
			caisse: 'images/caisse.png',
24
			interrupteur: 'images/interrupteur.png',
25-
			porte: 'images/porte.png'
25+
			porte: 'images/porte.png',
26
			tir: 'images/tir.png'
27
		},
28
		cases = {
29
			sol: 0,
30
			mur: 1,
31
			solTraverse: 2
32
		},
33
		tir = {
34
			x: -1,
35
			y: -1,
36
			sens: 1
37
		};
38
39
/* Fonctions */
40
	/* Fonction de jeu */
41
		/* Fonction exécuté SEULEMENT à l'exécution du jeu */
42
			function Create() {
43
				niveauLargeur = niveau[0].length;
44
				niveauHauteur = niveau.length;
45
46
				canvas.width = niveauLargeur * niveauZoom;
47
				canvas.height = niveauHauteur * niveauZoom;
48
49
				$(canvas).css('width', (niveauLargeur * niveauZoom) + 'px');
50
				$(canvas).css('height', (niveauHauteur * niveauZoom) + 'px');
51
52
				for (var lien in images) {
53
					image[lien] = new Image();
54
					image[lien].src = images[lien];
55
				}
56
57
				Update();
58
59
				nbDeplacementsTotalNecessaire = nbCasesVide - nbCaisses;
60
			}
61
62
		/* Mise à jour du jeu */
63
			function Update() {
64
				dessineNiveau();
65
				dessineCaisses();
66
				dessineJoueur();
67
				dessineTir();
68
				dessineInterrupteurs();
69
				victoire();
70
			}
71
72
		/* Destruction du jeu */
73
			function Destroy() {
74
				/* Affiche un fond coloré */
75
					context.rect(0, 0, canvas.width, canvas.height);
76
					context.fillStyle = 'rgba(236, 236, 236, .5)';
77
					context.fill();
78
79
				/* Afficher le texte de la victoire */
80
					context.font = '24px Arial';
81
					context.fillStyle  = 'rgb(50, 120, 50)';
82
					context.textAlign = 'center';
83
					context.fillText('Victoire!', canvas.width / 2, canvas.height / 2 + 12);
84
			}
85
86
	/* Fonctions utilitaires */
87
		/* Annonce la fin du niveau */
88
			function victoire() {
89
				/* Si toutes les sols ont été recouvert, on lance la victoire */
90
					if (nbCasesVide == nbCaisses) {
91
						/* Stop la boucle de mise à jour du jeu */
92
							clearInterval(Update);
93
94
						/* Destruction du jeu après 0.5 secondes */
95
							setTimeout(Destroy, 500);
96
					}
97
			}
98
99
		/* Fonctions de dessins */
100
			/* Dessine le niveau */
101
				function dessineNiveau() {
102
					nbCasesVide = 0;
103
104
					for (var y = 0 ; y < niveauHauteur ; y++) {
105
						for (var x = 0 ; x < niveauLargeur ; x++) {
106
							var contenu = niveau[y][x];
107
108
							if (contenu >= 0) {
109
								if (contenu == cases.sol) {
110
									context.drawImage(image.sol, x * niveauZoom, y * niveauZoom, niveauZoom, niveauZoom);
111
									nbCasesVide += 1;
112
								} else if (contenu == cases.mur) {
113
									context.drawImage(image.mur, x * niveauZoom, y * niveauZoom, niveauZoom, niveauZoom);
114
								} else if (contenu == cases.solTraverse) {
115
									context.drawImage(image.solTraverse, x * niveauZoom, y * niveauZoom, niveauZoom, niveauZoom);
116
								}
117-
					context.fillStyle = 'rgb(255, 0, 0)';
117+
118-
					context.drawImage(image.joueur, joueur.x * niveauZoom, joueur.y * niveauZoom, niveauZoom, niveauZoom);
118+
119
					}
120
				}
121
122
			/* Dessiner le joueur */
123
				function dessineJoueur() {
124
					// context.drawImage(image.joueur, joueur.x * niveauZoom, joueur.y * niveauZoom, niveauZoom, niveauZoom);
125
					context.drawImage(image.joueur, joueur.sens * niveauZoom - niveauZoom, 0, niveauZoom, niveauZoom, joueur.x * niveauZoom, joueur.y * niveauZoom, niveauZoom, niveauZoom);
126
				}
127
128
			/* Dessiner le tir du joueur */
129
				function dessineTir() {
130
					context.drawImage(image.tir, tir.sens * niveauZoom - niveauZoom, 0, niveauZoom, niveauZoom, tir.x * niveauZoom, tir.y * niveauZoom, niveauZoom, niveauZoom);
131
				}
132
133
			/* Dessiner les caisses */
134
				function dessineCaisses() {
135
					for (var i in caisses) {
136
						context.drawImage(image.caisse, caisses[i].x * niveauZoom, caisses[i].y * niveauZoom, niveauZoom, niveauZoom);
137
					}
138
				}
139
140
			/* Dessiner les interrupteurs (+ les portes avec des traits) */
141
				function dessineInterrupteurs() {
142
					for (var i in interrupteurs) {
143
						if (interrupteurs[i].ouvert == false) {
144
							/* Dessine l'interrupteur */
145
								context.drawImage(image.interrupteur, interrupteurs[i].xInterrupteur * niveauZoom, interrupteurs[i].yInterrupteur * niveauZoom, niveauZoom, niveauZoom);
146
147
							/* Dessine la porte */
148
								context.drawImage(image.porte, interrupteurs[i].xPorte * niveauZoom, interrupteurs[i].yPorte * niveauZoom, niveauZoom, niveauZoom);
149
150
							/* Dessine le trait qui relie la porte et l'interrupteur */
151
								context.beginPath();
152
								context.strokeStyle = 'rgba(25, 25, 255, .2)';
153
								context.lineWidth = 2;
154
								context.lineCap = 'round';
155
								context.moveTo(interrupteurs[i].xInterrupteur * niveauZoom + (niveauZoom / 2), interrupteurs[i].yInterrupteur * niveauZoom + (niveauZoom / 2));
156
								context.lineTo(interrupteurs[i].xPorte * niveauZoom + (niveauZoom / 2), interrupteurs[i].yPorte * niveauZoom + (niveauZoom / 2));
157
								context.stroke();
158
						}
159
					}
160
				}
161
162
		/* Fonctions de déplacement du joueur */
163
			/* Appuie sur une touche déclenche le mouvement du joueur*/
164
				$(document).keydown(function(e) {
165
					if (e.keyCode == '38' || e.keyCode == '90') { deplacement('haut'); }
166
					if (e.keyCode == '40' || e.keyCode == '83') { deplacement('bas'); }
167
					if (e.keyCode == '37' || e.keyCode == '81') { deplacement('gauche'); }
168
					if (e.keyCode == '39' || e.keyCode == '68') { deplacement('droite'); }
169-
							y: joueur.y - 1
169+
					if (e.keyCode == '32') {
170
						if (joueur.sens == 1) {
171
							alert('haut');
172-
							y: joueur.y + 1
172+
						} else if (joueur.sens == 2) {
173
							alert('bas');
174
						} else if (joueur.sens == 3) {
175-
							y: joueur.y
175+
							alert('gauche');
176
						} else if (joueur.sens == 4) {
177
							alert('droite');
178-
							y: joueur.y
178+
179
					}
180
				});
181
182-
						if (yAQuoiLa(nvJoueur.x, nvJoueur.y, 'caisse') != false) {
182+
183-
							var i = ((yAQuoiLa(nvJoueur.x, nvJoueur.y, 'caisse') - 1) / 10);
183+
184
					var
185
						nvJoueur,
186
						nvCaisse,
187
						touche = false;
188
189
					/* Vers où se dirige le joueur */
190
						if (ou == 'haut') { nvJoueur = {
191
							x: joueur.x,
192
							y: joueur.y - 1,
193
							sens: 1
194
						} } else if (ou == 'bas') { nvJoueur = {
195
							x: joueur.x,
196
							y: joueur.y + 1,
197
							sens: 2
198
						} } else if (ou == 'gauche') { nvJoueur = {
199-
							if (yAQuoiLa(nvCaisse.x, nvCaisse.y, 'caisse-boolean') == true) {
199+
200
							y: joueur.y,
201
							sens: 3
202
						} } else if (ou == 'droite') { nvJoueur = {
203
							x: joueur.x + 1,
204-
							if (yAQuoiLa(nvCaisse.x, nvCaisse.y, 'porte') == true) {
204+
							y: joueur.y,
205
							sens: 4
206
						} }
207
208
						joueur.sens = nvJoueur.sens;
209-
							if (yAQuoiLa(nvCaisse.x, nvCaisse.y, 'interrupteur') == true) {
209+
210
					/* Si il y a une caisse, on la pousse si possible */
211
						if (yAQuoiLa(nvJoueur.x, nvJoueur.y, 'caisse-booleen') == true) {
212
							var i = yAQuoiLa(nvJoueur.x, nvJoueur.y, 'caisse-id') / 10;
213
214
							if (ou == 'haut') { nvCaisse = {
215
								x: caisses[i].x,
216
								y: caisses[i].y - 1
217
							} } else if (ou == 'bas') { nvCaisse = {
218
								x: caisses[i].x,
219
								y: caisses[i].y + 1
220
							} } else if (ou == 'gauche') { nvCaisse = {
221
								x: caisses[i].x - 1,
222
								y: caisses[i].y
223
							} } else if (ou == 'droite') { nvCaisse = {
224
								x: caisses[i].x + 1,
225
								y: caisses[i].y
226
							} }
227
228
							if (
229
								yAQuoiLa(nvCaisse.x, nvCaisse.y, 'caisse-booleen') == true
230
								|| yAQuoiLa(nvCaisse.x, nvCaisse.y, 'porte-booleen') == true
231-
						if (yAQuoiLa(nvJoueur.x, nvJoueur.y, 'interrupteur') != false) {
231+
							) {
232-
							var i = yAQuoiLa(nvJoueur.x, nvJoueur.y, 'interrupteur') - 1;
232+
233
								nvCaisse.y = caisses[i].y;
234
							}
235
236
							if (yAQuoiLa(nvCaisse.x, nvCaisse.y, 'interrupteur-booleen') == true) {
237-
						if (yAQuoiLa(nvJoueur.x, nvJoueur.y, 'porte') == true) {
237+
								var i = yAQuoiLa(nvCaisse.x, nvCaisse.y, 'interrupteur-id');
238
								interrupteurs[i].ouvert = true;
239
							}
240
241
							if (caisses[i].x == nvJoueur.x && caisses[i].y == nvJoueur.y) {
242
								if (niveau[nvCaisse.y][nvCaisse.x] == cases.mur || niveau[nvCaisse.y][nvCaisse.x] == cases.solTraverse) {
243
									nvJoueur.x = joueur.x;
244
									nvJoueur.y = joueur.y;
245
									nvCaisse.x = caisses[i].x;
246
									nvCaisse.y = caisses[i].y;
247
									nbDeplacementsCaisses--;
248
								}
249
250
								caisses[i].x = nvCaisse.x;
251
								caisses[i].y = nvCaisse.y;
252
								nbDeplacementsCaisses++;
253-
				if (quoi == 'niveau') {
253+
254
							}
255-
				} else if (/caisse/i.test(quoi)) {
255+
256-
					/^caisse-(.+)$/i.exec(quoi);
256+
257
					/* Si il y a un interrupteur, on l'active */
258
						if (yAQuoiLa(nvJoueur.x, nvJoueur.y, 'interrupteur-booleen') == true) {
259
							var i = yAQuoiLa(nvJoueur.x, nvJoueur.y, 'interrupteur-id');
260-
							if (RegExp.$1) {
260+
261
						}
262
263-
							return parseInt(i + 1);
263+
264
						if (yAQuoiLa(nvJoueur.x, nvJoueur.y, 'porte-boolean') == true) {
265
							nvJoueur.x = joueur.x;
266-
				} else if (quoi == 'interrupteur') {
266+
267
						}
268
269-
							return parseInt(i + 1);
269+
270
						if (niveau[nvJoueur.y][nvJoueur.x] == cases.sol && touche == false) {
271
							niveau[nvJoueur.y][nvJoueur.x] = cases.solTraverse;
272-
				} else if (quoi == 'porte') {
272+
273
							joueur.y = nvJoueur.y;
274
							nbDeplacementsJoueur++;
275
						}
276
				}
277
278
		/* Y a quoi là ? */
279
			function yAQuoiLa(x, y, quoi) {
280
				/^(.+)-(.+)$/i.exec(quoi);
281
282
				if (RegExp.$1 == 'niveau') {
283
					return niveau[y][x];
284
				} else if (RegExp.$1 == 'caisse') {
285
					for (var i in caisses) {
286
						if (x == caisses[i].x && y == caisses[i].y) {
287
							if (RegExp.$2 == 'booleen') {
288
								return true;
289
							} else {
290
								return parseInt(i);
291
							}
292
						}
293
					}
294
				} else if (RegExp.$1 == 'interrupteur') {
295
					for (var i in interrupteurs) {
296
						if (x == interrupteurs[i].xInterrupteur && y == interrupteurs[i].yInterrupteur && interrupteurs[i].ouvert == false) {
297
							if (RegExp.$2 == 'booleen') {
298
								return true;
299
							} else {
300
								return parseInt(i);
301
							}
302
						}
303
					}
304
				} else if (RegExp.$1 == 'porte') {
305
					for (var i in interrupteurs) {
306
						if (x == interrupteurs[i].xPorte && y == interrupteurs[i].yPorte && interrupteurs[i].ouvert == false) {
307
							return true;
308
						}
309
					}
310
				}
311
312
				return false;
313
			}
314
315
/* Fonctions à exécuter */
316
	Create();
317
	Update = setInterval(Update, 1000 / 60);