http://jsfiddle.net/goldrunt/jGL84/42/ esto es de la línea 84 en este violín JS. Hay 3 efectos diferentes que se pueden aplicar a las bolas descomentando 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);
}
}
javascript
html
MattO
fuente
fuente
asplode
no se declara en el alcance global (o en particular, no se define en un alcance accesibleupdate
); mira nuestra tu consola.balls.splice()
con unp
.Uncaught ReferenceError: asplode is not defined
. La funciónasplode()
no es visible.asplode
no está en el alcance correcto,setInterval
debería recibir una referencia de función,splice
necesita un índice, o tal vez el mundo simplemente se está reduciendo con usted jsfiddle.net/5f85bRespuestas:
Tu código tiene algunos problemas.
Primero, en tu definición:
asplode
es local en el ámbito internoshrink
y, por lo tanto, no es accesible para el código en elupdate
que está intentando llamarlo. El alcance de JavaScript está basado en funciones, porupdate
lo que no se puede verasplode
porque no está dentroshrink
. ( En su consola , verá un error como:.Uncaught ReferenceError: asplode is not defined
)En primer lugar, puede intentar moverse
asplode
fuera deshrink
:Sin embargo, su código tiene varios problemas más que están fuera del alcance de esta pregunta:
setInterval
espera una funciónsetInterval(shrink(p), 100)
hacesetInterval
que se obtenga el valor de retorno de invocado de inmediatoshrink(p)
. Probablemente quierasSu código
for (var i = 0; i < 100; i++) { p.radius -= 1; }
probablemente no hace lo que cree 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 unasetInterval
operación)..splice
espera un índice numérico, no un objeto. Puede obtener el índice numérico de un objeto conindexOf
:Cuando se ejecuta el intervalo por primera vez, la
balls.splice
declaración ya ha sucedido (sucedió hace unos 100 ms, para ser exactos). Supongo que eso no es lo que quieres. En su lugar, debe tener una función de disminución que se llama repetidamentesetInterval
y finalmente se realizaballs.splice(p,1)
despuésp.radius == 0
.fuente
Esto no hace lo que crees que hace. Esto llama
shrink
, lo pasap
y luego pasa el resultado asetInterval
.shrink(p)
regresaundefined
, por lo que esta línea en realidad no pone nada en un intervalo.Probablemente quieras:
fuente