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