Preloading cast members from disk

Note - this article relates to preloading assets from disk. In other words, it relates to using Projectors and delivering your project on CD-ROM. For preloading Shockwave assets, see this article

Preloading cast members can be relatively straightforward using the preload command and/or setting preload mode of casts. However, getting some feedback as the preload occurs (so you can show a progress bar) is a bit more tricky.

One approach is to use the idleLoadtag to tag each cast member before issuing a 'preloadmember' command. This allows you to monitor progress through a list of members to preload. This approach works best when loading several members rather than a few larger members since you can only measure the progress through the list of members, not the progress in loading an individual cast member.

Below is an example parent script to manage loading a list of cast members. You can query the instance of this script to get a percentage of the cast members which have been loaded:

Demo Director 8.5 movie: SIT or ZIP)

-- script "MemberLoadMgr_class"



property myDefaultIdleMode

property myLoadtag

property myIndexMax

property myIndex

property myMemberList

property myTimeout





---INTERFACE



on new (me, aListofMembers)

  me.mInitClass()

  me.mInitInstance()

  -- start loading if a list is provided here

  if aListofMembers.ilk = #list then me.mLoadMembers(aListofMembers)

  return me

end



on mDestroy (me)

  if myTimeout.ilk = #timeout then myTimeout.forget()

  myIndex = myIndexMax

  cancelIdleLoad(myLoadtag)

  the idleLoadMode = myDefaultIdleMode

end



on mLoadMembers (me, aListofMembers)

  myMemberList = aListofMembers.duplicate()

  myIndexMax = myMemberList.count

  myIndex = 0

  myTimeout = timeout(me.string).new(0, #nothing, me)

  the idleLoadMode = 3

end



on mGetPercentageDone (me)

  if myIndexMax > 0 then

    return (float(myIndex)/(myIndexMax))*100

  else

    return 100

  end if

end



---PRIVATE



on exitframe (me)

  if idleLoadDone(myLoadtag) then

    if me.mLoadNextMember() = 0 then

      myTimeout.target = VOID

      myTimeout.forget()

      the idleLoadMode = myDefaultIdleMode

    end if

  end if

end



on mLoadNextMember (me)

  if myIndex < myIndexMax then

    myIndex = myIndex + 1

    thisMember = myMemberList[myIndex]

    if thisMember.ilk = #member then preLoadMember thisMember

      return myIndex

    else

      return 0

    end if

end



on mInitClass (me)

  myDefaultIdleMode = the idleLoadMode

end



on mInitInstance (me)

  uniqueName = string(me).word[4]

  delete the last char of uniqueName

  myLoadTag = symbol(uniqueName)-0

  myTimeout = VOID

end

Usage example

The following is an example behaviour on progress bar etc

property myLoader



on beginSprite (me)

  myMembers = [member("blah1", member("blah1"), member("blah3")

  myLoader = script("MemberLoadMgr_class").new(myMembers)

end



on exitframe (me)

  if myLoader.ilk = #instance then

    amntLoaded = myLoader.mGetPercentageDone()

    put "loading " & integer(amntLoaded) & "%"

    if amntLoaded = 100 then

      myLoader.mDestroy()

      myLoader = VOID

    end if

  end if

end
First published 07/06/2005