11521 sujets

JavaScript, DOM et API Web HTML5

Bonjour à Tous,
je suis loin d'être un cador en langage web, mais je fais des efforts !

Je suis confronté à une incohérence (qui n'en est pas forcément une, mais pour moi elle l'est),
en gros, j'ai un objet (une super voiture !) en mouvement dans une zone prédéfinie (un circuit).
Dans ce circuit il y a des obstacles, et le script suivant doit relever les collisions.

		
		function collision($div1, $div2) {
                    var nb_obstacle = $('[class*="obstacle-"]').length;
		    for (var i = 1; i < nb_obstacle + 1; i++) {
			    var x1 = $("#voiture").offset().left;
			    var y1 = $("#voiture").offset().top;
			    var h1 = $("#voiture").outerHeight(true);
			    var w1 = $("#voiture").outerWidth(true);

			    var b1 = y1 + h1;
			    var r1 = x1 + w1;

			    var x2 =  $(".obstacle-"+i).offset().left;
			    var y2 =  $(".obstacle-"+i).offset().top;
			    var h2 =  $(".obstacle-"+i).outerHeight(true);
			    var w2 =  $(".obstacle-"+i).outerWidth(true);

			    var b2 = y2 + h2;
			    var r2 = x2 + w2;

			    var notBoom = b1 < y2 || y1 > b2 || r1 < x2 || x1 > r2 ;
			    var boom = !notBoom ;
			    if (notBoom) {$('#result').text("Aucune collision")};
			    if (boom) {
			    	$('#result').text("Boom");
			    	alert("boom"); // si je retire cet alert, le script ne me signale que la dernière collision
			    };
	    	}
		}

		window.setInterval(function() {
		    $('#result').text(collision($('#voiture'), $('[class*="obstacle-"]')));
		}, 200);


Si je retire l'alerte qui figure dans mon "if(boom)... le script omet toutes les collisions hormis la dernière.
Pourquoi ? et comment y remédier ?

je vous remercie
Administrateur
Bonjour,

si tu remplaces alert() par console.log("message"), il se passe quoi ?
Question : que penses-tu que fais .text() à la ligne du dessus ?
edit: sans alert(), à quel moment constates-tu que cette ligne / cette condition est appliquée ?
Modifié par Felipe (24 Jun 2015 - 12:29)
C'est normal, dans ta boucle tu écrase chaque fois le résultat. Donc tu ne verra que la valeur de la dernière occurrence de la boucle.
Oken a écrit :
C'est normal, dans ta boucle tu écrase chaque fois le résultat. Donc tu ne verra que la valeur de la dernière occurrence de la boucle.

+1
Si tu te retrouve uniquement avec la DERNIERE valeur, c'est a 100% de l'écrasement de données. que ce soit dans n'importe quel langages.
Modifié par JENCAL (24 Jun 2015 - 13:43)
alors,
pour commencé j'ai modifié la fin et j'ai le même résultat :
		
window.setInterval(function() {
     collision($('#voiture'), $('[class*="obstacle-"]'));
}, 200);


@ Oken et JENCAL
je comprends l'idée, mais comment dois-je faire pour ne pas écraser les données et donc, les conserver ?

@Felipe :
- Si je remplace l'alert par
console.log("message")

le résultat est le même que sans l'alert. >> seul le dernier obstacle est pris en compte, et aucune boite de dialogue ne s'affiche.
- la ligne du dessus (.text()...) me sert de repère, et je souhaite qu'à chaque fois qu'il y ait une collision, le text "boom" s'affiche