http://jsfiddle.net/goldrunt/jGL84/42/ Dies ist aus Zeile 84 in dieser JS-Geige. Es gibt 3 verschiedene Effekte, die durch Auskommentieren der Zeilen 141-146 auf die Kugeln angewendet werden können. Der 'Bounce'-Effekt funktioniert wie es sollte, aber der' Asplode'-Effekt bewirkt nichts. Sollte ich die 'Shrink'-Funktion in die Asplode-Funktion aufnehmen?
// 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
quelle
quelle
asplode
wird nicht im globalen Bereich deklariert (oder insbesondere nicht in einem Bereich definiert, auf den zugegriffen werden kannupdate
); Überprüfen Sie unsere Konsole.balls.splice()
mit einemp
.Uncaught ReferenceError: asplode is not defined
. Funktionasplode()
ist nicht sichtbar.asplode
ist nicht im richtigen Bereich,setInterval
sollte eine Funktionsreferenz erhalten,splice
braucht einen Index - oder vielleicht schrumpft die Welt nur mit Ihnen jsfiddle.net/5f85bAntworten:
Ihr Code hat einige Probleme.
Zunächst in Ihrer Definition:
asplode
ist lokal für den Bereich innerhalbshrink
und daher für den Code, inupdate
dem Sie ihn aufrufen möchten, nicht zugänglich . Der JavaScript-Bereich ist funktionsbasiert undupdate
kann daher nicht angezeigt werden,asplode
da er sich nicht im Inneren befindetshrink
. ( In Ihrer Konsole wird ein Fehler angezeigt wie :Uncaught ReferenceError: asplode is not defined
.)Sie könnten zuerst versuchen, sich stattdessen
asplode
außerhalb vonshrink
:Ihr Code weist jedoch mehrere weitere Probleme auf, die außerhalb des Rahmens dieser Frage liegen:
setInterval
erwartet eine Funktion.setInterval(shrink(p), 100)
bewirktsetInterval
, dass der Rückgabewert von sofort aufgerufen wirdshrink(p)
. Sie wollen wahrscheinlichIhr Code macht
for (var i = 0; i < 100; i++) { p.radius -= 1; }
wahrscheinlich nicht das, was Sie denken. Dadurch wird die Dekrementierungsoperation sofort 100 Mal ausgeführt und das Ergebnis dann visuell angezeigt. Wenn Sie den Ball in jeder neuen Größe neu rendern möchten, müssen Sie jede einzelne Dekrementierung innerhalb eines separaten Timing-Rückrufs (wie bei einersetInterval
Operation) durchführen..splice
erwartet einen numerischen Index, kein Objekt. Sie können den numerischen Index eines Objekts erhalten mitindexOf
:Zu dem Zeitpunkt, zu dem Ihr Intervall zum ersten Mal ausgeführt wird, ist die
balls.splice
Anweisung bereits eingetreten (genauer gesagt vor etwa 100 ms). Ich nehme an, das ist nicht was du willst. Stattdessen sollten Sie eine Dekrementierungsfunktion haben, die wiederholt von aufgerufen wirdsetInterval
und schließlichballs.splice(p,1)
danach ausgeführt wirdp.radius == 0
.quelle
Das macht nicht das, was du denkst. Dies ruft auf
shrink
, übergibt esp
und übergibt dann das Ergebnis ansetInterval
.shrink(p)
kehrt zurückundefined
, sodass diese Zeile eigentlich kein Intervall enthält.Sie wollen wahrscheinlich:
quelle