あなたのコードでは、いくつかの問題があります。あなたの定義で
まず、:
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
はあなたがそれを呼び出すようにしようとしているupdate
内のコードにアクセスしない範囲shrink
内側したがってに対してローカルです。 JavaScriptスコープは関数ベースなので、はshrink
の中にないため、asplode
を見ることができません。 (In your console、あなたのようなエラーが表示されます:。Uncaught ReferenceError: asplode is not defined
)
最初shrink
のasplode
外を移動する代わりに、試してみてください:
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
で繰り返し呼び出され、最後にp.radius == 0
の後にballs.splice(p,1)
を実行するデクリメント関数が必要です。
'asplode'はグローバルスコープで宣言されていません(特に' update'でアクセス可能なスコープでは定義されていません)。あなたのコンソールを確認してください。 – apsillers
幸いにも、それは 'balls'plice()'と 'p'です。 – m59
あなたは「Uncaught ReferenceError:asplode is not defined」というエラーがあります。関数 'asplode()'は表示されません。 –