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="/dcr/loader.dcr"> 
<param name="sw1" value="/dcr/Filename.dcr"> 
...
<embed ...
	 src="/dcr/loader.dcr"
	 sw1="/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)
Last updated 19th of August, 2005

© 2006 MeccaMedialight. Site Powered by Wrangler 8.