http://jsfiddle.net/goldrunt/jGL84/42/ c'est de la ligne 84 dans ce violon JS. Il y a 3 effets différents qui peuvent être appliqués aux boules en décommentant les lignes 141-146. L'effet «rebond» fonctionne comme il se doit, mais l'effet «asplode» ne fait rien. Dois-je inclure la fonction «rétrécir» dans la fonction asplode?
// balls shrink and disappear if they touch
var shrink = function(p) {
for (var i = 0; i < 100; i++) {
p.radius -= 1;
}
function asplode(p) {
setInterval(shrink(p),100);
balls.splice(p, 1);
}
}
javascript
html
MattO
la source
la source
asplode
n'est pas déclaré dans le périmètre global (ou en particulier, non défini dans un périmètre accessible àupdate
); consultez notre votre console.balls.splice()
avec unp
.Uncaught ReferenceError: asplode is not defined
. La fonctionasplode()
n'est pas visible.asplode
n'est pas dans la bonne portée,setInterval
devrait recevoir une référence de fonction, asplice
besoin d'un index - ou peut-être que le monde se rétrécit avec vous jsfiddle.net/5f85bRéponses:
Votre code a quelques problèmes.
Tout d'abord, dans votre définition:
asplode
est local à l'étendue à l'intérieurshrink
et n'est donc pas accessible au code dansupdate
lequel vous essayez de l'appeler. La portée JavaScript est basée sur une fonction, elleupdate
ne peut donc pas être vueasplode
car elle n'est pas à l'intérieurshrink
. ( Dans votre console , vous verrez une erreur comme:Uncaught ReferenceError: asplode is not defined
)Vous pouvez d'abord essayer de vous déplacer à l'
asplode
extérieur deshrink
:Cependant, votre code a plusieurs autres problèmes qui sortent du cadre de cette question:
setInterval
attend une fonction.setInterval(shrink(p), 100)
provoque l'setInterval
obtention de la valeur de retour de immédiatement-invoquéshrink(p)
. Tu veux probablementVotre code
for (var i = 0; i < 100; i++) { p.radius -= 1; }
ne fait probablement pas ce que vous pensez qu'il fait. Cela exécutera immédiatement l'opération de décrémentation 100 fois, puis affichera visuellement le résultat. Si vous souhaitez restituer la balle à chaque nouvelle taille, vous devrez effectuer chaque décrémentation individuelle dans un rappel de synchronisation distinct (comme unesetInterval
opération)..splice
attend un index numérique, pas un objet. Vous pouvez obtenir l'index numérique d'un objet avecindexOf
:Au moment où votre intervalle s'exécute pour la première fois, la
balls.splice
déclaration s'est déjà produite (elle s'est produite il y a environ 100 ms, pour être exact). Je suppose que ce n'est pas ce que tu veux. Au lieu de cela, vous devriez avoir une fonction de décrémentation qui est appelée à plusieurs reprises parsetInterval
et qui fonctionne finalementballs.splice(p,1)
aprèsp.radius == 0
.la source
Cela ne fait pas ce que vous pensez. Cela appelle
shrink
, passep
, puis transmet le résultat àsetInterval
.shrink(p)
Retourundefined
, donc cette ligne ne place rien sur un intervalle.Vous voulez probablement:
la source