分享

【转】关于“为Actionscript导出”与“在第一帧导出”

 qzyy 2014-12-25
关于“为Actionscript导出”与“在第一帧导出”

转自:http://blog.163.com/jays_ljj/blog/static/213606229201306078343/


在fla文件的库里,每个元件(确切地说是按钮和影片剪辑)的属性面板中,都有“Actionscript导出”和“在第一帧导出”两个选项。一直都不知道这两个选项是什么意思,只知道在某些时候需要勾选这两项,具体是什么时候也不得而知,只是将就着用了。现在,是时候深入了解这两个选项了。

这两个选项之间的关系

勾选“ActionScript导出”项后,“在第一帧导出”项才变成可选。也就是说,只有需要“导出”时,才需要考虑 “在第几帧导出”。

什么时候才需要勾选“为ActionScript导出”选项?

我们在fla文件的库中存放按钮和影片剪辑这些元件,然后把按钮和影片剪辑拖放到动画的各个帧上。这可以看做是按钮和影片剪辑实例化的过程。

除了通过“拖放”来实例化库中的元件以外,有时候,我们需要在ActionScript代码中动态地实例化这些元件。这时,元件的“为ActionScript导出”选项就派上用场了。

究竟导出什么了?

导出的当然是可以在ActionScript中使用的类了。可以这么理解:我们把元件导出成一个类,这个类的类名和基类是我们自定义的。实例化这个导出的类,就相当于实例化该类对应的元件了。

勾选元件的“为ActionScript导出”选项后,会看到如下界面。我们在这里自定义导出的类的名称和基类。然后,我们就可以在ActionScript代码中通过这个类名访问这个类了。

顺便提一下,图中的“标识符”在ActionScript3中已经不再使用。

关于flash中的为Actionscript导出与在第一帧导出选项意思转自:http://bbs./blog-119354-16309.html - jaysljj - jaysljj的博客

“导出”选项对编译的影响

需要澄清的一点是,勾选了这个选项后,并不意味着此元件和它对应的类文件一定会被编译到swf文件里。因为“类只有被用到,才会被编译”。比如说,你把某元件导出成一个类,但是在你的fla文件中并没用到该类,那这类和对应的元件都不会被编译到swf文件中。这和import语句有点类似,import了某个类,但是又没有使用这个类,那这个类也是不会被编译到swf文件中的。关于编译,后面再细说,我们回到刚才的主题。

自定义导出的类的名称和基类

即使不填写导出类的名称,编译时也不会出错。Flash IDE会自动创建一个不知名的类(扩展自指定的基类)。既然不知道类名,也就没有办法在ActionScript代码中访问这个类了。所以,勾选了“为ActionScript导出”选项,又不填写类名的做法是没有意义的。

如果填写了导出类的名称,但是此名不指向任何实际存在的类,编译也不会出错。Flash IDE会自动创建一个类(扩展自指定的基类),类名就是我们填写的名称。既然有了类名,我们就可以在ActionScript代码中使用这个类了。

如果填写的名称不符合类名规范(例如使用中文),编译时也不会出错。Flash IDE处理的方式估计和不填写名称类似。

如果导出类的名称指向一个实际存在的类,那实例化的就是这个实际存在的类了。可以把该类看做是元件的“文档类”。

至于基类,如果导出的是影片剪辑,则它的默认基类是MovieClip,如果导出按钮,则它的默认基类是SimpleButton,如果导出的是字形,默认基类是Font。你可以将基类改成这些默认基类的子类如(MyMovieClip、MySimpleButton、MyFont),也可以改成默认基类的祖先类(没啥意义)。如果填入的基类名称不符合要求,Flash IDE会将基类自动纠正回默认基类。

编译

关于编译,上面提到过“只有被用到,才会被编译”。还有一句,“只有被编译,才能被使用”。

先解释一下怎样才叫“被用到”。以下的这些都是“被用到”的实例。

l 元件被拖到场景时,此元件导出的类就“被用到”了。

l 在ActionScript代码中实例化某类,那这个类也“被用到”了。

l 在ActionScript代码中,尝试访问某类的引用,那这个类也“被用到”了。

在应用程序中,往往会有一些这样的类:在应用程式初始化时,不会用到这些类。当应用程序运行到某个阶段,或者用户进行了某个操作后,才会用到这些类。这样的类在初始化时,就应该被编译到swf中,供以后使用。

怎样才能把这些类强迫编译到swf文件中呢?很简单,强迫这些类 “提前被用到一下”就可以了。下面的操作任选其一即可:

l 将类对应的元件拖一个到场景中,把它放在视窗范围之外。

l 在ActionScript代码中New 个实例出来。(不需要添加到DisplayList中)

l 在ActionScript中引用一下类名,如trace(ClassName)。

这些办法都是可以的,但是问题是太不优雅了。上面的操作其实都是和应用程序无关的,很容易被误解或误删。特别是那些有洁癖的Code,肯定是接受不了这样的做法。还好Flash IDE有比较优雅的办法,那就是“在第1帧导出”选项。

“在第1帧导出”选项

先说明两个问题:1:这里说的第1帧是在哪个时间轴上的?;2:干嘛非得在第1帧导出,在第N帧导出不行?

这里说的第1帧是在哪个时间轴上的?

分析如下:

1. 类的导出是全局性的,所以这里说的时间轴应该是全局性的时间轴;(比较牵强)

2. 如果说是某个MovieClip的时间轴,那在元件的属性面板中勾选该选项时,应该让我们选择对应的MovieClip啊。

3. 更不可能是父影片剪辑的时间轴了,因为一个元件可以实例化到N多父影片剪辑里,那究竟是在哪个镜片剪辑的第一帧导出呢?

通过以上3点,基本可以确定这里说的主场景的时间轴。

在第N帧导出行不行?

行的。在fla文件的属性面板中,点击“编辑Actionscript设置”按钮,打开“Actionscript 3.0 设置”面板,修改“导出帧中的类”的值即可。然后,你打开任意一个元件的属性面板,会发现“在第1帧导出”都变成了“在第【你修改的数值】帧导出”。不过这个值是全局的,一旦改了,会影响到所有的元件。不能实现元件A在第1帧导出类,而元件B在第2帧导出类。

关于flash中的为Actionscript导出与在第一帧导出选项意思转自:http://bbs./blog-119354-16309.html - jaysljj - jaysljj的博客

关于flash中的为Actionscript导出与在第一帧导出选项意思转自:http://bbs./blog-119354-16309.html - jaysljj - jaysljj的博客

该选项调整的是导出时间点

举个例子:如果你把某元件设置成在第2帧导出,那么在主场景指针没有走到第2帧之前,我们是访问不到该元件导出的类的。也就是说,该选项调整的是导出类的可访问时间点。导出的类当然是越早能访问到越好了,所以,设置成“在第一帧导出”是比较保险的做法。

上述例子,你可以在第1帧用getDefinitionByName(“ClassName”)函数进行验证。注意不能用trace(ClassName)函数验证,因为用该函数验证时,必须引用这个类,而引用这个类即表示该类被提前“用到了”,那该类就会提前被导出了,你在元件属性面板中设置的数字就不起作用了。

在不同的帧导出会影响编译的swf文件大小吗?

在第1帧导出和在第N帧导出编译成的swf文件大小是有差别的,但是差别不大。在我做的试验中,只有几百字节的差别,而且“在第一帧导出”编译出来的文件比在“在第N帧导出”编译出来的文件要小。

问题又来了。既然在“在第1帧导出”既保险,生成的文件又小,那还有“在第N帧导出”什么事啊?Flash IDE提供这样的设置目的是什么呢?究竟在什么情况下才使用这个设置呢?

相关问题:“在第2帧导出”解决preloading问题

如果你把preloading写在当前文件的第一帧上(as2时代流行的做法),如果你的元件在第一帧导出太多的类,或者场景的第一帧上有太大的内容(图片、音频、视频),都会影响preloading的运行。问题的表现是:白屏,等待,然后加载进度不是从1%开始。

问题的原因是:帧代码在帧初始化完毕后才开始执行。如果场景的第一帧上有元件实例,那就需要加载元件和对应的类,才能实例化;如果在第一帧导入元件的类,那就需要加载元件和对应的类,这两种加载都会阻塞帧代码的执行。

解决办法:

1)不在当前文件实现加载,而是用一个空文件在加载当前文件。

2)第一帧只实现preloading,其他什么都不做。把所有的元件设置为第二帧导出,然后在第二帧及后续帧实现动画。


在第一帧导出 loading久久不出来,
有时我们做flash的loading效果,可能会发现在实际使用时,loading久久不出来,直到整个swf差不多加载完了才出来.这通常是因为没有取消"在第一帧导出"造成的. 
 
解决的办法是把所有勾了"在第一帧导出"的元件的勾去掉,然后用一个元件装着放到场景中的loading元件后面(说乱了我语文比较差的不好意思...有什么问题的可以在后面发表评论时问,或是直接加我qq:358315553...反正我做flash游戏时,主场景的第一帧是放loading效果的,第二帧是放一个元件叫 "all_mc" ,里面放刚才说的 取消"在第一帧导出"的所有元件 ,然后第三帧才是真正的游戏内容).
  然而问题也来了,一般一个中小型游戏,都会有好多个这样被勾了"在第一帧导出"的元件,要是手动改的话,不仅慢,而且容易漏,这时我们请出今天的主角: 处理第一帧导出的所有元件.jsfl .
  原理很简单,就是新建一个叫 "all_mc" 的元件,然后遍历元件库,把所有勾了"在第一帧导出"的勾去掉,然后放到 all_mc 里.

在Flash中使用预加载的注意事项

热度 1已有 563 次阅读2012-9-10 21:27 |个人分类:flash| 能够详细信息FlashAdobe

本文包含在Adobe Flash Professional中如何使用预加载(preloader) 的详细信息,这样你能够配置项目以便更有效地显示内容,并且能够让用户了解SWF加载(SWF-loading)的进程。

预加载(preloader)的设计宗旨是在以后台方式加载SWF内容的同时进行显示。 它们通常是能够吸引用户注意力并且能够提供较好播放画面的动画图形,而不是让用户盯着一个空白的屏幕,而不知道究竟发生什么事情。

在某些情况下,预加载(preloader)还能设置为显示一个进度条,或者一个能够表明已加载内容量的数值。 这种反馈信息是很有用的,这是因为用户能够了解加载进程何时完成。

避免常见预加载(preloader)错误

下面的两种情况会妨碍预加载(preloader):

  • 如果任何类被设置在Frame 1上进行导出,那么预加载(preloader)均不会显示,直到该类加载完毕。
  • 如果任何组件被设置在Frame 1上进行导出,那么预加载(preloader)均不会显示,直到该组件加载完毕。

请按照下面这些步骤来解决上述问题:

  1. 在Library面板中,右击每一个组件。 在显示的菜单中,选中Properties选项。
  2. 在Symbol Properties对话框中,取消选中Frame 1上的Export选项。 单击OK。
  3. 选中File > Publish Settings。 找到顶部附近的ActionScript版本菜单。 在该菜单的右侧,单击ActionScript settings按钮(扳手图标)。
  4. 在ActionScript Settings对话框中,在Export classes in frame字段中输入2,而不是在Frame 1上导出这些类(参见图1)。
图1. 在ActionScript Settings中,在Frame 2上,而不是在Frame 1上设置需要导出的类

注:每当为你的项目添加第三方预加载(preloader)时均需要使用注意事项。 请花一点时间阅读相关的代码和注释(如果存在的话)以便全面了解相应代码逻辑。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多