我使用.swf时间轴中的帧作为flash应用中的页面。用户可以通过单击将她带到下一帧的按钮前进到下一页。类似地,也可以导航到前一帧/页面。
大多数内容都放在舞台上(即通过将库符号的实例拖到舞台上创建),但这些实例的属性(如.visible)可能会通过动作脚本进行更改。此外,一些对象从外部Flash文件加载并使用addChild / addChildAt以编程方式显示。
问题是,如果我在第N + 1帧并且以编程方式在舞台上显示一个对象(即使用addChild,而不是将其放置在舞台上)并导航到第N帧,其中有一个对象放在舞台上(即从图书馆拖出), 然后该对象的实例是undefined / null,如果我尝试设置其属性(如.visible),则会抛出错误。
如果我移动到NEXT帧,只有当我移动到PREVIOUS帧时才会发生错误。因此,我假设在返回一帧时没有调用某种初始化。
我还认为对象不会“活”到下一个时间帧,也就是说,由于范围,它们的值会丢失并重新初始化,但如果舞台上没有动态创建的对象,我可以来回导航。
有没有办法确保在导航回到上一帧时舞台上创建的对象不会消失?
答案 0 :(得分:1)
答案的第一个也是更有用的部分是:时间轴关键帧和脚本可以提供有关显示对象的冲突信息 - 它们是否应该存在,它们应该在哪里等等。例如,当您通过在其框架中播放添加项目,然后使用脚本删除它,然后再次播放到其框架中。当发生这种情况时,Flash没有明确正确的事情,因此它往往是不可预测的。我相信一般情况下,一旦你通过脚本摆弄一个给定的对象,它就会被认为不再关注时间线 - 但你的里程会有所不同。
话虽如此,当你向后玩时情况有所不同的原因是答案的第二个也是更加神秘的部分。在时间轴上向前和向后搜索时,内部Flash的功能不同。 Flash在内部将关键帧视为要在正向应用的更改,因此当您向前播放时,它会按顺序应用这些更改。然而,当你向后移动时,从帧N + X到帧N,它不会扫描插入的X帧来反转这些变化 - 它会跳回到第1帧并快速向前移动到第N帧。通常,它相当于同样的事情,你不需要担心它,但当你进入剧情区域,脚本和时间线对舞台上的内容有不同的看法时,你很容易看到事情的表现有所不同,具体取决于你跳的方式(就像你现在一样)。
对于可预测的工作,超短版本试图确保以相同的方式添加,更新和删除任何给定对象 - 全部通过脚本,或全部通过时间线。如果这看起来不可能,请调整您的内容结构 - 通常,最好的解决方案是将您的对象更改为两个嵌套的对象,以便您想要使用脚本执行的操作比您要执行的操作高一级或低一级。时间表。
答案 1 :(得分:0)
我不确定我的问题是否正确,但as3并不会在你转到某个东西后立即在时间轴上实例化,而是在那个框架之后。 也就是说,你不能
this.gotoAndPlay(10)
this.elementOnTimelineFrame10.DoSomething()
没有错误。
答案 2 :(得分:0)
我记得过去使用这段代码来解决这个问题。在尝试访问和孩子之前,它使用Stage.Invalidate()
函数等待Event.RENDER
,更多信息(虽然模糊不清)here
private function init():void
{
stage.addEventListener(Event.RENDER, stage_renderHandler);
}
private function stage_renderHandler(evt:Event):void
{
// Run your code here
updateChildren();
}
private function enterFrameHandler(evt:Event):void
{
// triggers the RENDER event
stage.invalidate();
}
这也可能非常昂贵(表现明智)。我强烈建议不要在现有时间轴上动态添加/删除对象,有没有什么方法可以在时间轴动画上面放置一个空Sprite
并将其用于所有动态内容?
希望这有帮助