Advertisement
PifyZ

Jeu (Game) canvas HTML5

Mar 8th, 2012
381
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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'
  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.  
  115.             /* Dessiner le joueur */
  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.  
  138.                             /* Dessine le trait qui relie la porte et l'interrupteur */
  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.  
  150.         /* Fonctions de déplacement du joueur */
  151.             /* Appuie sur une touche déclenche le mouvement du joueur*/
  152.                 $(document).keydown(function(e) {
  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.  
  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.                         if (yAQuoiLa(nvJoueur.x, nvJoueur.y, 'porte') == true) {
  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);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement