调试是一个解决从应用程序已知问题或测试未知错误和性能问题的过程。这个过程通常最终决定了项目的成败。本文旨在帮助您理解调试过程以及在 Adobe Flash Professional CS5 中的 ActionScript 3 环境中进行开发的常见问题。html
本文中的主体和工做流程建议针对设计人员和开发人员。您的目的是找出并解释问题、适应错误处理流程以及定义一个工做流程(用于在出错时解决错误)。您将使用 Flash Professional CS5 并体验与 Adobe Flash Builder 4 的全新集成效果。程序员
注意:若是您使用的是 Flash CS4,请参阅本文的先前版本:理解 Flash CS4 Professional 中的 ActionScript 3 调试。web
为了使这个流程更形象,我提供了一系列范例文件,每一个文件都包含一个受损版本和一个修复版本。修复版本可供参考,但您能够在阅读本文时了解具体的解决方法。编程
当开始使用 ActionScript 3 时,我留意到的第一点是它对输出错误的宽容度远不及 ActionScript 2。但这最终是一件好事,我已经习觉得常,它甚至已成为个人优点。但有一点能够确定,它与使用 ActionScript 2 大相径庭。数组
本部分将归纳您将处理哪些 Adobe Flash Player 问题以及如何在 Flash Professional 工做区中将它们形象化。浏览器
ActionScript 3 架构以一个新引擎 ActionScript Virtual Machine 2 为运行基础,它解决了先前版本的 Adobe Flash 中累积的许多历史问题。更新幅度很大,以致于它须要一个可在 Flash Player 9 及更高版本中查看的新文件格式。缓存
有关全新 ActionScript 引擎的技术概述,请阅读如下文章:安全
在 Flash Professional CS5 中,ActionScript 3 环境分为两部分:ActionScript 3 FLA 文件和 ActionScript 3 编程语言。服务器
默认状况下,当您在 Flash Professional 中建立新文件时,使用的是 ActionScript 3 FLA 文件。文件中的元素外观以及整体感受与 ActionScript 2 FLA 文件相同,但 Flash Professional 工做区通过更新,可在 ActionScript 3 FLA 处于焦点时,显示 ActionScript 3 功能。最明显的是,您将看到“组件”面板中的整套组件都不一样于以往。架构
处理 ActionScript 3 FLA 文件时,管理资源和建立元件的过程与 ActionScript 2 基本相同,但编码规则有所改变。您能够将代码沿时间轴添加到关键帧,或使用外部 ActionScript 文件将它连接到主时间轴或元件。(没法再将代码附加到舞台中的实例。)
发布影片时,ActionScript 代码将编译到生成的 SWF 文件中。ActionScript 3 编译器经过检查确保代码结构及代码分配都符合 ActionScript 3 语言严格的规则,从而处理 ActionScript 代码。
每次发布影片时,您一般都在编译时处理错误。
错误是 ActionScript 语言和编译器进程内建的通知。错误分三种:编译器错误、运行时错误(ActionScript 例外或错误事件)以及警告:
当发布文件并将 ActionScript 编译为 SWF 文件时,会发生编译器错误。编译器错误强制实施规则,这些规则容许 ActionScript 代码以最佳的指望方式运行。发生编译器错误时,SWF 文件将没法导出,直至修复错误。
在编译时以后的回放过程当中发生问题时,ActionScript 对象将生成运行时错误。运行时错误以错误事件或包含错误描述对象的 ActionScript 例外形式出现。Flash Player 会尝试忽略运行时错误,让它们在后台静默失败,可是若是发生致命错误,它会在“输出”面板上显示大量消息并中止影片回放。
警告出如今编译时,但一般不会中止影片导出或回放。
首先要理解您在 Flash Professional 中看到的可视反馈类型。错误在工做区中将以两种形式之一出现:
“输出”面板和“编译器错误”面板都出如今 Flash Professional 工做区中。我一般将这两个面板纳入一组,并拖到第二台显示器的一侧。个人计划是本身能够在编译器错误造成时同时看到它们以及本身的跟踪动做,因此我会将这些面板放在视野内,而不受干扰。
看到这些形式的错误反馈时,您确定会停下来读取相关的错误文本。文本可能不太容易理解,但一般老是足觉得您指明方向。您还应当花点时间观察本身在文件中的位置。缺陷报告和调试的一个重要部分是能准肯定义问题以及形成该问题的步骤。
编译器错误通常比运行时错误更容易处理,由于在发布过程当中,能够借助指向问题源头的行号清晰地看到它们。将 ActionScript 代码编译到 SWF 文件时,会发生编译器错误。当您运行“测试影片”或“发布”命令时会发生这一状况(请参阅图 1)。
有关完整的错误类型列表,请参阅 Adobe Flash Platform 的 ActionScript 3 参考中的编译器错误。
在调试播放器、独立播放器或 ActiveX 播放器中运行已发布的 SWF 文件时,会发生运行时错误(请参阅图 2)。运行时错误通常以某种形式告诉您应用程序存在问题。若是您对此不予理睬,Flash Player 会尝试容许脚本静默失败,但可能暂停 SWF 文件回放,从而致使没法预测的可视结果。
有关更多信息,请参阅 Adobe Flash Platform 的 ActionScript 3 参考中的编译时警告。
虽然评估性能以及处理性能问题在技术上与 ActionScript 错误及编译器错误无关,但它们是调试流程的一部分。即便设计人员和程序员可能对这个主题持不一样的观点,它仍是会影响他们。
常见的性能问题包括:
SWF 文件最多见的超载状况是过量使用影片剪辑或过多的重叠动画矢量。ActionScript 3 中提升了影片剪辑效率,容许在任何特定时刻使用几百个影片剪辑,但我发现矢量图形超载可能致使播放器在回放过程当中播放不畅。要解决这个问题,一般须要根据图形的重叠方式、屏幕上动画的大小和数量以及所使用的不透明度找出问题。简化内容以及使用 Flash Player 的 BitmapData 类或位图缓存功能增长栅格优化有助于提升性能。
将 Flash Player 硬件加速功能与全屏渲染一块儿使用时,也会出现性能问题。较新的计算机以及设置为高清视频回放的计算机一般能够处理好硬件加速。可是,显卡较旧的计算机可能会遇到问题,这些问题与 Flash Player 如何使用计算机视频硬件进行图像缩放有关。症状可能表现为全屏模式中的图形扭曲、屏幕冻结或帧频变化。用户端的变通方法是关闭“Flash Player 设置”对话框中的硬件加速功能。
有关硬件加速相关问题的更多信息,请参阅 Tinic Uro 的博客文章解释部分此类问题。
最后要提的是内容载入和缓存问题。Flash Player 使用垃圾回收例程,它们在尝试卸载内容时可能会致使问题。垃圾回收是 Flash Player 中的进程,它将再也不使用的内容从内存中释放出来。若是内容仍有引用,Flash Player 将它视为正在使用。这可能影响嵌套 SWF 文件中的声音、视频和内容。例如,某些状况下,您要卸载正在播放声音或视频的 SWF 文件,即便屏幕已经不显示 SWF 文件,声音却没有停下。这类问题的解决方法是在卸载 SWF 文件以前尝试中止声音,或使用 Loader 对象中的 unloadAndStop
API(Flash Player 10 或更高版本)。unloadAndStop
命令将强制 Flash Player 在卸载 SWF 文件时从内存中删除媒体。
垃圾回收会影响应用程序的性能。最佳作法是在尝试删除对象以前,删除对它的全部引用。这包括删除指定到该对象的全部事件监听器。
Flash Player 小组致力于不断改进 Flash Player 的功能、性能和安全性。Flash Player 缺陷和已知问题会不断出现。这些状况的最佳处理方法是为找出和记录缺陷制定一个流程,以便您区分这是文件内部问题仍是 Flash Player 的较大问题。发现问题后,我一般在社区中搜索相关文章。若是其余人遇到相同问题而且手足无措,我会开始查找 Adobe 的官方技术文件或缺陷报告。
若是能够肯定您遇到的是播放器的已知问题,您的最佳选择一般是搜索一个变通方法或将问题做为文档问题进行处理。大多数状况下,缺陷能够获得解决,由于 Flash Player 会递增循环经过版本更新。
有关搜索现有缺陷和报告新缺陷的更多信息,请参阅文章 Flash Player 缺陷和问题管理系统介绍。
虽然大多数状况下我在文本编辑器中编写 ActionScript 代码,个人全部 ActionScript 文件都关联到一个 ActionScript 3 FLA 文件和文档库。每一个项目首先要处理图形生产并组织库中的资源。所以,根据我要执行的任务,个人职位在 ActionScript 程序员和用户界面设计员之间切换。
我发现从用户界面设计员的角度调试 ActionScript 3 FLA 文件时须要注意许多问题。大多数状况下,您的主要目标是理解 ActionScript 3 环境的指望以及代码的放置位置。而且,在将文件从 ActionScript 1/2 升级到 ActionScript 3 时,处理迁移问题是一个常见任务。
本部分归纳了使用 ActionScript 3 FLA 文件中的资源时要处理的问题的类型,而且主要处理旧版 ActionScript 的迁移问题。
设计人员的角色一般更侧重于资源管理和 FLA 文件制做,而不是复杂的编码语法。设计人员还须要处理一些编程要求和概念,所以必须具有必定的代码相关知识。
从设计角度出发,最多见的问题包括:
ActionScript 3 环境实现了全部编码工做流程的标准化,这样能够消除旧版 ActionScript 的许多不一致性。这最终是件好事;但它也使 FLA 文件的设置方式发生了一些变化。
从设计人员的角度出发,最重要的变化包括如下几项:
addEventListener
方法将监听器一致指定到全部对象。(这样作的优点可能并非立竿见影的,但系统要灵活得多。)Flash Professional CS5 提供一些工具,可以使用它们管理文件资源和搜索问题区域:
使用 Flash Professional 工做区浏览文件。您可使用“影片浏览器”面板搜索资源(请参阅图 4)。可以使用调试面板跟踪 ActionScript 变量和函数的问题。
预览工做成果以及检查错误和警告最快的方式是使用“控制”>“测试影片”命令。当 SWF 文件显示在调试面板中时,选择“视图”>“带宽设置”选项便可查看 SWF 文件的配置文件信息概况(请参阅图 5)。
提示:SWF 文件的“视图”菜单中还提供“模拟下载”和“模拟流”选项,但它们不精确。最好使用服务器上实时运行的文件执行基准测试。
使用文件处理缺陷和问题是设计人员的平常工做的一部分。处理问题时,最好有一个层次分明的方法并在计划中规划好时间。
从设计角度出发,一个常见的工做流程可能包括:
提示:我发如今一个新文件中解决问题比在一个完整的项目中处理细节速度更快。定义问题后,获取一个用于单独文件的范例,而后将有效解决方案集成到您的项目中。
如下范例在您将文件从 ActionScript 1 或 2 迁移到 ActionScript 3 格式时,指导您逐步完成常规工做流程。提供的文件在 solutions 文件夹中包含各个范例的 ActionScript 2 版本和 ActionScript 3 版本。
这些步骤将指导您逐步将各个 ActionScript 2 FLA 文件迁移到 ActionScript 3 格式。您将看到错误、查找错误的源头并解决问题。
首先按照这些步骤操做:
ActionScript 3 环境要求您使用 var
关键字声明全部变量实例,甚至在时间轴上。这是一个简单的想法,但在旧版 ActionScript 中它不在要求范围内。
除了添加 var
关键字,这个范例还说明如何处理数据类型以及引用 root
和 stage
对象的新方法。
按照这些步骤操做,更新一个包含过时帧代码的 ActionScript 2 文件:
Symbol 'Circle', Layer 'actions', Frame 1, Line 2 1120: Access of undefined property _root.
Scene 1, Layer 'actions', Frame 1, Line 2 1120: Access of undefined property ovalWidth. Scene 1, Layer 'actions', Frame 1, Line 3 1120: Access of undefined property ovalHeight. Scene 1, Layer 'actions', Frame 1, Line 4 1120: Access of undefined property ovalAlpha. Scene 1, Layer 'actions', Frame 1, Line 7 1120: Access of undefined property ovalWidth. Scene 1, Layer 'actions', Frame 1, Line 8 1120: Access of undefined property ovalHeight. Scene 1, Layer 'actions', Frame 1, Line 9 1119: Access of possibly undefined property width through a reference with static type Class. Scene 1, Layer 'actions', Frame 1, Line 9 1120: Access of undefined property ovalWidth. Scene 1, Layer 'actions', Frame 1, Line 10 1119: Access of possibly undefined property height through a reference with static type Class. Scene 1, Layer 'actions', Frame 1, Line 10 1120: Access of undefined property ovalHeight. Scene 1, Layer 'actions', Frame 1, Line 11 1120: Access of undefined property ovalAlpha.
// Settings var ovalWidth:Number = 400; var ovalHeight:Number = 100; var ovalAlpha:Number = .5; // Notice that alpha ranges from 0 to 1 // Set size circle_mc.width = ovalWidth; circle_mc.height = ovalHeight; circle_mc.x = (stage.stageWidth - ovalWidth) / 2; circle_mc.y = (stage.stageHeight - ovalHeight) / 2; circle_mc.alpha = ovalAlpha;
attachMovie
命令已替换为新的关键字。如今以新方法建立包括元件实例在内的全部实例:
// Create first clip var circle1_mc:MovieClip = new CircleAS3(); circle1_mc.x = 100; circle1_mc.y = 50; addChild(circle1_mc); // Create second clip var circle2_mc:MovieClip = new CircleAS3(); circle2_mc.x = 300; circle2_mc.y = 50; addChild(circle2_mc);
在 ActionScript 3 以前,将按钮事件处理代码和影片剪辑事件处理代码直接放到要影响的实例上很常见。这种方法有一个问题,即代码较难找到而且会分散到多个对象。
ActionScript 3 经过如下方法解决了这个问题:若是将代码放到对象实例上,则将它视为非法。这个概念很简单,可是若是您准备更新一个旧版文件或刚开始接触 ActionScript 3 环境,它会变成一个难题。
按照这些步骤操做,更新一个包含附加到实例的代码的 ActionScript 2 文件:
Warning: Actions on button or MovieClip instances are not supported in ActionScript 3. All scripts on object instances will be ignored.
var animate:Boolean = false; var speed:Number = 10; // Enterframe... function enterFrameHandler(event:Event) { if( animate ){ circle_mc.x += speed; if( circle_mc.x >= stage.stageWidth ){ circle_mc.x = -circle_mc.width; } } } addEventListener(Event.ENTER_FRAME, enterFrameHandler); // Button events function clickHandler(event:MouseEvent) { if( event.target == start_btn ){ animate = true; }else if( event.target == stop_btn ){ animate = false; } } start_btn.addEventListener(MouseEvent.CLICK, clickHandler); stop_btn.addEventListener(MouseEvent.CLICK, clickHandler);
从 Macromedia Flash 5 开始已经不推荐对文本字段对象使用变量和连接字段,但我依然发如今更新旧版内容文件时,使用这个功能会遇到迁移问题。
按照这些步骤操做,更新一个包含不推荐文本字段的 ActionScript 2 文件:
Warning: Text field variable names are not supported in ActionScript 3. The variable buttonState used for an unnamed text field will not be exported. Warning: Actions on button or MovieClip instances are not supported in ActionScript 3. All scripts on object instances will be ignored.
<Instance Name>
字段中的实例名 status_txt。
// Button clicks set text field function clickHandler(event:MouseEvent):void { if( event.target == start_btn ){ status_txt.text = "Start"; }else if( event.target == stop_btn ){ status_txt.text = "Stop"; } } start_btn.addEventListener(MouseEvent.CLICK, clickHandler); stop_btn.addEventListener(MouseEvent.CLICK, clickHandler); // Text clicks launch link in browser function textClickHandler(event:MouseEvent):void { navigateToURL(new URLRequest("http://www.adobe.com"),"_blank"); } status_txt.addEventListener(MouseEvent.CLICK, textClickHandler);
ActionScript 3 FLA 文件中的元件没法再使用连接标识符字段。而是借助元件属性中的“类”和“基类”字段采用一个类似的流程。
按照这些步骤操做,更新一个包含过时连接标识符的 ActionScript 2 文件:
5007: An ActionScript file must have at least one externally visible definition.
package { import flash.display.MovieClip; import flash.events.Event; import flash.events.MouseEvent; public class CircleAS3 extends MovieClip { //****************** // Constructor: public function CircleAS3() { trace("INIT: "+this.name); addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler); } //****************** // Events: private function addedToStageHandler(event:Event):void { addEventListener(MouseEvent.MOUSE_DOWN, onPressHandler); stage.addEventListener(MouseEvent.MOUSE_UP, onReleaseHandler); } private function onPressHandler(event:MouseEvent):void { this.startDrag(false); } private function onReleaseHandler(event:MouseEvent):void { this.stopDrag(); } } }
attachMovie
和 getNextHighestDepth
方法。须要重写这个脚本:
Scene 1, Layer 'actions', Frame 1, Line 4 1120: Access of undefined property circle1_mc. Scene 1, Layer 'actions', Frame 1, Line 5 1120: Access of undefined property circle1_mc. Scene 1, Layer 'actions', Frame 1, Line 10 1120: Access of undefined property circle2_mc. Scene 1, Layer 'actions', Frame 1, Line 11 1120: Access of undefined property circle2_mc.
attachMovie
命令已替换为新的关键字。如今以新方法建立包括元件实例在内的全部实例:
// Create first clip var circle1_mc:MovieClip = new CircleAS3(); circle1_mc.x = 100; circle1_mc.y = 50; addChild(circle1_mc); // Create second clip var circle2_mc:MovieClip = new CircleAS3(); circle2_mc.x = 300; circle2_mc.y = 50; addChild(circle2_mc);
提示:ActionScript 3 语言实现了任务标准化。您将使用新的关键字为使用 ActionScript 的全部对象建立新实例。再也不使用 attachMovie 和 createEmptyMovieClip 命令动态建立影片剪辑实例。
理解 ActionScript 3 FLA 文件环境是调试项目所必需的,可是理解它以后,它就变为一个至关简单的主题。若是要使用过多的代码,您将把大部分时间用于调试 ActionScript 相关问题。
本部分归纳了在 Flash Professional 中使用 ActionScript 3 编程语言时您将处理的问题类型。
ActionScript 3 开发人员在开发过程当中一般会遇到错误和警告。通常而言,这没有什么能够担忧的,您能够静静欣赏应用程序在开发过程当中找出问题。
您一般须要处理与如下各项相关的错误和警告:
注意:有关 Flash Player 中的 CPU 问题和垃圾回收的更多信息,请参阅 Grant Skinner 的文章理解 Flash Player 9 中的垃圾回收。
您可使用几种技术准备用于处理错误的 ActionScript 代码。经过实施适当的错误处理,您能够改善应用程序的性能和相关的用户体验:
在编写 ActionScript 代码时常常运行“测试影片”命令,尽管这听上去很乏味。逐行测试更容易找出问题。当您熟悉 ActionScript 3 语言的前因后果后,就没必要如此频繁地进行测试了。
ActionScript 中的对象经过错误事件或 ActionScript 例外提供错误通知。尽量多监听错误及状态变化的相关事件。您不只能够防止应用程序流中的意外奔溃,还能够访问计时钩(可以使用它们在出现问题时提供适当的用户体验)。
当错误事件不可用时,可以使用 try catch 语句处理 ActionScript 错误。您可能会问,“try catch 语句的使用密度应该为多少?”某些开发人员使用较多,而其余开发人员根本不使用这个功能。我一般会在问题区域附近放置 try catch 语句。
ActionScript 程序员倾向于创造新的应用程序测试和调试方法。在 Flash Professional CS5 工做区中,您可使用如下工具:
有关 Flash Professional 中的 ActionScript 调试器面板和调试工做流程的完整概述,请参阅 Peter Elst 的文章ActionScript 3 调试器介绍。
除了 Flash Professional 工做区,ActionScript 开发人员还将 Flash Builder 调试工具套件用于他们的 ActionScript 项目。Flash Builder 4 工具容许您以 Flex SDK 项目、ActionScript 项目或 Flash Professional 项目形式构建和调试 Flash 内容。Flash Professional CS5 与 Flash Builder 4 之间新的开发和调试工做流程有助于将代码更快地集成到 Flash 影片中并提供更多调试选项。您将在本文的最后部分仔细查看 Flash Builder 工做流程。
有关 Flash Builder 项目的概述,请参阅 Flash Builder 4 在线文档中的关于 Flash Builder 项目。
ActionScript 问题的调试工做流程相似于设计工做流程,惟一不一样之处是与 FLA 相关问题相比,您更注重于查找代码问题。
要在 Flash Professional 中创做时调试 ActionScript 代码:
要在 Flash Builder 中工做时调试 ActionScript 代码:
要调试一个已部署到服务器的 SWF 文件:
提示:根据错误状况,您可能须要使用 ActionScript 3 调试器。当空值或堆栈溢出导出回放奔溃时,调试器最实用。
如下范例说明了 ActionScript 3 常见问题。每一个范例带有两个文件,一个代表问题,另外一个代表解决方法。如下步骤将指导您逐步解决各个问题。您将体验错误、找到错误来源并解决 ActionScript 的使用问题。
首先按照这些步骤操做:
您极可能常常遇到这个问题。若是尝试访问不存在的某个属性或函数,您将触发错误。这个问题通常很容易修复,但“输出”面板一般不会告诉您哪一个属性未定义。这种状况下,最快的解决方法是使用 ActionScript 3 调试器找到问题的源头。
按照这些步骤操做,找到并解决值未定义的问题:
TypeError: Error #1010: A term is undefined and has no properties. at developer_sample1_fla::MainTimeline/frame1()[developer_sample1_fla.MainTimeline::frame1:12]
// Declare array variable var books:Array = new Array(); books.push({title:"ActionScript 3 Cookbook",author:"Joey Lott"}); books.push({title:"Essential ActionScript 3",author:"Colin Moock"}); books.push({title:"Adobe AIR 1.5 Cookbook",author:"David Tucker"}); // Loop through array and display text... var len:uint = 3; // it's better to use books.length here... for(var n:uint=0; n<len; n++) { books_txt.appendText(books[n].title+", by "+books[n].author+"\n"); }
提示:前一个范例设计为生成一个错误。您一般不会为 len 变量硬编码一个值。您将使用数组的长度属性,使循环执行时不生成错误。
使用 ActionScript 实例化的对象不会自动放到舞台(显示列表)。这个概念其实很实用,由于您如今能够在预处理例程变为可见以前运行它们;不过虽然很棒,您仍是须要慢慢适应它。
您将使用 addChild
方法,将实例添加到时间轴的显示列表。一旦这样作,实例就能够访问舞台、根和父级属性。按照这些步骤操做,修复一个有显示列表实例化问题的文件:
getChildIndex
方法。接下来天然应当返回代码并搜索 ActionScript 语句:
ArgumentError: Error #2025: The supplied DisplayObject must be a child of the caller. at flash.display::DisplayObjectContainer/getChildIndex() at developer_sample2_fla::MainTimeline/frame1()
// Create a black rectangle var myClip:Sprite = new Sprite(); myClip.graphics.beginFill(0); myClip.graphics.drawRect(0,0,100,100); myClip.graphics.endFill(); // Add the instance to the Stage addChild(myClip); // Get the instance's depth in the display list... var myClipDepth:uint = getChildIndex(myClip);
提示:为了防止 ActionScript 类中出现显示列表计时问题,可以使用 ADDED_TO_STAGE 事件延迟显示列表处理,直至将对象添加到舞台。
ActionScript 3 是一种严格的类型语言。要改善编译器的性能以及影片的运行时回放,最佳作法是在声明变量和函数时为它们设置数据类型。为声明添加数据类型将定义变量或函数将处理数据的类型。
提示:Flash Professional CS5 新增了一个功能,即在“动做”面板中为对象设置数据类型时,自动生成导入语句。
按照这些步骤操做,使用不正确的数据类型条目更新文件:
addToScore
函数的右括号。您将从这里读取错误,并逐行往下修复代码。score
和 increment
值更改成 Number
数据类型(Number
而不是 uint
,由于数字包含小数),而且函数的返回值更改成 void 数据类型(表示它不返回任何内容)。而且,事件对象更新为 MouseEvent
数据类型。这没有致使错误,由于 MouseEvent
是一个 Event
,但它显然能够添色很多。
// Create Number variable var score:Number = 0; var increment:Number = .2; function addToScore(event:MouseEvent):void { score += increment; score_txt.text = "Score = "+score; } add_btn.addEventListener(MouseEvent.CLICK, addToScore);
当您尝试载入一个外部文件,但过程失败时会发生 IO 错误。在 ActionScript 3 中,您将使用错误事件或 try catch 语句优雅地处理这些错误,并为用户体验提供有意义的反馈。
按照这些步骤操做,处理载入 SWF 文件时产生的问题:
Error opening URL 'http://www.dancarrdesign.com/images/test.jpg' Error #2044: Unhandled IOErrorEvent:. text=Error #2036: Load Never Completed.
import flash.events.*; function completeHandler(event:Event):void { // Add image to the Stage when loaded... addChild(event.target.content); } function statusHandler(event:HTTPStatusEvent):void { // Respond to status notifications... trace("HTTP Status: "+event.status); } function errorHandler(event:IOErrorEvent):void { // The image failed to load. Show feedback and proceed... trace("IOERROR: "+event.text); } // Create a Loader to load an image... var loader:Loader = new Loader(); loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler); loader.contentLoaderInfo.addEventListener(HTTPStatusEvent.HTTP_STATUS, statusHandler); loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, errorHandler); loader.load(new URLRequest("http://www.dancarrdesign.com/images/test.jpg"));
Flash Player 采用一个安全模型,它保护各个 SWF 文件和您的计算机免遭恶意攻击。若是全部文件运行在同一个域中,您通常不会遇到任何安全错误。可是,您可能但愿将运行于不一样域的不一样服务器上的内容和数据聚合在一块儿。这种状况下,您极可能遇到安全错误。
按照这些步骤操做,解决数据载入安全问题:
从不一样的域载入数据或在载入其余 SWF 文件的一个 SWF 文件之间交叉编写脚本时,安全限制最为苛刻。从不一样的域载入数据时,使用权限文件是最佳选项(提供的文件包含一个 crossdomain.xml 文件范例)。在 SWF 文件之间交叉编制脚本时,您能够在 ActionScript 中使用 Security 对象的 allowDomain
方法。
提示:我发现遇到安全问题时,个人应用程序会静默失败而且彷佛没法解释。我一般假设这是一个安全相关问题并尝试容许权限,或者记录从 ActionScript 到 JavaScript 的调用,以在运行时暴露安全错误事件或相似的信息。您可使用 ActionScript 中的 ExternalInterface 对象,或经过获取第三方资源设置这类记录例程。
Flash Professional CS5 为使用 ActionScript 3 调试器提供两个选项:能够从 Flash Professional 直接运行调试器,也能够经过从 Flash Builder 4 启动它来运行调试器。此外,Flash Builder 有一套本身的调试工具,它们能够与调试版 Flash Player 结合使用,为您提供更多调试选项。
Flash Professional CS5 与 Flash Builder 4 之间的全新集成旨在帮助您轻松发挥 Eclipse 文本编辑器的强大功能并完成 Flash Professional 中的常见任务。为了充分利用 Flash Builder,您将在 ActionScript 类中编写代码,它能够连接到 FLA 文件的主时间轴或 FLA 文件库中的任何影片剪辑元件。
本部分将向您展现调试器工做流程的不一样选项。
该范例说明如何使用 Flash Professional 浏览一个脚本,每当您单击舞台时,该脚本会随机生成一系列形状。效果至关不错,可是若是要分析生成的随机值以便对参数进行微调呢?您能够在循环中设置一个断点,它能够生成形状,以便您在调试器中执行时观察随机值的实时状况。
按照这些步骤操做,了解 ActionScript 循环内生成的变量值:
draw
函数经过遍历一个循环生成形状。而且随机生成几个变量,用于定义形状的 x
、y
、width
、height
、color
和边框粗细。
提示:您能够经过如下方法尝试变量值:在“变量”面板中更新变量值,而后进到代码执行。
有关使用 Flash Professional 调试器的更多信息,请参阅 Flash 在线文档的调试 ActionScript 3 部分。
Flash Builder 4 和 Flash Professional CS5 为新的编码工做流程创造了可能性,这些工做流程将 Flash Builder 用做文本编辑器,将 Flash Professional 用做内容编辑器。Flash Builder 用于快速编写 ActionScript 类,并根据须要调试代码。Flash Professional 用于管理内容和实施代码(经过将代码指定到 FLA 文件中的时间轴)。
这个范例说明如何使用上一个示例中使用的文件在 Flash Builder 中生成一个 Flash Professional 项目。此次,您将在 Flash Builder 中更新代码,从 Flash Builder 工做区启动 Flash Professional 调试器。
注意:该范例假设您的计算机上已安装 Flash Builder 4。
按照这些步骤操做,设置您的 Flash Builder 项目:
package { import flash.display.MovieClip; import flash.events.MouseEvent; public class ShapeRandomizer extends MovieClip { //******************* // Properties: private var _numShapes:uint = 25; private var _maxWidth:Number = 200; private var _maxHeight:Number = 200; //******************* // Constructor: public function ShapeRandomizer():void { draw(); // Initialize... stage.addEventListener(MouseEvent.MOUSE_DOWN, draw); } //******************* // Events: private function draw(event:MouseEvent=null):void { this.graphics.clear(); for(var n:uint=0; n<_numShapes; n++) { var w:Number = Math.random()*_maxWidth; var h:Number = Math.random()*_maxHeight; package x:Number = Math.random()*(stage.stageWidth/2); var y:Number = Math.random()*(stage.stageHeight/2); var c:Number = Math.random()*255; var b:Number = Math.random()*10; this.graphics.lineStyle(b, c); this.graphics.drawRect(x, y, w, h); this.graphics.endFill(); } } } }
按照这些步骤操做,在 Flash Professional 中调试代码:
至此,您已尝试 Flash Builder 与 Flash Professional 工做区的集成。您也可使用 Flash Builder 4 的“Flash 调试”透视提供的扩展调试工具。Flash Builder 透视是有助于执行任务的一组面板。在上例中,您使用的是 Flash Builder 中的“Flash 透视”。若是切换到“Flash 调试”工做区(请参阅图 12),将显示一组新的调试视图。
“Flash 调试”透视包含如下视图:
如您所见,Flash Builder 包含 Flash Professional 的基本调试元素,其中包括用于控制逐步经过断点的调试控制台,用于分析变量(发生断点或运行时错误处)的变量视图。Flash Builder 还经过添加工具扩展了调试可能性,这些工具容许您更细致地管理断点和设置条件断点。
要使用 Flash Builder 的调试工具,您首先须要安装调试版 Flash Player。调试播放器是标准 Flash Player 的一个变体,它容许您跟踪动做和调试功能,从而在浏览器中处理 SWF 文件。您可使用 Flash Professional CS5 安装随附的安装程序或访问 Flash Player 下载站点安装调试播放器。
按照这些步骤操做,安装调试播放器:
注意:您能够根据须要在常规 Flash Player 和调试播放器之间随意切换。若是遇到问题,请参阅如下任何一个技术文件:
按照这些步骤操做,在“Flash 调试”透视中启动调试会话:
有关 Flash Builder 中的项目调试选项的更多信息,请参阅 Flash Builder 4 在线文档的调试应用程序部分。
至此,您已经对 Flash Professional 和 Flash Builder 中与应用程序开发相关的常见问题及调试技术有了进一步了解。不管您是设计人员仍是 ActionScript 程序员,这些工做流程均可以帮助您解决问题并在 ActionScript 3 环境中更自信地工做。