This Demo requires Shockwave for Director 6.
Time-based animation is an ideal technique to maximize animation compatibility across multiple processors and playback environments. By linking the speed at which a sprite moves to elapsed time rather than aspecific frame rate, the maximum processing power of a processor can be harnessed, without having to choke it back to accomodate slower machines. It has the added advantages of being able to provide smooth animation without locking out mouse and key events.
A typical animation technique is to use a repeat loop to move a sprite from point A to point B. In traditional techniques, a series of discrete steps is taken by the sprite:
on exitFrame repeat with i = 1 to 10 set the locH of sprite 4 = the locH of sprite 4 + 10 set the locV of sprite 4 = the locV of sprite 4 + 10 updateStage end repeat end exitFrame
In this type of animation, the sprite will move 100 pixels in each direction, with each step taken as fast as the processor can manage to affect the loc property and update the stage. It also has the effect of locking out events. Because different processors will executethe repeat loops faster than others, it's also unpredictable.
Time-based animation, on the other hand is eminently predictable. Typically, an animation needs to take some amount of time, it's simply necessary to define what that time (called a period is).
For simplicity's sake, this example uses some global variables, but more sophisticated approaches would use properties of either behaviors or objects:
(in Movie Script) -------------------------------- global gMoveSprite, gMoveSpriteStartMove, gMoveSpritePeriod global gMoveSpriteOrigin, gMoveSpriteVector on startMovie set gMoveSprite = 4 -- arbitrary sprite channel set gMoveSpritePeriod = 60 -- in ticks set gMoveSpriteOrigin = the loc of sprite 4 set gMoveSpriteVector = point (100,100) end movesprite (in frame script before movement) -------------------------------- global gMoveSpriteStartMove on exitFrame set gMoveSpriteStartMove = the ticks end exitFrame (in frame script of movement) -------------------------------- global gMoveSprite, gMoveSpriteStartMove, gMoveSpritePeriod global gMoveSpriteOrigin, gMoveSpriteVector on exitFrame set nowTime = the ticks if nowTime >= gMoveSpriteStartMove + gMoveSpritePeriod then set the loc of sprite gMoveSprite = gMoveSpriteOrigin + gMoveSpriteVector else set elapsedTime = the ticks - gMoveSpriteStartMove set elapsedVector = gMoveSpriteVector * elapsedTime / gMoveSpritePeriod set the loc of sprite gMoveSprite = gMoveSpriteOrigin + elapsedVector end if go the frame end exitFrame
This method ties the movement of the sprite to the percentage of the movement period that has elapsed since the sprite began moving. It allows for events, it can handle multiple sprites, and it's ideal for situations where the playback machine may have other tasks operating in the background.
To paraphrase the code, the original position (gMoveSpriteOrigin) of the sprite is stored, along with the amount of time alloted to the animation (gMoveSpritePeriod), and the movement vector (gMoveSpriteVector)--stored as a point value in this case. In the frame before the sprite begins to move, the current time is stored as gMoveSpriteStartMove.
In the frame where the animation actually occurs, the amount of time that has elapsed since the sprite first moved is determined. If the full period has elapsed, the sprite is set to its final destination and the playback head moves on. If the period has not elapsed, the movement vector is multiplied by the proportion of elapsed time divided by the total period. That modified vector is then added to the original position of the sprite, and the playback head repeat the frame until the full period elapses.
In the Shockwave movie above, the sprites move to random positions on the screen on each mouse click. Each sprite's period is determined by the values for "Period" and "Variability" (spritePeriod = Period + random (Variability)). By modifying the settings for both values, you can get a sense of just how this type of animation can work. Clicking while the sprites are moving sets their vectors to new locations without having to complete the current animation sequence.
© 1997 by Darrel Plant, Moshofsky/Plant. Permission is granted to link to these pages.