A Generic Loading Movie
In addtion to preloading specific assets, entire shockwave movies can be preloaded. In this example, we will create a generic preloader movie. To be generic and usable without having to create a separate loading movie for each shockwave movie to be preloaded, we need to be able to tell the loading movie what file to preload (we could just hard-wire this information into the preloader movie, but this would mean we would have to publish a different preloader for each movie).
There are a couple of ways we could tell the preloader what to load. For instance, the loading movie could use getNetText to ask the server what to load. However, the simplest method is to specify the target movie using the sw1
parameter of the OBJECT and EMBED tag used to embed the movie. For example, if we want to load a shockwave movie called "Filename.dcr", we could specify this file using the following HTML (with many of the additional parameters trimmed):
<object ... width=400 height=300>
<param name= src value="/assets/dcr/loader.dcr">
<param name="sw1" value="/assets/dcr/Filename.dcr">
...
<embed ...
src="/assets/dcr/loader.dcr"
sw1="/assets/dcr/Filename.dcr" >
</embed>
</object>
When the preload movie starts, we can read the sw1 parameter using the externalParamValue
lingo function. Once we know the URL of the movie to load, we can start a preload.
Here's an example of a behaviour that reads the SW1 parameter. If it discovers the name of the file to preload, it starts a preload operation (using the Net.Op script discussed earlier). Once the preload is complete, it then uses goToNetMovie
to jump to the preloaded movie.
property myProgressBar
on beginSprite (me)
me.ReadParams()
end
on exitframe
go to the frame
end
on ReadParams (me)
MovieToLoad = EMPTY
mx = externalParamcount()
if mx > 1 then
repeat with i = 1 to mx
n = externalParamName(i)
v = externalParamValue(i)
if n = "sw1" then
MovieToLoad = v
exit repeat
end if
end repeat
end if
if MovieToLoad.length > 0 then
URLToLoad = "http://www.lingoworkshop.com/dcr/"&MovieToLoad
canvas = (the stage).image
rct = rect(10,10,110,22)
myProgressBar = script("Widget.ProgressBar").new()
myProgressBar.initialise(canvas, rct)
netOp = script("NetOp.Preloader").new(URLToLoad)
netOp.addListener(me)
else
alert "Error retrieving movieToLoad parameter"
halt
end if
end
on PreloadFinished (me, netOp, err)
myProgressBar = VOID
if err <> 0 then
d = netOp.GetErrorDescription(err)
alert "Error preloading movie " & return & return & d
halt
else
theUrl = netOp.url
netOp.Destroy()
id = goToNetMovie(theUrl)
end if
end
on PreloadStatusUpdate (me, netOp, status)
if myProgressBar.ilk = #Instance then
if status[#state] = "InProgress" then
myProgressBar.ShowProgress(status.fractiondone)
else myProgressBar.ShowWorking()
end if
end
Source Movie (Director MX) available. (this is the same Loader movie used throughout the Lingoworkshop).
Note - If you are using Director MX2004, you will need to change the lingo that creates a timeout object in the "NetOp.Preloader" script to the new syntax:
-- DMX 8.5/MX syntax
aTimerObj = timeout(me.string).new(10, #Timer_CheckProgress, me)
-- DMX 2004 syntax
aTimerObj = timeout().new(me.string, 10, #Timer_CheckProgress, me)