JavaScript-Animation, die funktioniert (Teil 2 von 4)

Im letzten Post haben wir die Idee von vorgestellt Sprit, Eine einfache Möglichkeit zum Animieren in JavaScript, die in allen Browsern funktioniert. Wir haben auch durchgegangen, wie man das Sprite als Hintergrundbild für a einrichten kann div Verwenden Sie dann eine Zeile JavaScript, um die Hintergrundposition so zu ändern, dass sie so aussieht, als ob das Bild verschoben wurde.

In diesem Beitrag werden wir diese Technik verwenden, um sowohl Lauf- als auch Sprungbewegungen zu animieren. Um die Animation erstellen zu können, müssen wir die Hintergrundposition in regelmäßigen Abständen schnell ändern. Schauen Sie sich noch einmal das Sprite an, das wir verwenden.


Lernen Sie J kennen, das Maskottchen für meine Firma, Joust Multimedia.

In unserem Beispiel haben wir insgesamt zehn Bilder: Eines von J steht nach rechts gerichtet, drei von J laufen nach rechts und eines von J springt, während es nach rechts blickt (wobei die gleiche Anzahl jedes Frames nach links zeigt). Beginnen wir damit, ihn nach rechts laufen zu lassen. Damit unser Image so aussieht, als würde es laufen, müssen wir zwei Dinge tun: Ändern Sie das Sprite in ein anderes Image und verschieben Sie das div nach rechts.


Nach der richtigen Animation laufen

Wir werden auf keinen Fall steckenbleiben müssen, wenn Sie auf verschiedene Schaltflächen klicken, um die Sprites zu durchlaufen. Daher müssen wir einige Funktionen erstellen, die dies automatisch tun.

Für unsere Lauffunktion möchten wir:

  1. Beweg den div nach rechts etwas
  2. Wechseln Sie zum nächsten Frame der Animation
  3. Pause für einen Bruchteil einer Sekunde (um die Illusion "Persistenz der Vision" zu erhalten)
  4. Wiederholen Sie die Funktion erneut

Zum Glück gibt es eine einfache Möglichkeit, mit Funktionen zu arbeiten. Ein nativer Befehl in JavaScript aufgerufen setTimeout erlaubt uns, eine zeitliche Verzögerung zu erzeugen, nach der wir die Funktion erneut aufrufen werden (innerhalb der Funktion).

 function run_right () // Leicht nach rechts bewegen ... // Zum nächsten Animationsbild wechseln ... // Ruft nach 200 Millisekunden erneut 'run_right' auf. setTimeout (function () run_right ();, 200); 

Jetzt haben wir eine Funktion, die sich fünfmal pro Sekunde erneut aufruft (was schnell genug ist, um Animationen für unsere Zwecke zu erstellen). Denken Sie daran, dass Browser mit ihren Timern nicht besonders genau arbeiten. Sie können den Zeitpunkt für die Millisekunde angeben. Das bedeutet jedoch nicht, dass Ihr Skript genau zu diesem Zeitpunkt ausgeführt wird!

Unser nächstes zu lösendes Problem ist, wie wird unsere Funktion wissen, in welches Sprite sie wechseln soll? In unserem Beispiel müssen wir unsere drei Bilder durchlaufen (um insgesamt vier Animationsbilder zu erhalten). Um dies zu tun, übergeben wir unserer Funktion ein paar Informationen, um zu sagen, zu welcher Folie gewechselt werden soll. Sobald wir uns in der Funktion befinden, werden wir einen Test durchführen, der überprüft, welche Folie wir einschalten sollen, und dann die Hintergrundposition auf das richtige Sprite setzen. Wenn wir die Funktion erneut aufrufen, übergeben wir die nächste Folie als Argument.

 Funktion run_right (slide) // Leicht nach rechts schieben… switch (slide) // Diese switch-Anweisung prüft, ob es für Slide 1 unterschiedliche Möglichkeiten gibt: // Wenn 'Slide' gleich '1' ist ... document.getElementById ( 'j'). style.backgroundPosition = "-40px 0px"; setTimeout (function () run_right (2);, 200); brechen; case 2: // wenn 'slide' gleich '2' ist ... document.getElementById ('j'). style.backgroundPosition = "-80px 0px"; setTimeout (function () run_right (3);, 200); brechen; case 3: // wenn 'slide' gleich '3' ist ... document.getElementById ('j'). style.backgroundPosition = "-120px 0px"; setTimeout (function () run_right (4);, 200); brechen; Fall 4: // Wenn "Folie" gleich "4" ist ... document.getElementById ('j'). style.backgroundPosition = "-80px 0px"; setTimeout (function () run_right (1);, 200); brechen; 

