Return to the main timeline. With the Actions panel open, select the preloader movie clip instance and add this script:
onClipEvent (enterFrame) { framesLoaded = Math.ceil (( _parent._framesloaded / _parent._totalframes) * 100); gotoAndStop (framesLoaded); info.text = framesLoaded + "% completed"; if (framesLoaded >= 90) { _root.gotoAndPlay (2); } }
This script is executed using an enterFrame event (24 times a second), which means it will instantly react to the current downloading conditions to display the most accurate representation of the process.
The first thing this script does is determine a percentage value for the number of frames that have downloaded. It then rounds that number up and assigns that value to the framesLoaded variable. Using precedence, the expression employed to do this is evaluated in the following manner:
_parent._framesloaded /_parent._totalframes
With this part of the expression, the number of frames on the main timeline that have loaded is divided by the total number of frames on the main timeline.
NOTE
Since this script is attached to the preloader movie clip instance and that instance resides on the main timeline, the use of _parent as the target path is a reference to the main timeline. This setup allows the preloader clip to be used (and function properly) in any project without modification.
For demonstration purposes, let's assume that the movie has 735 frames, 259 of which have loaded. If that were the case, this part of the expression would look like the following:
259 / 735
This would result in a value of .3523. The next part of the expression is used to multiply that result by 100:
* 100
This would result in a value of 35.23. Lastly, using the Math.ceil() method, this value is rounded up to the next whole number, or 36 and thus framesLoaded is assigned a value of 36. Remember: Since this script is executed 24 times per second, this number increases as the movie is downloaded.
TIP
The _framesloaded and _totalframes properties used in this script can be replaced with the getBytesLoaded() and getByteTotals() methods of the Movie Clip object if you want to make this preloader react to actual bytes loaded (rather than just frames). This is sometimes the preferred method of scripting a preloader because a frame is not considered loaded (thus the preloader will not advance) until all the data it contains is loaded. This may cause the preloader to appear stalled if the frames loaded contain numerous bytes of data. In contrast, looking at the bytes loaded will cause the preloader to move forward more smoothly, since changes in byte-data happens more frequently (as each byte of data is downloaded). See the bonus file on the CD that demonstrates this.
The next action in the script is used to send the current movie to the appropriate frame, based on the value of framesLoaded . Because the current movie contains the tweened animation of the progress bar moving from the left to the right, this action controls the movement of that bar. As the value of framesLoaded increases, so does the appearance of progress on the progress bar.
The next action is used to set what's displayed in the info text field. Here, the value of framesLoaded is concatenated with the string "% completed". If framesLoaded has a value of 36, this will read, "36% completed".
The last part of the script contains a conditional statement used to determine when the preloader's work is complete. It says that once the value of framesLoaded is equal to or more than 90, the main timeline should be moved to Frame 2 (which is actually the Content scene) and play from there.
TIP
The value of 90 in this conditional statement could easily be changed to any value in order to specify when the preloader's work is finished and the movie can begin to play.