开发者

AS2 acts randomly when changing scenes on the first frame

开发者 https://www.devze.com 2022-12-30 22:59 出处:网络
I have a flash movie containing to scenes: scene1, scene2. I have chosen the order so that scene1 starts first, I was requested to add a functionality to allow flashvars to be passed, i开发者_如何学运

I have a flash movie containing to scenes: scene1, scene2. I have chosen the order so that scene1 starts first, I was requested to add a functionality to allow flashvars to be passed, i开发者_如何学运维f fv_change equals one then scene2 should be the first to appear when the movie is loaded.

I have included the following code in scene1 first frame of some layer:

this.onEnterFrame = function() {
    delete this.onEnterFrame;
    if (isset==undefined && _root.fv_change && _root.fv_change==1) {
        isset = true;
        gotoAndStop("scene2",1);    
    }
}

when testing in my flash environment everything worked fine, when I exported it to an HTML & SWF combo I got random results, I refreshed the page several times and some of the times scene2 appeared and some of the times it stayed with scene1.

Am I doing something wrong? what is the correct way to change scene order using AS2 and external data(flashvars for that matter).


At a guess, it's probably failing to jump to Scene 2 in cases where that frame hasn't loaded yet - try testing it in the IDE with simulated loading (press ctrl+Enter twice) to be sure. If that's the problem, try adding a preloader until the frame you want (or the whole movie) is loaded. (See sample code here.)


Found a solution thanks to your proposal and some googeling. It seems the movie had not finished loading so what I did was create a scene named preloader which ran as the first scene. Inside it on Frame 2 (I found out that frame 1 doesn't always work best):

this.onEnterFrame = function(){
    this.stop();
    if(this.getBytesLoaded() >= this.getBytesTotal() && this.getBytesLoaded() > 0){
        if (_root.fv_change && _root.fv_change ==1) {
            _root.gotoAndPlay("frameLabelForScene2Frame1");
        } else {
            _root.gotoAndPlay("frameLabelForScene1Frame1");
        }
        delete this.onEnterFrame;
    }
};

As you recall scene1 was supposed to run first. if a parameter was supplied scene2 was supposed to run first. The points I think should be emphasized are:

  • Use the second frame on the preloader
  • Have the code to wait for loading to finish
  • IMPORTANT use frame labels instead of scene names with gotoAndPlay
  • use _root.gotoAndPlay and not just gotoAndPlay.
  • just to be safe I included the 'else' part, the preloader would go to scene1 eventually but I wanted to make sure it did

Hope this helps anyone

0

精彩评论

暂无评论...
验证码 换一张
取 消