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