javascript - funcion - jquery
¿Por qué mi bola(objetos) no se encoge o desaparece? (2)
http://jsfiddle.net/goldrunt/jGL84/42/ esto es de la línea 84 en este violín de JS. Hay 3 efectos diferentes que pueden aplicarse a las bolas sin comentar las líneas 141-146. El efecto ''rebote'' funciona como debería, pero el efecto ''asplode'' no hace nada. ¿Debo incluir la función ''reducir'' dentro de la función 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);
}
}
Su código tiene algunos problemas.
Primero, en tu definición:
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);
}
}
asplode
es local al alcance dentro de shrink
y, por lo tanto, no es accesible para el código en la update
donde está intentando llamarlo. El alcance de JavaScript está basado en la función, por lo que la update
no puede ver asplode
porque no está dentro de shrink
. ( En su consola , verá un error como: Uncaught ReferenceError: asplode is not defined
.)
En primer lugar, puede intentar mover un asplode
fuera de shrink
:
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);
}
Sin embargo, su código tiene varios problemas más que están fuera del alcance de esta pregunta:
setInterval
espera una función.setInterval(shrink(p), 100)
hace quesetInterval
obtenga el valor de retorno deshrink(p)
invocación inmediatashrink(p)
. Probablemente quierassetInterval(function() { shrink(p) }, 100)
Su código
for (var i = 0; i < 100; i++) { p.radius -= 1; }
for (var i = 0; i < 100; i++) { p.radius -= 1; }
probablemente no hace lo que crees que hace. Esto ejecutará inmediatamente la operación de disminución 100 veces y luego mostrará visualmente el resultado. Si desea volver a renderizar la bola en cada nuevo tamaño, deberá realizar cada disminución individual dentro de una devolución de llamada de tiempo separada (como una operaciónsetInterval
)..splice
espera un índice numérico, no un objeto. Puede obtener el índice numérico de un objeto conindexOf
:balls.splice(balls.indexOf(p), 1);
Cuando su intervalo se ejecuta por primera vez, la declaración de
balls.splice
ya sucedió (sucedió hace unos 100 ms, para ser exactos). Supongo que eso no es lo que quieres. En su lugar, deberías tener una función de disminución que sea llamada repetidamente porsetInterval
y finalmente realiceballs.splice(p,1)
después dep.radius == 0
.
setInterval(shrink(p),100);
Esto no hace lo que crees que hace. Esto llama a shrink
, le pasa p
, y luego pasa el resultado a setInterval
. shrink(p)
devuelve undefined
, por lo que esta línea no pone realmente nada en un intervalo.
Probablemente quieras:
setInterval(function(){
shrink(p)
}, 100);