1

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

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

我假设这可能是因为从 cookware.txt 加载的数据尚未加载到内存中,但这似乎并非如此 - 根据此处的 Actionscript 字典,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

4 回答 4

1

您可能遇到范围链问题。它在 Flash 中的工作方式非常令人困惑。简短的回答是将您的 _global.pots 和 _global.kettles 命名为不同于外部文件中使用的名称以避免冲突。

问题是在您的函数内部,“kettles”对象将引用本地“this.kettles”对象,但前提是它已定义。如果不是,那么它将引用“_global.kettles”对象。这使得 OnLoad 的设置行为难以预测。

于 2009-01-24T06:56:00.057 回答
0

小范围建议:创建一个变量 currentTimeline = _level0(或您的 levelN),您可以在 onLoad 函数的成功部分中使用,避免名称冲突并仅在绝对必要时使用 _global。

于 2009-01-24T13:17:07.760 回答
0

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

before: kettles (global) = 43

曾经发生过-您甚至还没有调用加载。和

after: kettles (global) = 43

可能也不应该工作,因为负载将异步执行。这似乎表明 Flash 播放器在播放之间缓存了 _global 变量,但我以前从未听说过这种情况。你是如何建造这个的?你每次都只是在 Flash IDE 中编译 swf 吗?

是的,大卫所说的范围界定和这个,特别是我会追踪 this.kettles 而不是仅仅为保持一致而使用水壶。

于 2009-01-27T07:08:15.200 回答
0

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

我设法通过检查 loadVar 是否已在每一帧上完成来解决此问题,然后在 loadVar 完成后执行代码。

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

于 2009-02-02T00:18:07.953 回答