Il codice ha alcuni problemi.
In primo luogo, nella definizione:
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
è locale al campo di applicazione all'interno shrink
e quindi non accessibili al codice nella update
in cui si sta tentando di chiamarlo. Lo scope JavaScript è basato sulle funzioni, quindi update
non può vedere asplode
perché non è all'interno di shrink
. (In your console, vedrete un errore simile:. Uncaught ReferenceError: asplode is not defined
)
Si potrebbe provare prima invece lo spostamento al di fuori della asplode
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);
}
Tuttavia, il codice ha molti più problemi che sono al di fuori del campo di applicazione questa domanda:
setInterval
si aspetta una funzione. setInterval(shrink(p), 100)
causa setInterval
per ottenere il valore di ritorno di invocato immediatamenteshrink(p)
. Probabilmente si desidera
setInterval(function() { shrink(p) }, 100)
Il codice for (var i = 0; i < 100; i++) { p.radius -= 1; }
probabilmente non fai quello che pensi lo fa. Ciò eseguirà immediatamente l'operazione di decremento 100 volte e quindi visualizzerà visivamente il risultato. Se si desidera eseguire nuovamente il rendering della palla a ogni nuova dimensione, sarà necessario eseguire ogni singolo decremento all'interno di una richiamata temporizzazione separata (come un'operazione setInterval
).
.splice
si aspetta un indice numerico, non un oggetto. È possibile ottenere l'indice numerico di un oggetto con indexOf
:
balls.splice(balls.indexOf(p), 1);
Con il tempo l'intervallo viene eseguito per la prima volta, la dichiarazione balls.splice
è già successo (è successo circa 100ms fa, per l'esattezza). Presumo che non è quello che vuoi. Invece, si dovrebbe avere una funzione di decremento che viene ripetutamente chiamata da setInterval
e, infine, esegue balls.splice(p,1)
dopo p.radius == 0
.
'asplode' non è dichiarata nel ambito globale (o, in particolare, non è definito in un ambito accessibile a' update'); controlla la nostra console. – apsillers
Fortunatamente, questo è 'balls.splice()' con un 'p'. – m59
si ha errore 'Uncaught ReferenceError: asplode is not defined'. La funzione 'asplode()' non è visibile. –