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