【问题标题】:Flash compilation errorFlash 编译错误
【发布时间】:2011-07-28 10:28:10
【问题描述】:

我正在开发一个非常简单的闪存,但在编译到 swf 文件时遇到问题。详细的错误信息大致翻译如下:

*AssetManager.as

第 47 行:DisplayObject 变量不能是“未定义”

第 51 行:DisplayObject 变量不能为“未定义”

第 101 行:DisplayObject 变量不能是“未定义”

*SWFaddress.as

第 10 行:在需要布尔值的地方使用了 void 方法

第 60 行:置换问题(我怀疑这意味着某些文件已移至其他地方),不再支持 clearInterval 方法,已移至 flash.utils 包

第 243 行:不再支持 setInterval 方法,它已移至 flash.utils。请考虑 Timer 类

请参考屏幕截图,相关代码行已突出显示。

【问题讨论】:

  • 我能问一下为什么你把所有东西都当作静态的吗?
  • @ascension-systems 他似乎是真正的静态人。 8)
  • 大声笑,我在你的答案之后发布了一个答案,我看到你已经在我面前确定了它,但我发布了我的答案,试图帮助他理解为什么这是一个问题。
  • 顺便说一下,那个代码闻起来像反编译的代码。
  • 如果我们错了,我们很抱歉,但我同意,毕竟它确实闻起来像反编译的代码。

标签: flash actionscript-3 actionscript animation


【解决方案1】:

如果.getChildByName() 无法为您提供DisplayObject,它将返回null。尝试将 undefined 更改为 null。 (AssetManager.as 中的第 47、51、101 行)

不要使用flash.utils.* 中的setInterval 和clearInterval,而是使用flash.utils.Timer。 例如:

var myTimer:Timer = new Timer(1000); // 1 second
myTimer.addEventListener(TimerEvent.TIMER, runMany);
myTimer.start();

function runMany(event:TimerEvent):void {
    trace("runMany() called @ " + getTimer() + " ms");
}

并在计时器对象上使用.stop() 而不是clearInterval。更多关于 Timer 类的信息:flash.utils.Timer

ExternalInterface.available 的情况下,我猜问题是因为您将_availability 变量定义为静态的。

附:参考代码的屏幕截图不是很好的方法。下次最好粘贴代码。

【讨论】:

  • @grandproducts,检查我的答案。已编辑。附言如果我回答了您的问题,请不要忘记接受它。 ;P
  • Richards 是对的,他在我之前说的是对的,它使用了静力学,所以将他标记为正确答案。我仍然发布了我的答案,因为我详细解释了为什么这是一个问题。
  • 感谢理查兹和扬升系统。实际上我对“静态”不太了解,那么静态变量本身就是常量吗?哈哈。再次,我应该如何处理静态标记和 ExternalInterface.available 错误?谢谢!
  • 虽然我建议将所有内容都转换为非静态变量和函数,但快速解决方法是更改​​ private static var _availability:Boolean = ExternalInterface.available;只是私有静态 var _availability:Boolean;然后在你的一个函数中的某个地方设置_availability = ExternalInterface.available。但是,您在静态函数中执行此操作仍然可能会遇到相同的错误,修复它的唯一方法是编写非静态类。
  • 另外,静态变量有点像常量,但它们的值可以改变。常量是在字节码中创建的永久值,它们会立即在 VM 内部初始化,并且它们一直存在,直到会话被销毁。静力学在这种方式上是相似的。无论如何,这里有一个链接,您可以在其中下载 3D 坦克游戏并查看源代码,在那里您可以看到一些静态(知道它们在哪里合适),还可以看到应该如何编码和使用类。 code.google.com/p/ascensionsystems/downloads/list
【解决方案2】:

虽然我从未尝试过这样的事情,因此不能真正说,但我猜测您在 SWFAddress 中遇到的奇怪错误是由于您过度使用静态参数造成的。您正在定义一个静态变量,因为您将它转换为基于另一个静态变量的静态命名空间。编译器可能会说返回 void 是因为一个静态定义在另一个之前,并且未定义静态的默认值很可能是 void,而不是 null。这很难确定,因为它需要查看 tamarin C++ 源代码,但无论如何我都会调用它。过度使用静态,就像你的代码一样,表明缺乏对类和对象结构的理解。您应该定义静态的唯一时间是当您想要定义对象的类型或类似性质的东西时。例如,MouseEvent 类具有静态定义可以创建哪种类型的鼠标事件:MouseEvent.MOUSE_DOWN 等。尝试更改您的类,以便正确实例化它们,使用对象级方法和变量而不是静态方法和变量。或者,如果您只想在这里完成您的项目,请尝试在您手动调用的函数中定义基于其他静态变量的静态变量,而不是在静态/类命名空间中。

*更新* 很难将所有这些都归结为一个答案,但基本上静态的工作方式是,它们是虚拟机首先创建的东西,并且它们是永久性的。它们不是动态的或一次性的对象,虚拟机真正构建使用的对象类型。静态是在其他任何事情之前定义的,所以在出现奇怪错误的情况下,您得到的是 void 而不是布尔值,是因为当编译器或虚拟机向下移动“待办事项”列表时,它会冒泡这样的事情到顶部并首先完成它们。但是,它可能会在完全定义 ExternalInterface.available 静态变量之前尝试定义您的 _availability 静态变量。我希望这对原始答案有所澄清。

【讨论】:

  • 感谢 AscenisonSystems 的详细解释。
猜你喜欢
  • 2013-09-28
  • 2014-05-16
  • 1970-01-01
  • 2010-10-21
  • 2022-09-25
  • 2015-08-14
  • 2013-05-30
  • 2011-04-12
  • 2011-09-04
相关资源
最近更新 更多