Flash 播放头转到错误的场景,没有可解释的原因

Flash Playhead Going to Wrong Scene, No Explainable Cause

Flash 时不时地会做一些不寻常的事情,即使是像场景导航这样简单的事情。问题在于,Flash 播放头并没有按照第一个场景的指示转到 "PitOne" 场景,而是奇怪地到达了我们的 "LevelOne" 场景。这让我感到困惑,因为我无法弄清楚什么可能会改变 Flash 播放头的路径。

在第一个场景的最后一行我直接告诉Flash转到我们的"PitOne"场景,这意味着即使有任何其他导航方法调用之前,只应执行最后一个。

除此之外,除了一些鼠标点击事件外,第一个场景没有添加任何事件监听器。然而,由于在导出 Flash 影片后我们立即被带到可怕的 "LevelOne" 场景,我们可以假设这些 eventListeners 与我们的问题无关。

我在每个场景都设置了一个跟踪方法来跟踪我们Flash播放头的遭遇。根据traced输出,Flash只进入了第一个场景和"LevelOne"场景,所以我们直接从第一个场景进入"LevelOne"场景。这意味着如果我有问题,它会出现在第一个场景中。 但是,在我刚刚向您描述的场景中,有什么可能会改变我们的场景导航路径? 如果您有任何可能的想法,请告诉我!谢谢你的时间。

附加信息: 如果我告诉你,每当我 return 到第一个场景时,场景导航代码似乎启动并开始工作,这可能会有所帮助,因为然后我们被发送到 "PitOne" 场景。

我还意识到,如果您像我一样,就会希望看到手边的真实代码。这是第一个场景的重要代码(我们知道问题出在第一个场景,因为正是这个场景将我们直接引导到 "LevelOne" 场景):

import flash.events.MouseEvent;
import flash.geom.Point;
import flash.events.Event;
import flash.display.MovieClip;
import flash.display.Scene;
import flash.text.TextFormat;

stop();


playNewBtn.addEventListener(MouseEvent.CLICK,playNew);
function playNew(e:MouseEvent){
    playNewBtn.removeEventListener(MouseEvent.CLICK,playNew);
    settingsBtn.removeEventListener(MouseEvent.CLICK,gotoSettings);
    creditsBtn.removeEventListener(MouseEvent.CLICK,gotoCredits);
    gotoAndPlay(1,"LevelOne");
}

settingsBtn.addEventListener(MouseEvent.CLICK,gotoSettings);
function gotoSettings(e:MouseEvent){
    playNewBtn.removeEventListener(MouseEvent.CLICK,playNew);
    settingsBtn.removeEventListener(MouseEvent.CLICK,gotoSettings);
    creditsBtn.removeEventListener(MouseEvent.CLICK,gotoCredits);
    gotoAndPlay(1,"Settings");
}

creditsBtn.addEventListener(MouseEvent.CLICK,gotoCredits);
function gotoCredits(e:MouseEvent){
    playNewBtn.removeEventListener(MouseEvent.CLICK,playNew);
    settingsBtn.removeEventListener(MouseEvent.CLICK,gotoSettings);
    creditsBtn.removeEventListener(MouseEvent.CLICK,gotoCredits);
    gotoAndPlay(1,"Credits");
}


gotoAndPlay(1,"PitOne");

这不是一个答案,但将所有这些都塞进评论是乏味的,而且可读性差。

也许你在其中一个场景名称中打错了?

尝试运行此代码获取所有场景的列表:

import flash.display.Scene;

for (var i:uint = 0; i < scenes.length; i++) {
    var scene:Scene = scenes[i];
    trace("scene " + scene.name + ": " + scene.numFrames + " frames");
}

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/MovieClip.html#scenes


您创建字符串的方式似乎无效:

trace("entered "settings"");

应该是

trace("entered settings");

如果你想在输出中包含 ",你必须通过 \" 转义它们,或者简单地使用 ' 代替。

在您的代码中,settings 之前的 " 标记字符串的结尾,而不是字符串的字符。


如果您有 "thousands of lines",可能是因为重复代码的数量。

function disableButtons():void
{
    playNewBtn.removeEventListener(MouseEvent.CLICK,playNew);
    settingsBtn.removeEventListener(MouseEvent.CLICK,gotoSettings);
    creditsBtn.removeEventListener(MouseEvent.CLICK,gotoCredits);
}

看起来你在加载场景之前就发出了命令。无论您尝试什么(通过添加一个侦听器来检查场景是否已加载),Flash 播放器都将停留在场景 1 的第 1 帧,直到场景 "pitOne" 被加载。 这就是为什么一个好的做法是创建一个预加载器以确保在将命令扔到时间线中的某个位置之前正确加载您需要的所有内容。您在这里有简单且解释清楚的示例:http://www.republicofcode.com/tutorials/flash/as3preloader/。 另一种解决方案是在导出电影时将场景 "pitOne" 设置在第一个位置