ActionScript - 动态向Sprite添加属性

时间:2010-09-25 15:35:03

标签: flash actionscript-3 dynamic properties sprite

我对以下问题感到非常困惑,并会对此表示感谢。

通常,我的工作方式是在Flash Authoring中设计我的所有图形,通过将基类更改为flash.display.Sprite将它们转换为Sprite符号,给出我的实例名称,最后将它们导出到ActionScript。

该方法实际上允许我在我导出到ActionScript的Sprite实例上的代码中动态创建属性,就像它们是MovieClip的实例一样。我不完全确定为什么我能做到这一点,但我可以。在轮询对象以确保它们的超类时,它们确实是Sprite,而不是MovieClip。

然而,正如预期的那样,如果我在代码中从头编写一个新的精灵并尝试动态地将属性添加到新的编程精灵中,将导致编译时错误。

package
{
import flash.display.Sprite;
import flash.utils.getQualifiedSuperclassName;

public class Document extends Sprite
    {
    public function Document()
        {
        trace(getQualifiedSuperclassName(blueOvalInstance));
        //flash.display::Sprite (it's not a MovieClip)

        trace(blueOvalInstance.hasOwnProperty("currentFrame"));
        //false (ok, ok, it's definately not a MovieClip)

        blueOvalInstance.myNewProperty = true;
        //dynamically added boolean property on a Sprite instance

        trace(blueOvalInstance.hasOwnProperty("myNewProperty"));
        //true.  fancy that!  my Flash Authoring exported Sprite has a dynamically added property

        codeSprite();
        }

    private function codeSprite():void
        {
        var myCodedSprite:Sprite = new Sprite();

        myCodedSprite.graphics.beginFill(0xFF0000);
        myCodedSprite.graphics.drawRect(0, 0, 100, 100);
        myCodedSprite.graphics.endFill();

        addChild(myCodedSprite);

        myCodedSprite.anotherNewProperty = true;
        //dynamically added boolean property on a Sprite instance, just like before!

        //Compile Time Error!!!

        //1119: Access of possibly undefined property anotherNewProperty through a reference with static type flash.display:Sprite.
        }
    }
}

那么为什么我可以动态地向我的文档类中的导出精灵添加属性,如果它们不是MovieClip,而我不能在代码中自己创建它们?

下图显示了一个新的BlueOval符号,该符号从Flash Authoring导出到ActionScript,基类为Sprite(不是MovieClip)。注意库面板中新的绿色(而不是蓝色)彩色“Movie Clip”图标。

alt text

2 个答案:

答案 0 :(得分:1)

您需要将类定义为动态类,以便在运行时添加属性。

查看此页面:http://flexmusings.wordpress.com/2008/07/23/actionscript-3-dynamic-classes-part-2/

答案 1 :(得分:1)

var myCodedSprite:Sprite = new Sprite(); myCodedSprite是一个密封类的对象,因此它不能在运行时添加属性。但是当你扩展这个类时,你可以在子类中添加自定义属性。