У вашего кода есть несколько проблем.
Во-первых, в вашем определении:
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
является локальным для области видимости внутри shrink
и поэтому недоступен для кода, в update
котором вы пытаетесь вызвать его. Область видимости JavaScript основана на функциях, поэтому update
не может видеть, asplode
потому что она не внутри shrink
. ( В вашей консоли вы увидите ошибку вроде:. Uncaught ReferenceError: asplode is not defined
)
Вместо этого вы можете сначала попробовать выйти 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);
}
Однако у вашего кода есть еще несколько проблем, которые выходят за рамки этого вопроса:
setInterval
ожидает функцию. setInterval(shrink(p), 100)
вызывает , setInterval
чтобы получить возвращаемое значение из немедленного вызова shrink(p)
. Вы, вероятно, хотите
setInterval(function() { shrink(p) }, 100)
Ваш код, for (var i = 0; i < 100; i++) { p.radius -= 1; }
вероятно, не делает то, что вы думаете, что он делает. Это немедленно запустит операцию декремента 100 раз, а затем визуально покажет результат. Если вы хотите рендерить шар с каждым новым размером, вам нужно будет выполнять каждый отдельный декремент в отдельном обратном вызове времени (например, setInterval
операция).
.splice
ожидает числовой индекс, а не объект. Вы можете получить числовой индекс объекта с помощью indexOf
:
balls.splice(balls.indexOf(p), 1);
К тому времени, когда ваш интервал запускается в первый раз, balls.splice
оператор уже произошел (точнее, это произошло около 100 мс назад). Я предполагаю, что это не то, что вы хотите. Вместо этого у вас должна быть убывающая функция, которая неоднократно вызывается setInterval
и, наконец, выполняется balls.splice(p,1)
после p.radius == 0
.
asplode
не объявлен в глобальной области (или, в частности, не определен в области, доступной дляupdate
); проверьте нашу консоль.