spacer

Webref WebRef   Sitemap · Experts · Tools · Services · Newsletters · About i.com

home / experts / javascript / column19


Consecutive Animations

Developer News
News Flash: Adobe Has iPhone Workaround
Adobe's Flash 10.1 Goes Mobile (Minus iPhone)
A Salute to Visionary CEOs

Here's the HTML code that defines our animated elements:

<DIV ID="ball1" STYLE="position: absolute; left: 200; -->
top: 200; width: 50;"><IMG SRC="ball1.gif" WIDTH="50" -->
HEIGHT="50"></DIV>
<DIV ID="ball2" STYLE="position: absolute; left: 350; -->
top: 480; width: 25;"><IMG SRC="ball2.gif" WIDTH="25" -->
HEIGHT="25"></DIV>

We embed the following script at the end of the document:

<SCRIPT LANGUAGE="JavaScript1.2">
<!--

document.write("<SCRIPT SRC='animate.js'></SCRIPT>");
onload = start;

function start() {
  anim1 = new animation("ball1");
  if (!anim1.element) return;
  anim2 = new animation("ball2");

  anim2.slideBy(200, -300, 10, 50, "anim1.circle(100, 0, -60, -->
0, 3, 50)");
}

// -->
</SCRIPT>

As you can see, it isn't easy to create consecutive animations, because each following animation must be handed to its previous one as a string. As a result, we must define strings within strings. Let's change the nature of the statement argument. Instead of specifying a statement to be executed at the end of the animation, we'll hand the method an array of statements. Here's an example:

function start() {
  anim1 = new animation("ball1");
  if (!anim1.element) return;
  anim2 = new animation("ball2");

  myArray = new Array();
  myArray[0] = "anim1.circle(100, 0, -60, 0, 3, 50, 'myArray')";
  myArray[1] = "anim2.circle(100, 30, 30, 2, 5, 25, 'myArray')";

  anim2.slideBy(200, -300, 10, 50, "myArray");
}

The array must be defined without the var keyword, because it should be global. By handing the name of the array (as a string) to the animation functions, they can execute the upcoming statement in the array when the current animation ends. You may recall the following statement in our methods:

if (this.statement) eval(this.statement);

This statement executes when the current animation comes to an end. Instead of evaluating the statement parameter, we need to shift off and evaluate its first statement:

if (this.statement) {
  var ar = eval(this.statement);
  if (ar.length > 0)
    eval(ar.shift());
}

The first statement in this block assigns a reference of the global array to a local variable named ar. Since ar simply references the array of animation commands, any change we make to ar also reflect the actual global array. If the array still has one or more elements (animation commands), we shift off its first element and evaluate it. The built-in shift() method was introduced in Navigator 4.0x. It removes the first element from an array and returns that element. Therefore, it changes the length of the array. However, the shift() method isn't supported by Internet Explorer 4.0x. We'll write our own version of the function:

function shift(ar) {
  var first = ar[0];
  for (var i = 1; i < ar.length; i++) {
    ar[i - 1] = ar[i];
  }
  ar.length--;
  return first;
}

Here's the corresponding cross-browser conditional block:

if (this.statement) {
  var ar = eval(this.statement);
  if (ar.length > 0)
    eval(shift(ar));
}

http://www.internet.com

internet.commediabistro.comJusttechjobs.comGraphics.com

Search:

WebMediaBrands Corporate Info

Legal Notices, Licensing, Reprints, Permissions, Privacy Policy.
Advertise | Newsletters | Shopping | E-mail Offers | Freelance Jobs

webref The latest from WebReference.com Browse >
Building a Banking Application Home Page with OOP · Mixing Scripting Languages · Review: phpFox, a Social Networking CMS with all the Bells and Whistles
Sitemap · Experts · Tools · Services · Email a Colleague · Contact FREE Newsletters 
 The latest from internet.com
Enterprise 2.0: Social Networking in the Cloud · BroadSoft Marketplace Hastens Pace of Telephony Innovation · Review: HTC Hero for Sprint


Created: May 21, 1998
Revised: May 21, 1998

URL: http://www.webreference.com/js/column19/consecutive.html