Wenn wir nun die Funktion zum ersten Mal aufrufen, müssen wir sicherstellen, dass wir die Startfolie passieren.

 

Genauso um unsere zu bewegen div etwas nach rechts können wir das anfängliche linke Attribut von übergeben div, dann bewegen Sie die div leicht bei jedem Aufruf der Funktion.

 Funktion run_right (Folie, links) left = left + 15; // Erhöht sein linkes Attribut um 15px document.getElementById ('j'). Style.left = left + "px"; switch (slide) // Diese switch-Anweisung sucht nach verschiedenen Möglichkeiten für 'slide' case 1: // wenn 'slide' gleich '1' ist ... document.getElementById ('j'). style.backgroundPosition = "-40px 0px" ; setTimeout (function () run_right (2, links);, 200); brechen; case 2: // wenn 'slide' gleich '2' ist ... document.getElementById ('j'). style.backgroundPosition = "-80px 0px"; setTimeout (function () run_right (3, links);, 200); brechen; case 3: // wenn 'slide' gleich '3' ist ... document.getElementById ('j'). style.backgroundPosition = "-120px 0px"; setTimeout (function () run_right (4, links);, 200); brechen; Fall 4: // Wenn "Folie" gleich "4" ist ... document.getElementById ('j'). style.backgroundPosition = "-80px 0px"; setTimeout (function () run_right (1, links);, 200); brechen; 

Und wenn wir die Funktion anfangs aufrufen, müssen wir sicherstellen, dass wir die aktuelle linke Position unserer übergeben div.

 

Die Animation stoppen

Jetzt haben wir eine Funktion, die J bei Aufruf dazu animiert, nach rechts zu laufen. Leider haben wir keine Möglichkeit, es zu stoppen. Zuerst müssen wir die Funktion aufhören, sich selbst aufzurufen, wenn J an den Rand unserer Bühne läuft. Dazu wird jedes Mal, wenn die Funktion ausgeführt wird, ein überprüft ob Anweisung, um zu sehen, ob J Platz hat, um weiter zu laufen Wenn ja, werden wir die Funktion normal ausführen. Wenn nicht, werden wir die Funktion nicht mehr aufrufen und ihn zum stehenden Sprite zurückbringen.

 Funktion run_right (Slide, left) // Wenn wir 15 Pixel links hinzufügen können und Js rechter Rand nicht am rechten Rand der Bühne liegt, ... wenn ((links + 15) < (document.getElementById('stage').offsetWidth - document.getElementById('j').offsetWidth)) // We have room! Continue like normal here  else  // if we are on the right edge, we need to stop calling the function and return to standing document.getElementById('j').style.backgroundPosition = "0px 0px";  

Schließlich möchten wir eine Möglichkeit haben, die Funktion bei Bedarf zu stoppen. Wir können das einstellen setTimeout () Befehl an eine Variable, dann stoppen Sie sie mit der clearTimeout () Befehl. Dazu müssen wir diese Variable außerhalb der Funktion deklarieren, damit wir später darauf zurückgreifen können. Im Moment werden wir es als globale Variable deklarieren. Das ist eine schreckliche Kodierungspraxis, aber wir werden dies im nächsten Post korrigieren. So sieht unsere Funktion aus.

 var Timer; Funktion run_right (Folie, links) if ((links + 15) < (document.getElementById('stage').offsetWidth - document.getElementById('j').offsetWidth)) left = left + 15; // Increase his left attribute by 15px document.getElementById('j').style.left = left+"px"; switch (slide) // this switch statement checks for different possibilities for 'slide' case 1: // if 'slide' equals '1'… document.getElementById('j').style.backgroundPosition = "-40px 0px"; setTimeout(function()run_right(2, left);, 200); break; case 2: // if 'slide' equals '2'… document.getElementById('j').style.backgroundPosition = "-80px 0px"; setTimeout(function()run_right(3, left);, 200); break; case 3: // if 'slide' equals '3'… document.getElementById('j').style.backgroundPosition = "-120px 0px"; setTimeout(function()run_right(4, left);, 200); break; case 4: // if 'slide' equals '4'… document.getElementById('j').style.backgroundPosition = "-80px 0px"; setTimeout(function()run_right(1, left);, 200); break;   else  document.getElementById('j').style.backgroundPosition = "0px 0px";  

Und wir können eine weitere Funktion erstellen, um den laufenden Timer zu stoppen und das Sprite zum Standbild zurückzukehren.

 function stop_running () document.getElementById ('j'). style.backgroundPosition = "0px 0px"; clearTimeout (Timer); 

Nach links laufen Animation

Nun, indem Sie den Code von unserem ausleihen run_right Funktion können wir eine weitere Funktion erstellen, um eine run_left Funktion, mit nur wenigen Modifikationen.

 Funktion run_left (Stufe links) if ((links - 15)> 0) links = links - 15; document.getElementById ('j'). style.left = left + "px"; switch (stage) Fall 1: document.getElementById ('j'). style.backgroundPosition = "-40px -50px"; timer = setTimeout (function () run_left (2, links);, 200); brechen; Fall 2: document.getElementById ('j'). style.backgroundPosition = "-80px -50px"; timer = setTimeout (function () run_left (3, links);, 200); brechen; case 3: document.getElementById ('j'). style.backgroundPosition = "-120px -50px"; timer = setTimeout (function () run_left (4, links);, 200); brechen; Fall 4: document.getElementById ('j'). style.backgroundPosition = "-80px -50px"; timer = setTimeout (function () run_left (1, links);, 200); brechen;  else document.getElementById ('j'). style.backgroundPosition = "0px -50px"; 

Animation springen

Schließlich müssen wir eine Sprungfunktion erstellen. Wir werden zwei Argumente an diese Funktion übergeben, eines, das verfolgt, ob die div bewegt sich derzeit aufwärts oder abwärts und ein anderer, der das aktuelle Topattribut der div. Zwischen den beiden bestimmen wir, in welche Richtung die div muss als nächstes weitergehen und wie weit (wir werden das verschieben div weniger Entfernung in der Nähe des Sprungbogens, um die Beschleunigung mit der Schwerkraft zu simulieren).

 Funktionssprung (nach oben, oben) / * * Wir ändern J zu seinem springenden Sprite… * / document.getElementById ('j'). style.backgroundPosition = "-160px 0px"; / * * Hier müssen wir entscheiden, ob er aufwärts oder abwärts fahren soll… * / if (up && (document.getElementById ('j'). OffsetTop> 20)) // wenn er gerade nach oben geht, und er ist mehr als 20 Pixel von der Oberseite der Bühne entfernt ... oben = oben - (oben * .1); // Dies gibt uns einen leichten Bogen im Sprung und nicht eine konstante Bewegung wie das Ausführen von document.getElementById ('j'). Style.top = top + "px"; // seine Position ändern timer = setTimeout (function () jump (up, top);, 60); // Dann rufen Sie die Funktion erneut auf else if (up) // wenn er sich gerade nach oben bewegt, aber er ist fast auf der Bühne und muss wieder herunterkommen ... up = false; // wir wechseln die 'Up'-Variable so, dass er in der nächsten Schleife fällt Timer = setTimeout (function () jump (up, top);, 60);  else if (! up && (document.getElementById ('j'). offsetTop.) < 115)) // if he is moving down, but is more than 5px from the ground, he will continue to fall… top = top + (top * .1); // His fall will slightly accelerate document.getElementById('j').style.top = top+"px"; timer = setTimeout(function()jump(up, top);, 60);  else  // If he is moving down, and he is within 5px of the ground… document.getElementById('j').style.top = "120px"; // Place him on the ground document.getElementById('j').style.backgroundPosition = "0px 0px"; // return to standing sprite // We do not call the loop anymore since he is standing still at this point  

Jetzt können wir alle vier Funktionen in Schaltflächen einfügen und einen Prototyp einer laufenden und springenden Animation erstellen! Bitte überprüfen Sie den Quellcode für diese Seite mit Kommentaren und laden Sie das Sprite-Datenblatt herunter, das ich verwendet habe, wenn Sie möchten.


Fazit

Obwohl wir hier einen funktionierenden Prototyp haben, stellen Sie möglicherweise fest, dass es ein bisschen fehlerhaft ist. Wenn Sie auf mehr als eine Schaltfläche klicken, versucht das Skript, beide gleichzeitig auszuführen. Wenn Sie auf den Abwärtspfeil erneut klicken, wird J für immer weiter fallen. Wie bereits erwähnt, haben wir globale Variablen in unserem Skript. Das bedeutet, dass es möglicherweise schwierig ist, diesen Code in eine vorhandene Seite einzufügen, ohne dass anderes JavaScript abgebrochen wird. Aus diesem Grund habe ich nicht versucht, diesen Code in diesem Blog auszuführen Seite). In unserem nächsten Beitrag werden wir alle diese Fehler beseitigen und über das Konzept von sprechen Verkapselung und warum es wichtig ist, guten Code in der realen Welt zu schreiben.