About

<#TEMPLATE_INCLUDE_NINEPAGE_ABOUTME#>
  • May

    29

    在ActionScript编程过程中,很多时候一维数组无法满足复杂的数组结构。在C#之类的某些传统编程语言中,可供选择的还有二种数组结构:嵌套数组(Nested Array)或者多维数组(Multi-Dimensional Array)。

    所谓的嵌套数组就是数组里面的元素还可以是数组,由于数组中每个元素数组并不要求自己的元素个数相同,所以结构在模型上看起来像是参差不齐的锯齿状,故而也称为齿状数组(Jagged Array);而多维数组则是数组的每个元素中的元素数量还是相等的,如二维数组则行元素和列元素的数量必须一一对应,三维数组除了行和列之外还有深度元素在数量上的一一对应。

    More...

    May

    24

    古语云:知之者不如好之者,好之者不如乐之者。所以无论学什么,快乐是第一位的,一定要能从学习中体会到快乐,所以感兴趣是很重要的。本文送给从零基础开始学FLASH编程的人员,如果你已经熟练了ActionScript或其它编程语言的,也请对FLASH初学人员鼓励,我们每个人都有可能是这么过来的。

    在很多和FLASH相关的网站或论坛里,都能看到一些类似的问题,如何学好FLASH或学好ActionScript,大多回答是“自学”或“看书”,事实上也只能自学和看书,因为到现在为止还没有见过哪个学校专门有设立Actionscript语言教程的,一般最多也就是多媒体课程或网页设计等相关的课程,并不会特别深入的讲解ActionScript编程。我也看到过许多的FLASH高手写过的如何学好FLASH等的建议和意见,大多建议和意见本人都表示赞同,但本人也想写写我的建议,顺便也推荐一些好书。

    More...

    May

    18

    在AS3的事件流应用过程中,会出现一些冒名奇妙的事情,但很多网站、很多教程上都没有介绍这些不是BUG的BUG是如何产生的,其实与下面二个重要的应用知识有关。

    一、显示层次结构改变与事件流:
    被通知某事件的事件对象列表顺序,是先于事件调度之前被确定的。也就是说:一个事件调度开始至这个事件调度结束,所有事件流经过的对象显示层次结构即便是被修改了,事件流经过对象的过程还是保持不变(附:事件流过程不变,但事实上显示结构层次已经变了)。如,当一个显示对象的子对象在事件流过程中被父对象的监听器从显示列表中移去,哪怕是被删除引用,事件流还是会经过子对象,如果子对象上存在监听器,它的监听器还是会被继续执行。

    二、事件监听器列表固化:
    在一个事件流过程中,事件被传送到每一个对象时,该对象的监听器列表将被固化,不可改变,如:在当前对象捕获阶段的监听器中给当前对象继续添加一个监听器,将会无效,但他会在后面的事件流中生效,如添加一个冒泡阶段的监听器。事件被传送到每一个对象时,该对象的监听器列表虽然被固化,但它并不固化事件流中子对象的监听器列表,仍然可以使用当前对象的监听器移除或添加子对象的监听器,并且在事件流到达子对象时,监听器有效,监听器列表在到达子对象时也是被固化的。 
     

    More...

    May

    18

    [AS3]在AS3中root的安全引用

    • 0 Comments
    • Flash Platform

    在ActionScript1和2中,经验丰富的编程人员总是尽量的避开使用绝对路径,而使用相对路径。因为_root变量的引用是不安全的,它始终指向当前FLASH播放器中当前文档级SWF文件的主场景。最常见的情况就是当一个文件被另一个文件加载时就会出现这种不安全的引用指向。

    然而在ActionScript3中,root不再是全局变量。显示对象类实例变量root是一个安全的引用。如下演试代码,在一个新建的FLASH空白文件App.fla中实例化一个ActionScript应用程序,类文档代码如下:

    package {
        import flash.display.*;
        import flash.geom.*;
        public class App extends Sprite {
            public function App() {
                var rect:Shape=new Shape();
                rect.graphics.lineStyle(1);
                rect.graphics.beginFill(0xffffff,1);
                rect.graphics.drawRect(0,0,55,50);
                var sprite:Sprite=new Sprite();
                sprite.addChild(rect);
                addChild(sprite);
                trace(rect.root);
                trace(sprite.root);
            }
        }
    }

    再将发布生成的App.swf文件加载到另一个FLASH空白文件load.fla中,代码:

    var loader:Loader = new Loader();
    loader.load(new URLRequest("App.swf"));
    stage.addChild(loader);

    在测试影片load.swf时就可会发现输出:

    [object App]
    [object App]

    而不是:

    [object Stage]
    [object Stage]

    这说明在AS3中root是一个安全引用,它没有因为父显示对象的改变而改变引用。
     

    在ActionScript1和2中,经验丰富的编程人员总是尽量的避开使用绝对路径,而使用相对路径。因为_root变量的引用是不安全的,它始终指向当前FLASH播放器中当前文档级SWF文件的主场景。最常见的情况就是当一个文件被另一个文件加载时就会出现这种不安全的引用指向。

    然而在ActionScript3中,root不再是全局变量。显示对象类实例变量root是一个安全的引用。如下演试代码,在一个新建的FLASH空白文件App.fla中实例化一个ActionScript应用程序,类文档代码如下:

    package {
        import flash.display.*;
        import flash.geom.*;
        public class App extends Sprite {
            public function App() {
                var rect:Shape=new Shape();
                rect.graphics.lineStyle(1);
                rect.graphics.beginFill(0xffffff,1);
                rect.graphics.drawRect(0,0,55,50);
                var sprite:Sprite=new Sprite();
                sprite.addChild(rect);
                addChild(sprite);
                trace(rect.root);
                trace(sprite.root);
            }
        }
    }

    再将发布生成的App.swf文件加载到另一个FLASH空白文件load.fla中,代码:

    var loader:Loader = new Loader();
    loader.load(new URLRequest("App.swf"));
    stage.addChild(loader);

    在测试影片load.swf时就可会发现输出:

    [object App]
    [object App]

    而不是:

    [object Stage]
    [object Stage]

    这说明在AS3中root是一个安全引用,它没有因为父显示对象的改变而改变引用。
     

    May

    3

    有很多教程中,包括很多书上都写了实例化对象时,需要new加构造函数的方式。由于类名和构造函数名是一样的,很难说它后面跟的到底是构造函数名还是类名。其实按我的理解应该是类名,而不是构造函数名。因为构造函数的本质是函数,而调用函数必须有括号操作符。而实事上在我们实例化对象时,如果一个类的构造函数没有要求参数的话,实事上可以将括号操作符省略掉的,如果是函数的话,就不可以省略掉了。详细代码如下演示:

    如实例化一个对象普通情况的代码: 

    new ClassName(value);

    如果它没有必须参数value,那么它就是直接写上括号操作符就可以: 

    new ClassName();

    但事实上,在没有参数的情况下,实例化对象不写括号也是可以的: 

    new ClassName;

    所以,在实例化时,new操作符后跟的是类名,而不是构造函数名。只是当有类名后面有参数的时候,这些参数传递给了构造函数。