PDA

Volledige versie bekijken : Functie werkt niet goed wanneer direct aangeroepen


Laiverd
%Europe/Berlin %460 %2005, 12:02
Ik heb hier een bug, waar ik al een tijd naar zit te kijken en die ik maar niet opgelost krijg. Even de situatie: een content_mc, bevat meerdere panel_mc's waarin onderdelen van een site worden geladen. Een functie loadMovies(arr) laadt de movies uit een array in die panels. Deze functie roept in een onEnterFrame iedere keer de functie loadMov (Obj) aan die het daadwerkelijke laden en de preloader functionaliteit voor z'n rekening neemt. Het laden verloopt allemaal prima, het enige is (de bug), dat wanneer ik loadMov (Obj) los aanroep, dat dan de preloader bar kortstondig verschijnt, om daarna spontaan te verdwijnen en niet meer terug te keren. Dat gebeurt voordat de movie is geladen. Ik kan maar niet ontdekken waar het in zit. het zit 'm in elk geval niet in de movie die wordt ingeladen, want als is een movie van een ander panel inlaadt, doet de fout zich ook voor. De panel_mc's zijn allemaal instances van hetzelfde symbool. Het zit 'm echt in het los aanroepen van loadMov (Obj).

Als je gaat kijken op http://www.laiverd.com/groundzero/persephone dan zie je ook dat de preloader bar onder main port er eenvoudigweg niet is, terwijl ie er bij andere onderdelen wel is.

De gebruikte functies (nogal een lap hoor):
// function that loads a movie
function loadMov (Obj)
{
// object name (string)
objStr = Obj;
// the actual object
Obj = eval (Obj);
// if the movie has not been loaded before, and it is not currently loading,
// we load it into target and start a preloader
if (Obj.hasLoaded == false && Obj.isLoading == false)
{
Obj.target._parent.preloader_mc._visible = true;
Obj.target.loadMovie (Obj.movie);
Obj.isLoading = true;
trace ("------------------------------------------");
trace ("Now loading : " + Obj.movie);
trace (Obj.target._parent.preloader_mc._visible)
// start preloader running
Obj.target._parent.preloader_mc.onEnterFrame = function ()
{
l = Obj.target.getBytesLoaded ();
t = Obj.target.getBytesTotal ();
p = Math.round (l / t * 100);
this.bar_mc._width = p;
trace (p);
if (l == t && t > 10)
{
// hide preloader
// this._visible = false;
// set hasLoaded flag
Obj.hasLoaded = true;
// trace (Obj.movie + ".hasLoaded = " + Obj.hasLoaded )
// trace (objStr + ".hasLoaded = " + Obj.hasLoaded);
delete this.onEnterFrame;
}
};
}
}
// function that loads movies stored as references in an array
function loadMovies (arr)
{
// number of movies to load
var numMov = arr.length;
// first movie to load
var currNum = 0;
// trace(currNum == numMov - 1);
// loop through the array to check if all movies have already been loaded;
// if not, start a loop, to load them
for (i = 0; i < numMov; i ++)
{
if (eval (arr [i]).hasLoaded == false && eval (arr [i]).isLoading == false)
{
_root.onEnterFrame = function ()
{
if (eval (arr [currNum]).hasLoaded == false && eval (arr [currNum]).isLoading == false)
{
loadMov (arr [currNum]);
} else if (eval (arr [currNum]).hasLoaded == true)
{
currNum ++;
// loadMov (arr [currNum]);

}
if (currNum == numMov)
{
initialising_mc._visible = false;
delete this.onEnterFrame;
}
}
break;
}
}
}

Elke input is welkom.

Tnx,
John

Roenes
%Europe/Berlin %480 %2005, 12:31
Ik heb er even naar zitten kijken maar kan ook niet echt achterhalen waar het aan ligt. Wat er misschien mee te maken zou kunnen hebben, is dat je checkt of t > 10. maar een lege mc is al iets van 10 bytes geloof ik. dus stel als je daar 50 van maakt, scheelt dat? (denk het niet hoor)

Maar als je de loadMovies aanroept gaat het naar behoren en als je loadMov aanroept werkt het niet lekker? Vink wel een vreemd probleem. Hopelijk is het bovenstaande want het blijft maar erg vreemd :p

Laiverd
%Europe/Berlin %615 %2005, 15:46
Had dat al eens gewijzigd om te kijken of het daar aan , maar dat is ook niet de oplossing. Meer input blijft welkom. Bedankt Roenes.

John

Roenes
%Europe/Berlin %617 %2005, 15:48
Misschien handig om te weten: roep je loadMov pas los aan nadat je loadMovies hebt gebruikt of daarvoor al? Of maakt dat voor het probleem niets uit? :)

Laiverd
%Europe/Berlin %625 %2005, 16:01
Het is opgelost. Op de een of andere manier is het een timing probleem. Ik laad op een bepaald moment twee vrij grote plaatjes en vlak daarvoor doe ik een loadMov("main_port"); Als ik dat uitstel tot een deel van de plaatjes is geladen, werkt het wel. Snappen doe ik het nog steeds niet, maar ik kan weer verder.

Tnx.
John

TheDutch
%Europe/Berlin %868 %2005, 21:51
Was dit toevallig getest met Flash Player 8? Er is namelijk een best grote bug in alle versies van Flash Player 8 met betrekking tot loadMovie en MovieClipLoader. Ben nog in onderzoek met Macromedia Amerika :).

Laiverd
%Europe/Berlin %877 %2005, 22:03
Nee, het was niet gerelateerd aan Flash Player 8, maar was het 'gewoon' een timing probleem. Waar het 'm precies in heeft gezeten weet ik nog steeds niet (maar is ook niet zo belangrijk meer).

Tnx voor het meedenken.

John