[as 2.0] image preloader class doet raar

Pagina: 1
Acties:

  • whitey-d
  • Registratie: April 2000
  • Laatst online: 19-04 22:22
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:
  • 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
Wat heb ik geknutseld: B)
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
Ik heb maandenlang research gedaan naar verschillende preloaders, maar ik kom er niet uit :'( Wat kan ik doen om dit netjes op te lossen?

“Advertising says to people, 'Here's what we've got. Here's what it will do for you. Here's how to get it.'”


  • McVirusS
  • Registratie: Januari 2000
  • Laatst online: 12:26
Ik zou ten eerste eens gebruik maken van de MovieClipLoader. Dan zal ik nu even de rest lezen ;).

  • McVirusS
  • Registratie: Januari 2000
  • Laatst online: 12:26
Waarom gebruik je eigenlijk niet de EventsDispatcher om je eigen events te dispatchen? Lijkt me flexibeler dan zo'n callback functie (Delegate.create is IMHO gewoon een vieze workarround voor built-in classes die geen events broadcasten :P).

  • McVirusS
  • Registratie: Januari 2000
  • Laatst online: 12:26
whitey-d schreef op dinsdag 27 september 2005 @ 14:02:
Alles fijn en wel, dit werkt, althans, bij één afbeelding tegelijk. Ik ben een paar bottlenecks tegengekomen die ik niet snap:
[list]
• 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.
Klinkt als een scope probleem, alles goed gecontrolleert? Lekker tracen en debugger gebruiken ;).
• 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...
Gebruik van setInterval zou je kunnen oplossen door MovieClipLoader te gebruiken. Het laden van "iets" in een movieclip zorgt ervoor dat deze o.a. z'n onEnterFrame functie "kwijtraakt".
• verder blijft getBytesTotal na het aanroepen van loadMovie een tijdje 0 en pas later wordt deze de grootte van het te laden plaatje[/list]
Werk je lokaal of via server? Wat voor plaatjes laad je? Flash kijkt volgens mij namelijk naar de Content-Length header van de website. Anders weet Flash niet hoe groot een plaatje gaat zijn.
Ik heb maandenlang research gedaan naar verschillende preloaders, maar ik kom er niet uit :'( Wat kan ik doen om dit netjes op te lossen?
Maandenlang research naar een preloader? :D

  • whitey-d
  • Registratie: April 2000
  • Laatst online: 19-04 22:22
Ja je weet wel, zo'n levensbepalende zoektocht naar de beste preloader die er is 8)

Ik werk zowel lokaal om te testen als op een goeie (externe) server, en laad de plaatjes, .JPGs van een paar honderd kb maximaal, -niet- progressive, altijd van de server. Ik kan mij herinneren dat het de ene keer wel goed ging met getBytesTotal en de andere keer niet, dus ik heb de laadroutine daarop aangepast - niet zo elegant vind ik als je niet weet waardoor het komt. Met de server heeft het niks te maken volgens mij.

Thanks voor de onEnterFrame-tip, dat wist ik niet.. en ik ga zeker even proberen die MovieClipLoader te implementeren, even naslag gepleegd en klinkt alsof ik die gewoon als imageLoader kan gebruiken - heb ik al die maanden voor niks geploeterd aan een eigen preloader :|

Ik had trouwens al zo'n vermoeden dat die Delegate vrij smerig was ja, ik begon em al te vaak te gebruiken.. zo van hé, hier heb ik geen oplossing voor.. oja dan maar weer even Delegaten :7

“Advertising says to people, 'Here's what we've got. Here's what it will do for you. Here's how to get it.'”