Warum schrumpfen/verschwinden meine Kugeln (Objekte) nicht?

Lesezeit: 3 Minuten

Benutzer-Avatar
MattO

http://jsfiddle.net/goldrunt/jGL84/42/
das ist ab Zeile 84 in dieser JS-Geige. Es gibt 3 verschiedene Effekte, die auf die Bälle angewendet werden können, indem die Zeilen 141-146 auskommentiert werden. Der ‘Bounce’-Effekt funktioniert wie er sollte, aber der ‘Asplode’-Effekt macht nichts. Soll 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);
    }
}

  • asplode nicht im globalen Bereich deklariert ist (oder insbesondere nicht in einem Bereich definiert ist, auf den zugegriffen werden kann update); Überprüfen Sie unsere Ihre Konsole.

    – Apsiller

    12. Dezember 2013 um 18:11 Uhr


  • Zum Glück ist das so balls.splice() mit einer p.

    – m59

    12. Dezember 2013 um 18:17 Uhr

  • Sie haben einen Fehler Uncaught ReferenceError: asplode is not defined. Funktion asplode() ist nicht sichtbar.

    – Anto Jurković

    12. Dezember 2013 um 18:18 Uhr

  • asplode ist nicht im richtigen Bereich, setInterval soll eine Funktionsreferenz erhalten, splice braucht einen Index – oder vielleicht schrumpft die Welt nur mit Ihnen jsfiddle.net/5f85b

    – Biegebaum

    12. Dezember 2013 um 18:41 Uhr

  • Es ist eine ganz andere Frage. Das Einzige, was sie gemeinsam haben, sind Bälle. Und JavaScript. Und Aufmerksamkeit. Oh und bitte, wenn Sie Witze machen wollen, seien Sie wenigstens geschmackvoll. (Aber sie werden trotzdem gelöscht.)

    – BoltClock

    18. Dezember 2013 um 8:58 Uhr


Benutzer-Avatar
Apsiller

Ihr Code hat ein paar Probleme.

Zunächst in Ihrer Definition:

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 ist lokal für den Bereich innerhalb shrink und daher für den Code in nicht zugänglich update wo Sie versuchen, es anzurufen. Der Umfang von JavaScript ist funktionsbasiert, also update kann nicht sehen asplode weil es nicht drin ist shrink. (In Ihrer Konsolesehen Sie einen Fehler wie: Uncaught ReferenceError: asplode is not defined.)

Sie könnten zuerst versuchen, sich zu bewegen asplode außerhalb 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);
}

Ihr Code weist jedoch mehrere weitere Probleme auf, die außerhalb des Bereichs dieser Frage liegen:

  • setInterval erwartet eine Funktion. setInterval(shrink(p), 100) verursacht setInterval um das zu bekommen Rückgabewert von sofort aufgerufen shrink(p). Du willst wahrscheinlich

    setInterval(function() { shrink(p) }, 100)
    
  • Dein Code for (var i = 0; i < 100; i++) { p.radius -= 1; } macht wahrscheinlich nicht das, was du denkst. Dadurch wird die Dekrementoperation sofort 100 Mal ausgeführt, und dann das Ergebnis visuell darstellen. Wenn Sie den Ball in jeder neuen Größe neu rendern möchten, müssen Sie jede einzelne Dekrementierung innerhalb eines separaten Timing-Callbacks (wie a setInterval Betrieb).

  • .splice erwartet einen numerischen Index, kein Objekt. Sie können den numerischen Index eines Objekts mit erhalten indexOf:

    balls.splice(balls.indexOf(p), 1);
    
  • Wenn Ihr Intervall zum ersten Mal läuft, wird die balls.splice -Anweisung ist bereits erfolgt (es geschah vor ungefähr 100 ms, um genau zu sein). Ich nehme an, das ist nicht das, was Sie wollen. Stattdessen sollten Sie eine dekrementierende Funktion haben, die wiederholt von aufgerufen wird setInterval und tritt schließlich auf balls.splice(p,1) nach p.radius == 0.

Benutzer-Avatar
generisch

setInterval(shrink(p),100);

Das macht nicht das, was du denkst. Das ruft shrinkgeht vorbei pund übergibt dann das Ergebnis an setInterval. shrink(p) kehrt zurück undefinedalso fügt diese Zeile eigentlich nichts in ein Intervall ein.

Sie möchten wahrscheinlich:

setInterval(function(){
    shrink(p)
}, 100);

  • @tereško: Damit kann ich leben 🙂

    – generisch

    12. Dezember 2013 um 18:24 Uhr

1298990cookie-checkWarum schrumpfen/verschwinden meine Kugeln (Objekte) nicht?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy