《ActionScript 3.0 Cookbook》读书笔记6.3-控制载入的外部影片

控制载入的外部影片

在学习Recipe 6.7. Loading and Interacting with External Movies 一节时发现问题,如果按照书中所讲,在Event.INIT事件时就可以使用_loader.content来引用载入的影片了。但是,我在运行的时候却发生了这样的错误:

TypeError: Error #1009: 无法访问空对象引用的属性或方法。
at LoadExternalMovie/::onMovieInit()

这也就意味着,在INIT事件发生的时候,_loader.content并没有初始化成功。本以为是书中的代码有错,就使用了Timer类来进行延迟处理,1秒钟之后再调用_loader.content与影片进行交互。虽然是成功了,但总感觉有些不对,书中的代码应该不会有错。后来仔细检查才发现,在注册事件的时候,我误将_loader.contentLoaderInfo写成了_loader.loaderInfo。前者来自Loader类,而后者继承自DisplayObject类。虽然后者也会触发INIT事件,却与被载入的影片无关,自然,当INIT发生的时候,_loader.content是没有准备好的,出错也是理所当然了。

除了这点,还有三点需要注意的:

  1. 本节中所讲的控制载入影片的方法仅适用与ActionScript3编写的swf
  2. 要调用外部载入的影片的方法,需要将_loader.content保存在类型生命为*的实例中,否则会出现运行时错误。
    我感觉这就好像在ActionScript2中将不确定类型的值设置为Object类型以规避编译器的类型检验。只不过ActionScript2时是在规避编译错误,而这是规避运行时的错误罢了。
  3. 在试图调用外部影片中本来不存在的方法或属性时,会抛出ReferenceError异常

《ActionScript 3.0 Cookbook》读书笔记6.2-SimpleButton

SimpleButton

SimpleButton,相当于Flash中的按钮元件。在Flash中,它有“up”、“over”、“down”和“hit”四种状态,“hit”状态是用来控制按钮的可点击区域的。而在ActionScript 3中,SimpleButton类的实例同样有四种状态“upState”、“overState”、“downState”和“hitTestState”。

前面的三种状态都很好理解,正好和按钮元件的前三种状态对应,只需要将DisplayObject指定给它们即可。而“hitTestState”状态,则是让我郁闷了一下。

按照Flash中的原理,按钮的四种状态中,其实仅仅设置up状态,按钮就可以工作。但是在SimpleButton中,这个惯例行不通。如果不设定hitTestState状态,按钮根本不响应。

因此,要使用SimpleButton,必须至少设定两种状态,而hitTestState状态是必须设定的。而实际上,要实现一个正常的按钮效果,四种状态都必须设定。因为如果某个状态不被设定,当按钮显示这种状态时,按钮中就没有任何内容。

可以用下面的代码做个实验,注释10-13行中不需要状态,然后编译看效果:

继续阅读《ActionScript 3.0 Cookbook》读书笔记6.2-SimpleButton

《ActionScript 3.0 Cookbook》读书笔记6.1-关于Display List

由于工作太忙,2-5章的内容又相对简单,因此一直没有来得及整理学习笔记,现在正在学习第6章,因此笔记也从这里开始。前面的笔记,有时间再补上。

Display List

ActionScript3的Display List是我很感兴趣的一部分内容,它完全改变了ActionScript1和ActionScript2的层级结构。确实,新的层级结构非常清晰,更加便于使用。

Flash Player 9由两个部分组成:ActionScript虚拟机(AVM)和渲染引擎。要显示内容,先由AVM创建显示对象、再由渲染引擎将其显示在屏幕上。

例如,要将一个文本框显示在屏幕上,先使用new关键字来创建TextField类的实例,这个工作是由AVM处理;然后用addChild方法将这个实例显示在屏幕上(由渲染引擎处理)。

继续阅读《ActionScript 3.0 Cookbook》读书笔记6.1-关于Display List

《ActionScript 3.0 Cookbook》读书笔记1.3

管理事件

在ActionScript2.0中,我已经习惯使用addEventListener()来为V2版组件添加事件处理器。同时也习惯了使用EventDispatcher来发布事件。没想到ActionScript 3.0已经把addEventListener作为标准的事件机制了。这真是个好消息。

ActionScript 3.0使用flash.events包把所有的事件类集中在一起。例如,enterFrame事件被放在flash.events.Event类中;鼠标事件被放在flash.events.MouseEvent类中;键盘事件则被放在flash.events.KeyboardEvent类中,等等。

现在,要使用ActionScript 2.0时代的onEnterFrame事件,需要这么写:

//构造类...
import flash.events.Event;
//其他代码...
addEventListener(Event.ENTER_FRAME, onEnterFrame);
//其他代码...
private function onEnterFrame(event:Event) {
//处理代码
}

当然,事件管理函数名称倒不一定必须是“onEnterFrame”。至于鼠标事件和按键事件,使用方法也都差不多。Adobe把所有的事件都集中在一个包中管理,并且全部用常量来描述事件名称,确实比原来松散的管理方式要方便许多了。

继续阅读《ActionScript 3.0 Cookbook》读书笔记1.3

《ActionScript 3.0 Cookbook》读书笔记1.2-关于trace()

关于trace()

由于不是在Flash IDE中进行编辑,在调试程序过程中,如何获取trace()的值是一个问题。目前主要有两个方法:

1、利用Debug版本的Flash Player+mm.cfg

首先确认自己的Flash Player是Debug版本,然后用记事本建立一个mm.cfg文件,写入以下内容:

TraceOutPutFileName=C:\Documents and Settings\{your name}\Application Data\Macromedia\Flash Player\Logs\flashlog.txt
ErrorReportingEnable=1
TraceOutputFileEnable=1
MaxWarnings=0

然后保存在“C:\Documents and Settings\{your name}\”下即可。当在浏览器中打开swf文件时,所有的trace内容都会被写入到flashlog.txt中。
其中的几个参数的意义分别是这样的:

继续阅读《ActionScript 3.0 Cookbook》读书笔记1.2-关于trace()

《ActionScript 3.0 Cookbook》读书笔记1.1

《ActionScript 3.0 Cookbook》(下载)的确是一本AS3入门的好书,今天开始把学习心得写出来把。

其他的关于本书的读书心得

书中目前推荐的学习AS3的平台是使用Flex Builder 2,这是一个非常优秀的开发平台(当然价格也不菲),可以在Adobe官方网站下载试用版。

如果不使用Flex Builder 2,则可以直接用Flex SDK 2进行开发,它是免费的(Flex Builder 2已包含Flex SDK 2)。

编译AS3程序可以用Flex SDK 2中的mxmlc,也可以直接用Flex Builder 2编译。不过就我看来,还是用前者比较好,因为我的计算机配置较差(815EPT C1.2G 512MBPC133),在使用Flex Builder 2编译时经常会消耗掉400MB以上的内存,整个系统犹如死掉一样,编译完成之后占用的内存也很难释放。而mxmlc编译的速度明显要快一些,编译完成后会立刻释放占用的内存。

将as编译成swf,其实很简单,只需要使用下面的语法即可:

继续阅读《ActionScript 3.0 Cookbook》读书笔记1.1