为什么Actionscript 2.0在这里有不可预测的输出?

时间:2009-01-23 23:17:25

标签: actionscript actionscript-2

我在一段时间内第一次在Actionscript 2.0中做了一些工作(非常简单,只是从文本文件中提取内容),我无法理解为什么我会变得如此难以预料在这里输出。

有时当我测试构建这样一个简单的脚本时,变量会被列为未定义的,有时则不是。

我认为这可能是因为从cookware.txt加载的数据尚未加载到内存中,但似乎并非如此 - 根据Actionscript字典here ,onLoad函数仅在加载数据时触发,因为程序的其余部分可以访问。

任何人都能解开一些光明吗?或者看看为什么会发生这种情况?

cookware.txt的内容:

pots=44&kettles=43

代码

_global.pots;
_global.kettles;

trace('variables not assigned')
trace('before: kettles (global) = ' + _global.kettles);

trace('before: pots (global) = ' + _global.pots);

var my_lv:LoadVars = new LoadVars();

my_lv.onLoad = function(success:Boolean):Void {
    if (success) {

        trace('variables clearly loaded: kettles = ' + kettles); 

        _global.kettles = this.kettles;

        trace('assigned during loop: kettles in = ' + _global.kettles); 


        trace('pots = ' + kettles);

        _global.pots = this.pots;

        trace('during: pots = ' + _global.pots);

     } else {
        trace("Error");
    }
}


my_lv.load("cookware.txt");

trace('after: kettles (global) = ' + _global.kettles);

trace('after: pots (global) = ' + _global.pots);

输出:

有时就是这样:

variables not assigned
before: kettles (global) = undefined
before: pots (global) = undefined
after: kettles (global) = undefined
after: pots (global) = undefined
variables clearly loaded: kettles = undefined
assigned during loop: kettles in = 43
pots = 43
during: pots = 43

有时就是这样:

variables not assigned
before: kettles (global) = 43
before: pots (global) = 44
after: kettles (global) = 43
after: pots (global) = 44
variables clearly loaded: kettles = 43
assigned during loop: kettles in = 43
pots = 43
during: pots = 43

同样,变量是否未定义似乎是完全随机的。这是怎么回事?

4 个答案:

答案 0 :(得分:1)

您可能遇到scope chain个问题。它在Flash中的工作方式非常混乱。简短的回答是将_global.pots和_global.kettles命名为与外部文件中使用的内容不同的内容,以避免冲突。

问题在于,在你的函数中,“kettles”对象将引用本地的“this.kettles”对象,但仅限于它被定义。如果不是,那么它将引用“_global.kettles”对象。这使得OnLoad的设置行为难以预测。

答案 1 :(得分:0)

小范围建议:创建一个变量currentTimeline = _level0(或你的levelN),你可以在onLoad函数的success部分内部使用,避免名称冲突,只有在必要时才使用_global。

答案 2 :(得分:0)

这里可能存在一些范围问题,但我看不出如何

before: kettles (global) = 43

曾经发生过 - 你还没有调用过载荷。并且

after: kettles (global) = 43

可能不应该工作,因为加载将异步执行。 这似乎表明flash播放器在播放之间缓存了全局变量,但我之前没有听说过这种情况。你是怎么建造这个的?你是不是每次都在Flash IDE中编译swf?

是的,大卫所说的范围和这个,特别是我会追踪这个。为了保持一致性而不仅仅是水壶。

答案 3 :(得分:0)

感谢帮助人员 - 我之前没有点击过LoadVars()是一个异步函数,并且脚本的其余部分将继续,而不检查它是否已加载。

我设法通过检查loadVar在每个帧上完成,然后在loadVar完成后执行代码来解决这个问题。

我编译了swf进行测试(命令+返回)。