IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Jeu de balles


Sujet :

JavaScript

  1. #1
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2014
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Jeu de balles
    Bonsoir,

    Je participe à un MOOC sur HTML5 et les nouvelles balises (canvas...).
    Je dois développer un jeu : une consigne s'affiche, des balles tombent et on doit cliquer sur les balles correspondantes à la consigne. Le niveau change, la consigne aussi... et tout ça dans un temps limité.

    J'ai commencé à écrire le code avec 4 balles au niveau 1, 4 balles au niveau 2.
    Au niveau 1 tout se passe bien. On passe au niveau 2, la consigne change mais les balles apparaissent en bas du canvas !!

    Je ne trouve pas d'où vient le problème.
    Auriez-vous des idées ?

    D'avance merci.

    Voilà mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    $(function(){
    	init();
    });
     
     
    function init(){
     
    	//STRUCTURE
    		//Titre
    		$("#titre").html("<h1>Clic'Balles</h1>");
    		//Texte d'explication du jeu
    		$("#texte").html("Dans chacun des niveaux de jeu, cliquez sur les balles correspondant à la consigne affichée avant qu'elles ne touchent le bas du cadre !");
    		//Image du jeu
    		$("#image").html("<img src=\"\./images/jeu.jpg\" alt=\"image du jeu\">");		
    		//Boutons
    		$("#boutonJeu").html("<input type=\"submit\" name=\"boutonJeu\" id=\"boutonJeu\" VALUE=\"Jouez !\" onclick=\"afficheJeu()\"/>");
    		$("#boutonQuitter").html("<input type=\"submit\" name=\"boutonQuitter\" id=\"boutonQuitter\" VALUE=\"Quittez !\" onclick=\"afficheAccueil()\"/>");
    		$("#boutonAccueil").html("<input type=\"submit\" name=\"boutonAccueil\" id=\"boutonAccueil\" VALUE=\"Accueil\" onclick=\"afficheAccueil()\"/>");
    		$("#boutonRejouer").html("<input type=\"submit\" name=\"boutonRejouer\" id=\"boutonRejouer\" VALUE=\"Rejouez !\" onclick=\"afficheJeu()\"/>");
    		//Déclaration du canvas
    		$("#animation").html("<canvas id=\"canvasJeu\">Texte pour les navigateurs qui ne supportent pas canvas</canvas>");
    		//Pied de page
    		$("footer").html("MOOC HTML5 - R. ALBA - Mai 2014");
    	//DONNEES
    		creeDonnees();
     
    	//VARIABLES
    		tempsJeu = 0;
    		niveauCourant = 1;
    		ecranCourant = "accueil";
    		//déclaration d'une variable pour la vitesse
    		vitesse = 0;
    		//déclaration d'une variable de position/y
    		py = 0;
     
    		//Nombre de balles par niveau (4)
    		nbBallesNiveau = 0;
     
    	//GESTIONNAIRES
     
    	//REGLES			
    		setInterval(regles, 100);
     
    	//LANCEMENT	
    		afficheAccueil();
    }
     
     
     
    //FONCTIONS
    	//Fonction qui crée les tableaux de données
    	function creeDonnees(){		
    		// On définit la consigne par niveau (couleur et taille des balles à cliquer)
    			listeNiveaux = new Array();
    			listeNiveaux[0]=["rouges","petite"];
    			listeNiveaux[1]=["vertes","grande"];
     
    		// On définit les couleurs avec le code hexadécimal
    			listeCouleurs = new Array();
    			listeCouleurs[0]=["rouge","#FF0000"];
    			listeCouleurs[1]=["vert","#00FF00"];
     
    		// On définit le rayon des balles
    			listeTailles = new Array();
    			listeTailles[0]=[5,"petite"];
    			listeTailles[1]=[25,"grande"];
     
    		// On définit les balles (idniveau, couleur, taille, position/x, vitesse, position/y, visible(1))
    			listeBalles = new Array();
    			listeBalles[0]=[1,"red",5,5,3,0,1];
    			listeBalles[1]=[1,"green",25,40,2,0,1];
    			listeBalles[2]=[1,"blue",15,60,1,0,1];
    			listeBalles[3]=[1,"yellow",5,100,2,0,1];
    			listeBalles[4]=[2,"blue",5,5,1,0,1];
    			listeBalles[5]=[2,"green",25,40,1,0,1];
    			listeBalles[6]=[2,"red",15,60,1,0,1];
    			listeBalles[7]=[2,"yellow",5,100,1,0,1];
    		}
     
    	//Fonction qui affiche l'écran d'accueil
    	function afficheAccueil(){
    			ecranCourant = "accueil";
    			$('#accueil').show();
    			$('#jeu').hide();
    			$('#bilan').hide();	
    			reinitialisation();		
    		}
     
    	//Fonction qui affiche l'écran de jeu
    	function afficheJeu(){
    			ecranCourant = "jeu";
    			tempsJeu = 0;
    			$('#accueil').hide();
    			$('#jeu').show();
    			$('#bilan').hide();	
    			afficheConsigne();
    			reinitialisation();	
    		}
     
    	//Fonction qui affiche l'écran de bilan
    	function afficheBilan(){
    			ecranCourant = "bilan";
    			$('#accueil').hide();
    			$('#jeu').hide();
    			$('#bilan').show();			
    		}
     
    	//Fonction qui affiche la consigne
    	function afficheConsigne(){
    			if (niveauCourant == 1){
    			$("#consigne").html("Cliquez sur les balles "+listeNiveaux[0][0]+" de "+listeNiveaux[0][1]+" taille !");
    			}
    			if (niveauCourant == 2){
    			$("#consigne").html("Cliquez sur les balles "+listeNiveaux[1][0]+" de "+listeNiveaux[1][1]+" taille !");
    			}
    		}
     
    	//Fonction qui réinitialise le jeu
    	function reinitialisation(){
    		niveauCourant = 1;
    		tempsJeu = 0;
    		for (var j=0; j<listeBalles.length; j++){
    				listeBalles[j][5] = 0;
    				listeBalles[j][6] = 0;
    			}
     
    	}
     
     
    	// Fonction regles	
    	function regles(){
    		if (ecranCourant == "jeu"){
    			animer();
    			}
    		}	
     
    	// Fonction animer (le canvas)
    	function animer(){
    		if (tempsJeu > 600){
    			afficheBilan();
    			}
    		else{
    			//Définition du canvas
    			monCanvas = document.getElementById('canvasJeu');
    			if (monCanvas.getContext){
    			ctx = monCanvas.getContext('2d');					
    			} else {
    			alert('canvas non supporté par ce navigateur');
    			}
    			vitesse++;
    			//On incrémente le temps de jeu
    			tempsJeu++;			
    			//On efface le canvas
    			ctx.clearRect(0,0, monCanvas.width,monCanvas.height);	
    			// On définit une variable pour vérifier que les balles sont passées
    			nbBallesDessinees = 0;	
    				if (niveauCourant == 3){
    				afficheBilan();
    				}
    				else{
    					// On boucle sur les balles du niveau courant
    					for (i=0; i<listeBalles.length; i++){					
    						if (listeBalles[i][0]<= niveauCourant){
    							if (listeBalles[i][5] < monCanvas.height-listeBalles[i][2]){
    								dessineBalle(listeBalles[i][3],listeBalles[i][4],listeBalles[i][2],listeBalles[i][1]);						
    								nbBallesDessinees++;
    							}
    						}
    					}
    				if (nbBallesDessinees == 0){
    					niveauCourant++;
    					afficheConsigne();
    					py = 0;
    				}
    		}}}
     
     
     
     
    	//Fonction de dessin d'une balle : x départ, vitesse, rayon, couleur
    	function dessineBalle(x,v,R,c){
    		//sauvegarde du contexte
    		ctx.save();
    		//dessin
    		ctx.translate(0,v*vitesse);
          	ctx.beginPath();
          	ctx.arc(x, 0, R, 0, 2 * Math.PI, false);
          	ctx.fillStyle = c;
          	ctx.fill();	
          	//On crée et modifie une variable position/y
          	py = v*vitesse;
          	listeBalles[i][5] = py;
    	  	//retour à l'état précédent du contexte
    		ctx.restore()
    	}

  2. #2
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 957
    Points : 44 121
    Points
    44 121
    Par défaut
    Bonjour,
    la partie HTML/CSS serait un plus pour pouvoir tester et ce rendre compte du soucis que je dois admettre ne pas avoir compris

  3. #3
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2014
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Suite du code
    Citation Envoyé par NoSmoking Voir le message
    Bonjour,
    la partie HTML/CSS serait un plus pour pouvoir tester et ce rendre compte du soucis que je dois admettre ne pas avoir compris
    Bonjour,

    Voilà la partie html :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Clic'Balles</title>
    <link rel="stylesheet" media="screen" href="./css/styles.css" type="text/css"/>
    <script src="./js/jquery.js"></script>
    <script src="./js/code.js"></script>
    </head>
    <body>
     
    <div id="accueil">
    	<div id="titre"></div>
    	<div id="image"></div>
    	<div id="texte"></div>
    	<div id="boutonJeu"></div>	
    </div>
     
    <div id="jeu">
    	<div id="consigne"></div>
    	<div id="animation"></div>
    	<div id="boutonQuitter"></div>
    </div>
     
    <div id="bilan">
    	<div id="recap"></div>
    	<div id="boutonAccueil"></div>
    	<div id="boutonRejouer"></div>
    </div>
     
    <footer></footer>
     
    </body>
    </html>

    et la partie css :

    Code css : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    /* Definition du corps de la page */
    body {
    	width : 500px;
    	margin-left: auto;
        margin-right: auto;
    	background:#CCCCCC;
    	font-family:Arial,Sans;
    	text-align : justify;
    	color : Black;
    	font-size:12px;
    }
     
    /* Définition de l'écran d'accueil */
    #titre h1{
    	font-family:Arial,Sans;
    	text-align : center;
    	color : red;
    	font-size:22px;
    }
     
    #texte {
    	font-family:Arial,Sans;
    	color : Black;
    	font-size:14px;
    	margin-top : 10px;
    }
     
    #image img{
    	display : block;
    	width : 250px;
    	height : 200px;
    	margin-left: auto;
        margin-right: auto;
    }
     
    #boutonJeu{
    	text-align : center;
    	margin-top : 10px;
    	margin-bottom : 10px;
    }
     
    /* Définition de l'écran de jeu */
    #consigne {
    	font-family:Arial,Sans;
    	text-align : center;
    	text-transform : uppercase;
    	color : red;
    	font-size:14px;
    	margin-bottom : 10px;
    }
     
    #canvasJeu{
    	width : 500px;
    	height : 400px;
    	margin-left: auto;
        margin-right: auto;
        background:#FFFFFF;
    	border : 1px solid black;	
    }
     
    #boutonQuitter{
    	text-align : right;
    }
     
     
    /* Définition de l'écran de bilan */
    #recap{
    	font-family:Arial,Sans;
    	text-align : justify;
    	color : black;
    	font-size:14px;
    }
     
    #boutonAccueil{
    	margin-top : 5px;	
    }
     
    #boutonRejouer{
    	margin-top : 5px;	
    }
     
     
    /* Définition du pied de page */
    footer {
    	font-family:Arial,Sans;
    	font-style : italic;
    	text-align : center;
    	color : Black;
    	font-size:10px;
    }

    Merci beaucoup.

  4. #4
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Tu as beaucoup de variables globales et je pense que leur contrôle t'échappe à plusieurs endroits. J'étudie ton code et je n'ai pas encore trouvé d'où venait le problème, mais je vais te donner deux-trois conseils pour améliorer ton développement.

    D'abord, regardons la fonction dessineBalle. Tu lui passes 4 paramètres, mais en réalité elle a un 5e paramètre caché : listeBalles[i][5], qui d'ailleurs repose sur le fait que la variable i a été implicitement déclarée globale. Je ne sais pas si tu en étais conscient.

    En y refléchissant, ta fonction dessineBalle n'a pas besoin qui tu lui passes une par une les données d'une balle. C'est bien plus pratique si tu lui passes la balle toute entière directement, ça ne fait qu'un seul paramètre et elle a accès à toutes les données de la balle. Modifions donc la déclaration de la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function dessineBalle( balle ){
       var x = balle[3];
       var v = balle[4];
       var R = balle[2];
       var c = balle[1];
     
       // ...
     
       balle[5] = py;
     
       // ...
    }
    Et l'endroit où tu l'appelles et où tu lui passes ses paramètres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
          // boucle sur les balles du niveau courant
          for (var i = 0; i < listeBalles.length; i++) {
             var balle = listeBalles[i];
             if (balle[0] <= niveauCourant) {
                if (balle[5] < monCanvas.height - balle[2]) {
                   dessineBalle(balle);
                   nbBallesDessinees++;
                }
             }
          }
    D'ailleurs, intéressons-nous à la structure de ces balles. Actuellement, ce sont des tableaux. Il faut que tu te souviennes que le niveau est en 0, la couleur en 1, etc. C'est fastidieux et potentiellement source d'erreurs. Surtout pour moi qui ne suis pas habitué à ton code, ou toi quand tu te replongeras dedans après 15 jours sans y toucher. Pourquoi ne pas utiliser la légèreté des objets JavaScript pour nommer les propriétés ? Allons-y :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
       listeBalles = [];
       listeBalles[0] = {
          idniveau: 1,
          couleur: "red",
          taille: 5,
          positionX: 5,
          vitesse: 3,
          positionY: 0,
          visible: 1
       };
       // etc.
    Oui, la déclaration prend plus de place, mais tu vas voir, les avantages sont indéniables.

    Maintenant, au lieu d'écrire listeBalles[i][5] tu écris listeBalles[i].positionY. C'est plus lisible non ? Et si on réécrit les endroits où le code utilise les balles, voilà ce que ça donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
          // boucle sur les balles du niveau courant
          for (var i = 0; i < listeBalles.length; i++) {
             var balle = listeBalles[i];
             if (balle.idniveau <= niveauCourant) {
                if (balle.positionY < monCanvas.height - balle.taille) {
                   dessineBalle(balle);
                   nbBallesDessinees++;
                }
             }
          }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function dessineBalle( balle ){
       var x = balle.positionX;
       var v = balle.vitesse;
       var R = balle.taille;
       var c = balle.couleur;
     
       // ...
     
       balle.positionY = py;
     
       // ...
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function reinitialisation( ){
       niveauCourant = 1;
       tempsJeu = 0;
       for (var j = 0; j < listeBalles.length; j++) {
          listeBalles[j].positionY = 0;
          listeBalles[j].visible = 0;
       }
    }
    Carrément plus lisible, pas vrai ?

    À propos, ta fonction reinitialisation n'est jamais utilisée. Je parie que ton problème vient de là
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  5. #5
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 957
    Points : 44 121
    Points
    44 121
    Par défaut
    Difficile de ne pas plussoyer Watilin pour ses remarques, il est vrai que ta source n'est pas aisée à comprendre et à suivre.

    A la rigueur tu pourrais utiliser des const, const VIT = 4;, pour te faciliter la lecture des index mais la solution objet key/value reste la plus lisible et propre.

    Concernant ton problème, tu en auras d'autres, tu incrémentes une variable vitesse, qui n'est pas une vitesse mais plutôt un incrément en Y, mais tu ne la remets pas à 0 au changement de niveau ce qui fait que les balles repartent du bas de ta zone.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (nbBallesDessinees == 0) {
      niveauCourant++;
      afficheConsigne();
      vitesse = 0;   // IMPERATIF
      py = 0;        // pas utile car initialisé à chaque utilisation
    }

  6. #6
    Membre à l'essai
    Femme Profil pro
    Enseignant
    Inscrit en
    Mai 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2014
    Messages : 14
    Points : 12
    Points
    12
    Par défaut J'ai moi aussi de sacrés soucis pour faire ce jeu !
    Bonjour,
    Je me permets de répondre ici par mes questions car je développe le même jeu et je suis tout autant en galère étant débutante en programmation !
    J'arrive (je crois !) à lancer mes pages mais rien ne s'affiche dans le jeu et le débugueur de Mozilla me dit "TypeError: e is undefined code.js:155" pourquoi ? Je pense qu'il y a plein de pb dans mes fontions dessine balle et canvas même car je n'ai pas compris ce à quoi correspondent toutes les valeurs dans ces fonctions.
    Bref, je veux bien des explications, ce serait super car j'ai envie de le finaliser mais je suis bloquée faute de savoir !
    Merci à vous !
    Voici mon code html :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Le jeu qui te rendra fou</title>
    <link rel="stylesheet" media="screen" href="styles.css" type="text/css"/>
    <script src="jquery.js"></script>
    <script src="code.js"></script>
     
    </head>
     
    <body>
     
    <!-- afficher les éléments des  pages  -->
     
    <div id= "accueil">
    <div id= "titre"></div>
    <div id= "image"></div>
    <div id= "texte"></div>
    <div id= "boutonJeu"></div>
    </div>
     
    <div id= "jeu">
    <div id= "consigne"></div>
    <div id= "animation"></div>
    <div id= "heure"></div>
    <div id= "boutonQuitter"></div>
    </div>
     
     
    <div id= "bilan">
    <div id= "recap"></div>
    <div id= "boutonAccueil"></div>
    <div id= "boutonRejouer"></div>
    </div>
     
    <footer><p>Avertissement : ce jeu vous rendra idiot, c'est certain.</p></footer>
     
    </body>
    </html>

    Et voici mon code css :
    Code css : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     body {
     background:#ccc;
     }
     
    #titre {
    	font-family:Arial;
    	color:Red;
    	font-size:16px;
    }
     
    #consigne {
    	font-family:Arial Black;
    	font-size:12px;
    }
     
    #image{
    	display:inline-block;
    	height: 450px;
    	width: 300px;
    }
     
    #animation {
    	height: 400px;
    	width: 500px;
    	background: #FFF;
    	}
     
    #boutonJeu {
    	margin-top:30px;
    	text-align: right;
    	float: right;
    }
     
    #boutonQuitter {
    	margin-top:30px;
    	text-align: right;
    	float: right;
    }
    #boutonRejouer {
    	margin-top:30px;
    	text-align: right;
    	float: right;
    }
     
    #boutonAccueil {
    	margin-top:30px;
    	text-align: right;
    	float: right;
    }
    .OK {
    	background: #0066CC;
    }
     
    .NOK {
    	background: #FF0000;
    }

    Et mon js !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    //Jeu des balles, testé sur Firefox 29.0.1
    $(function() {
    init();{
    fonctionLancement();
     
      // canvas
     monCanvas = document.getElementById("dessin");
    if (monCanvas.getContext){
         ctx = monCanvas.getContext('2d');
        // incrément
         i=0;
    } else {
        alert('canvas non supporté par ce navigateur');
    }
     
     
    	tempsJeu=0;
    	 niveauCourant=1;
    	 ecranCourant="#accueil";
     
    // timer mettre toutes les balles passées plutôt que 100 ?
     inter = setInterval(animer, 100);
    setTimeout(Stopper, 60000);
     
    //fonction règles
    function fonctionRegles() {
    // timer mettre toutes les balles passées plutôt que 100 ?
     inter = setInterval(animer, 100);
    setTimeout(Stopper, 60000);
     
    	if (ecranCourant == "jeu"){
    	animer();
    	}}
     
    	// interactivité sur le canvas
    	monCanvas.addEventListener("click", clicCanvas, false);	
     
    	 dessineBalle();
    	 clicCanvas();
    		 Stopper();
     
    }});
     
     
    function fonctionCreerAccueil() {
    	$("#titre").html('Le jeu qui te rendra fou !');
    	$("#image").html('<img src="image_Jeu.png" height="450" width="300" alt="imagedujeu"/>');
    	$("#texte").html('<p>Pour réussir ce jeu, mieux vaut ne pas être daltonien... Avec un bras ou une main cassés, tu es téméraire !</p>');
    	$("#boutonJeu").html('<input type="submit" name="boutonJeu" id="boutonJeu" VALUE="Jouer" onclick="fonctionJeu()"/>');
    	}
     
    	function fonctionCreerJeu() {
    	$("#consigne").html('Clique sur les plus petites balles rouges ! Avertissement : ce jeu risque de provoquer un fort sentiment d ennui assez rapidement');
    	$("#animation").html('<canvas id="dessin" width="500" height="400">Texte pour les navigateurs qui ne supportent pas canvas</canvas>');
    	$("#heure").html;
    	$("#boutonQuitter").html('<input type="submit" name="boutonQuitter" id="boutonQuitter" VALUE="Quitter" onclick="fonctionQuitter()"/>');
    	}
     
    	function fonctionBilan() {
    	$("#recap").html;
    	$("#boutonAccueil").html('<input type="submit" name="boutonAccueil" id="boutonAccueil" VALUE="Accueil" onclick="fonctionCreerAccueil()"/>');
    	$("#boutonRejouer").html('<input type="submit" name="boutonRejouer" id="boutonRejouer" VALUE="Rejouer" onclick="fonctionRejouer()"/>');
    	}
     
     
    	function fonctionLancement() {
     
    	$("#accueil").show();
    	$("#jeu").hide();
    	$("#bilan").hide();
     
    	}
     
    	function init() {
    	// structure
     fonctionCreerAccueil(); 
     fonctionCreerJeu();
     fonctionBilan();
     
    	}
     
     
    	function fonctionJeu() {
    	$("#accueil").hide();
    	$("#jeu").show();
    	$("#bilan").hide();
    	}
     
    	// tableau de niveaux
    	listeNiveau= new Array();
    	listeNiveau[0]= [0, 0];
    	listeNiveau[1]= [1, 0];
    	listeNiveau[2]= [1, 2];
     
    	// Liste des couleurs
    	listeCouleurs= new Array();
    	listeCouleurs[0]= ["rouge","#FF0000"];
    	listeCouleurs[1]= ["vert","#00FF00"];
    	listeCouleurs[2]= ["bleu","#0000FF"];
     
    	//Liste des tailles
    	listeTailles= new Array();
    	listeTailles[0]= [0, 0];
    	listeTailles[0]= [0, 1];
    	listeTailles[0]= [0, 2];
     
    	//Liste des positions en X
    	listePositionX= new Array();
    	listePositionX[0]= [5];
    	listePositionX[1]= [20];
    	listePositionX[2]= [40];
    	listePositionX[3]= [50];
    	listePositionX[4]= [100];
     
    	//Liste de la vitesse des balles
    	listeVitesse= new Array();
    	listeVitesse[0]= [1];
    	listeVitesse[1]= [2];
    	listeVitesse[2]= [1];
    	listeVitesse[3]= [3];
    	listeVitesse[4]= [1];
     
    	//Liste des positions en Y
    	listePositionY= new Array();
    	listePositionY[0]= [0];
    	listePositionY[1]= [0];
    	listePositionY[2]= [0];
    	listePositionY[3]= [0];
    	listePositionY[4]= [0];
     
    	//Liste de visibilité
    	listeVisibilite= new Array();
    	listeVisibilite[0]= [1];
    	listeVisibilite[1]= [1];
    	listeVisibilite[2]= [1];
    	listeVisibilite[3]= [1];
    	listeVisibilite[4]= [1];
     
    	// liste des balles
    	listeBalles= new Array();
    	listeBalles[0]= [0, 0, 0, 5, 1, 0, 1];
    	listeBalles[1]= [0, 1, 1, 20, 2, 0, 1];
    	listeBalles[2]= [0, 2, 2, 40, 1, 0, 1];
    	listeBalles[3]= [1, 2, 2, 50, 3, 0, 1];
    	listeBalles[4]= [1, 1, 0, 100, 1, 0, 1];
     
    	// timer mettre toutes les balles passées plutôt que 100 ?
     inter = setInterval(animer, 100);
    setTimeout(Stopper, 60000);
     
    // cercles x, y, rayon et?
     
    	balles = [[5,0,0,1],[20,0,1,1],[40,0,2,1]];
    	// clic sur le canvas
    	function clicCanvas(e){
    		// position de la souris / document
    		 var xSourisDocument = e.pageX; 
    	     var ySourisDocument = e.pageY;
    		// position du canvas / document
    		var xCanvas = monCanvas.offsetLeft;
    		var yCanvas = monCanvas.offsetTop;
    		// position du clic / canvas
    		xSourisCanvas = xSourisDocument - xCanvas;
    		ySourisCanvas = ySourisDocument - yCanvas;
    		// test si un cercle est cliqué
    		for (var c=0; c<balles.length; c++){
    			var R = cercles[c][2];
    			if(Math.abs(cercles[c][0]-xSourisCanvas) < R
    				&& Math.abs(cercles[c][1]-ySourisCanvas) < R){
    				cercles[c][3]=0;
     
    				break;
    			}
    		}
    	}
    	function animer() {
    		/* incrémentation */
    		i++;		
    		/* composition */
    		ctx.globalCompositeOperation = 'lighter';	
    		/* effaçage */
    		ctx.clearRect(0,0, monCanvas.width,monCanvas.height);
    		/* translation du contexte et dessin d'une balle */
    		dessineBalle(5,0,0);
    		/* translation du contexte et dessin d'une balle */
    		dessineBalle(20,0,1);
    		/* translation du contexte et dessin d'une balle */
    		dessineBalle(40,0,2);				
    	}
    		// fonction d'arrêt
    	function Stopper() {
    		clearInterval(inter);
    		}
     
    function dessineBalle(x,v,R){
    		/* sauvegarde du contexte */
    		ctx.save();
    		/* dessin */
    		ctx.translate(x,v*i);
          	ctx.beginPath();
          	ctx.arc(0, 0, R, 0, 2 * Math.PI, false);
          	ctx.fillStyle = 'red';
          	ctx.fill();
          	ctx.lineWidth = 1;
          	ctx.strokeStyle = '#003300';
          	ctx.stroke();		
    	  	/* retour à l'état précédent du contexte */
    		ctx.restore()
    	}
    	//données
     
     
     
     
    	//lancemnet
     
    	//getionnaires
    	//règles
    	//lancement

  7. #7
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 957
    Points : 44 121
    Points
    44 121
    Par défaut
    je suis tout autant en galère étant débutante en programmation !
    dans ce cas pourquoi ne pas tenir compte des remarques faites par Watilin ?

    Dans ton code pourquoi faire appel à clicCanvas(); directement ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dessineBalle();
    clicCanvas();  // Sert à quoi?
    Stopper();

  8. #8
    Membre à l'essai
    Femme Profil pro
    Enseignant
    Inscrit en
    Mai 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2014
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    Re bonjour,
    C'est les autres participants du mooc qui m'ont déconseillé la variable locale car avec elle j'avais "monCanvas = null par le débugueur par exemple.

    J'appelle directement cliccanvas parce qu'elle doit agir, non ?

  9. #9
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 957
    Points : 44 121
    Points
    44 121
    Par défaut
    C'est les autres participants du mooc qui m'ont déconseillé la variable locale car avec elle j'avais "monCanvas = null par le débugueur par exemple.
    pas tout compris, mais je parlais surtout des multiples tableaux gérés mais bon...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //Liste des positions en X
    listePositionX= new Array();
    //Liste de la vitesse des balles
    listeVitesse= new Array();
    //Liste des positions en Y
    listePositionY= new Array();
    //Liste de visibilité
    listeVisibilite= new Array();
    // liste des balles
    listeBalles= new Array();

    J'appelle directement cliccanvas parce qu'elle doit agir, non ?
    Dés que tu écris monCanvas.addEventListener("click", clicCanvas, false); cela signifie que tu affectes à l'événement click de l'élément monCanvas la function clickCanvas.

    Dans la fonction clickCanvas tu va gérer l'événement click et notamment ce que tu dois faire fonction de la position du clic.

  10. #10
    Membre à l'essai
    Femme Profil pro
    Enseignant
    Inscrit en
    Mai 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2014
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    Ah, désolée, je suis assez perdue, comme je l'ai dit ! En fait c'est le prof du mooc qui nous a donné les tableaux comme ça, je les comprends bien mais j'ai du mal avec la fonction animer et dessineballe dans lesquelles je ne comprends pas à quoi correspondent tous les éléments chiffrés.
    Merci pour l'explication de clickcanvas, je n'avais pas saisi que monCanvas addEventListener équivalait à appeler la fonction !
    Voilà une erreur de moins !
    Si vous pouviez m'expliquer les valeurs chiffrées de animer et de dessineballe et me dire si j'ai bien défini mes balles avant de les dessiner avant la fonction clicanvas, j'arriverai peut-être (mais ce n'est pas du tout certain !) à avancer dans la conception de ce jeu !
    Merci à vous !

  11. #11
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Il y a un truc qui commence à m'énerver prodigieusement : le fait que des gens prétendent enseigner le JavaScript, et commencent par dire à leurs élèves d'inclure jQuery.

    Surtout quand on voit l'utilisation qui en est faite ici :
    1. agir au chargement de la page
    2. afficher / masquer des éléments

    Le reste (les passages .html("...")), c'est statique, ça n'a rien à faire dans le JS. Du code HTML statique ça va dans le fichier HTML, y'a même pas de question à se poser.

    Pour le script, on remplace :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $(function( ){ ... });
     
    // =>
     
    document.addEventListener("DOMContentLoaded", function( ){ ... });
    // compatible IE9+
    // pour les versions antérieures (si vraiment y'a besoin…), ça s'adapte facilement, il faut juste utiliser onload à la place
    "DOMContentLoaded" ça veut dire ce que ça veut dire : quand le contenu DOM est chargé. À ce moment, la page est prête, on peut lancer le script avec la garantie que tous les éléments sont présents.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $("#idQuelconque").hide();
     
    // =>
     
    document.getElementById("idQuelconque").style.display = "none";
    // compatible IE6+ !!
    Là on utilise CSS pour masquer l'élément. C'est exactement ce que fait jQuery sous le capot, en plus de se faire une tambouille interne avec ses caches et ses piles de sélections à s'arracher les cheveux. Quand le débutant finit par se casser les dents sur ce genre de sorcellerie (ça arrive tôt ou tard), il se lève, quitte son bureau en arrachant ses vêtements, son patron le regarde passer d'un air hébété et finit par le retrouver cinq ans plus tard dans un hôpital psychiatrique à l'autre bout du pays.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $("#idQuelconque").show();
     
    // =>
     
    document.getElementById("idQuelconque").style.display = "";
    // idem
    Là on supprime le "none" qu'on avait mis juste avant : l'élément reprend son apparence par défaut.

    Une fois qu'on a fait ça, on peut se débarasser de jQuery.

    Et, enfin, on comprend ce qu'on fait.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  12. #12
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2014
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Merci
    Merci pour ces précieux conseils. Je débute en js et c'est vrai qu'on peut vite s'y perdre.
    C'est beaucoup plus claire avec ta méthode.


    Citation Envoyé par Watilin Voir le message
    Tu as beaucoup de variables globales et je pense que leur contrôle t'échappe à plusieurs endroits. J'étudie ton code et je n'ai pas encore trouvé d'où venait le problème, mais je vais te donner deux-trois conseils pour améliorer ton développement.

    D'abord, regardons la fonction dessineBalle. Tu lui passes 4 paramètres, mais en réalité elle a un 5e paramètre caché : listeBalles[i][5], qui d'ailleurs repose sur le fait que la variable i a été implicitement déclarée globale. Je ne sais pas si tu en étais conscient.

    En y refléchissant, ta fonction dessineBalle n'a pas besoin qui tu lui passes une par une les données d'une balle. C'est bien plus pratique si tu lui passes la balle toute entière directement, ça ne fait qu'un seul paramètre et elle a accès à toutes les données de la balle. Modifions donc la déclaration de la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function dessineBalle( balle ){
       var x = balle[3];
       var v = balle[4];
       var R = balle[2];
       var c = balle[1];
     
       // ...
     
       balle[5] = py;
     
       // ...
    }
    Et l'endroit où tu l'appelles et où tu lui passes ses paramètres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
          // boucle sur les balles du niveau courant
          for (var i = 0; i < listeBalles.length; i++) {
             var balle = listeBalles[i];
             if (balle[0] <= niveauCourant) {
                if (balle[5] < monCanvas.height - balle[2]) {
                   dessineBalle(balle);
                   nbBallesDessinees++;
                }
             }
          }
    D'ailleurs, intéressons-nous à la structure de ces balles. Actuellement, ce sont des tableaux. Il faut que tu te souviennes que le niveau est en 0, la couleur en 1, etc. C'est fastidieux et potentiellement source d'erreurs. Surtout pour moi qui ne suis pas habitué à ton code, ou toi quand tu te replongeras dedans après 15 jours sans y toucher. Pourquoi ne pas utiliser la légèreté des objets JavaScript pour nommer les propriétés ? Allons-y :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
       listeBalles = [];
       listeBalles[0] = {
          idniveau: 1,
          couleur: "red",
          taille: 5,
          positionX: 5,
          vitesse: 3,
          positionY: 0,
          visible: 1
       };
       // etc.
    Oui, la déclaration prend plus de place, mais tu vas voir, les avantages sont indéniables.

    Maintenant, au lieu d'écrire listeBalles[i][5] tu écris listeBalles[i].positionY. C'est plus lisible non ? Et si on réécrit les endroits où le code utilise les balles, voilà ce que ça donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
          // boucle sur les balles du niveau courant
          for (var i = 0; i < listeBalles.length; i++) {
             var balle = listeBalles[i];
             if (balle.idniveau <= niveauCourant) {
                if (balle.positionY < monCanvas.height - balle.taille) {
                   dessineBalle(balle);
                   nbBallesDessinees++;
                }
             }
          }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function dessineBalle( balle ){
       var x = balle.positionX;
       var v = balle.vitesse;
       var R = balle.taille;
       var c = balle.couleur;
     
       // ...
     
       balle.positionY = py;
     
       // ...
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function reinitialisation( ){
       niveauCourant = 1;
       tempsJeu = 0;
       for (var j = 0; j < listeBalles.length; j++) {
          listeBalles[j].positionY = 0;
          listeBalles[j].visible = 0;
       }
    }
    Carrément plus lisible, pas vrai ?

    À propos, ta fonction reinitialisation n'est jamais utilisée. Je parie que ton problème vient de là

  13. #13
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2014
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Ca marche
    Super ça marche. Merci !


    Citation Envoyé par NoSmoking Voir le message
    Difficile de ne pas plussoyer Watilin pour ses remarques, il est vrai que ta source n'est pas aisée à comprendre et à suivre.

    A la rigueur tu pourrais utiliser des const, const VIT = 4;, pour te faciliter la lecture des index mais la solution objet key/value reste la plus lisible et propre.

    Concernant ton problème, tu en auras d'autres, tu incrémentes une variable vitesse, qui n'est pas une vitesse mais plutôt un incrément en Y, mais tu ne la remets pas à 0 au changement de niveau ce qui fait que les balles repartent du bas de ta zone.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (nbBallesDessinees == 0) {
      niveauCourant++;
      afficheConsigne();
      vitesse = 0;   // IMPERATIF
      py = 0;        // pas utile car initialisé à chaque utilisation
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Jeu de balle rebondissante
    Par hi-1995 dans le forum C
    Réponses: 22
    Dernier message: 21/10/2014, 20h53
  2. [Android] [Jeu] Bubly Balls
    Par lkstudio dans le forum Mon application mobile
    Réponses: 0
    Dernier message: 09/04/2014, 00h22
  3. [Projet terminé] Gambit Ball, jeu arcade gratuit avec classement online
    Par Zoglu dans le forum Projets
    Réponses: 1
    Dernier message: 20/07/2009, 12h15
  4. Réponses: 6
    Dernier message: 07/12/2008, 00h50
  5. Jeu de Plateforme : balle
    Par ketinu dans le forum Développement 2D, 3D et Jeux
    Réponses: 14
    Dernier message: 26/05/2008, 10h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo