Ik ben bezig om een Image Preloader te maken in Actionscript 2.0 - wie niet
- en ik bots daarbij tegen een paar issues op. Mijn ambitieuze eisen zijn als volgt:
En de code die ik in een andere (MovieClip extended) klasse aanroep:
Alles fijn en wel, dit werkt, althans, bij één afbeelding tegelijk. Ik ben een paar bottlenecks tegengekomen die ik niet snap:
Wat kan ik doen om dit netjes op te lossen?
- Het gaat om het dynamisch laden van .JPG's
- De imageLoader-klasse maakt een lege movieclip aan om de afbeelding in te laden
- De vooruitgang wordt zelf door de klasse bijgehouden, m.b.v. setInterval of onEnterFrame
- Wanneer de afbeelding geladen is moet een loadHandler worden aangeroepen, die de scope heeft van de movieclip waar de imageLoader-klasse wordt aangeroepen
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
| import mx.utils.Delegate; class imageLoader extends MovieClip { public var imageContainer:MovieClip; private var imageLoadHandlerFunction:Function; private var loadInterval; private var parentClip; public function imageLoader(imageURL:String, initImageClip:MovieClip, initParentClip) { imageContainer = initImageClip; parentClip = initParentClip; imageContainer.loadMovie(imageURL); this.loadInterval = setInterval(Delegate.create(this,monitorLoadingProgress),33); } public function set loadHandlerFunction(callBack:Function):Void { imageLoadHandlerFunction = callBack; } public function monitorLoadingProgress() { var ready = 0; if(imageContainer.getBytesTotal() > 0) { ready = Math.round(imageContainer.getBytesLoaded()*100/imageContainer.getBytesTotal()); } else { //nothing } if(ready<100) { //nothing } else { clearInterval(this.loadInterval); imageLoadHandlerFunction(); } } } |
En de code die ik in een andere (MovieClip extended) klasse aanroep:
JavaScript:
1
2
3
| imageClip = this.createEmptyMovieClip("mcImage",getNextHighestDepth()); imageLoaderObject = new imageLoader(url, imageClip, this); imageLoaderObject.loadHandlerFunction = Delegate.create(this, myLoadHandler); |
Alles fijn en wel, dit werkt, althans, bij één afbeelding tegelijk. Ik ben een paar bottlenecks tegengekomen die ik niet snap:
- bij het opzetten van een for-loop om meerdere instanties van imageLoader tegelijk aan te maken wordt er maar één afbeelding geladen, dat is de laatste.
- gebruik van onEnterFrame i.p.v. setInterval werkt strakker qua timing, maar op één of andere manier werkt onEnterFrame niet op de imageContainer zelf (?) en alleen op de parentClip erboven en dat lijkt me sowieso niet bepaald netjes...
- verder blijft getBytesTotal na het aanroepen van loadMovie een tijdje 0 en pas later wordt deze de grootte van het te laden plaatje
“Advertising says to people, 'Here's what we've got. Here's what it will do for you. Here's how to get it.'”