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

asplodeno 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.asplodeno está en el alcance correcto,setIntervaldebería recibir una referencia de función,splicenecesita 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:
asplodees local en el ámbito internoshrinky, por lo tanto, no es accesible para el código en elupdateque está intentando llamarlo. El alcance de JavaScript está basado en funciones, porupdatelo que no se puede verasplodeporque no está dentroshrink. ( En su consola , verá un error como:.Uncaught ReferenceError: asplode is not defined)En primer lugar, puede intentar moverse
asplodefuera deshrink:Sin embargo, su código tiene varios problemas más que están fuera del alcance de esta pregunta:
setIntervalespera una funciónsetInterval(shrink(p), 100)hacesetIntervalque 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 unasetIntervaloperación)..spliceespera 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.splicedeclaració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 repetidamentesetIntervaly finalmente se realizaballs.splice(p,1)despuésp.radius == 0.fuente
Esto no hace lo que crees que hace. Esto llama
shrink, lo pasapy 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