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); |