繁体   English   中英

AS3动态更改对象的图像

[英]AS3 Dynamically change image of object

如何更改已创建对象的图像
假设我有一个名为Icon的空类,并且在运行时我想将其图像更改为某种图像并在舞台上添加它。 该图像可以来自库中的另一个对象,也可以只是位图。

var icon1 = new Icon(myIcon);
...

public class Icon extends MovieClip {
public function Icon(icon:Class) {
    //change image
    addChild(this);
}

编辑:在Java中,我曾经这样做:

new Icon(myIcon);
...

public class Icon {

public Image image;
public String icon;

public Icon(String icon) {

        ImageIcon ii = new ImageIcon(this.getClass().getResource(icon + ".png"));
        image = ii.getImage();
        this.icon = icon;
    }

在绘画方法上,我只需键入icon1.image即可在屏幕上显示,也可以根据需要通过访问此变量来更改图像。

在as3上可以这样做吗?

假设我有一个名为Icon的空类,并且在运行时我想将其图像更改为某种

在编写代码之前,请确保您已按照以下示例步骤进行了准备...

1)打开媒体 (ctrl + L),右键单击以选择MovieClip类型的“创建新符号”,并为其命名为Icon,然后在下面的“ 高级”选项卡中查看...

2)勾选名为“为ActionScript导出”的框,然后应使用名为Icon的文本自动填充一个名为Class的框。 单击确定,您已经准备好。

3)向库中添加一两个图像,然后单击鼠标右键以选择“属性”,然后像在链接部分中的步骤(2)一样,选中“导出为AS”选项,并提供一个您希望稍后通过代码键入的名称。 我们假设你选择喜欢PIC1PIC2名。 还要注意,这些位图的“基类”是bitmapData 这就是您更改以通过代码更新图像的数据。

因此,要通过代码动态更新...创建位图,并使用库中的任何bitmapData更新其像素数据。 就像是:

//# in your imports...
import flash.display.MovieClip;
import flash.display.Bitmap;    
import flash.display.BitmapData;
import flash.utils.getQualifiedClassName;
import flash.utils.*;

....

//# in vars declarations...
public var my_icon : Icon = new Icon ();
public var my_BMP : Bitmap;
public var str_Type : String = ""; //later holds library object type for checks

....

//# later in your code
stage.addChild(my_icon); //looks invisible since empty

my_BMP = new Bitmap; //create new instance
my_icon.addChild ( my_BMP ); //add the empty bitmap into Icon

change_Icon ( Pic1 ); //parameter can be Library's Bitmap or Movieclip 


制作change_Icon函数...

如果只保留位图(PNG文件?),则可以使用像这样的简单函数...

public function change_Icon ( in_Param : Class ) : void
{
    my_BMP.bitmapData = new in_Param as BitmapData; //replace pixels of existing bitmap container
}

但是由于您说的可能是任何东西,有时是位图或有时是MovieClip,所以在这种情况下,您必须检查输入并进行相应的处理。

public function change_Icon ( in_Param : * ) : void
{
    //# Check the input type and handle it 
    str_Type = String ( getDefinitionByName( String( getQualifiedSuperclassName(in_Param) ) ) );

    if ( str_Type == "[class BitmapData]" )
    {
        trace ( "this object is a Bitmap..." );
        my_BMP.bitmapData = new in_Param as BitmapData; //replace pixels of existing bitmap container
    }

    if ( str_Type == "[class MovieClip]" )
    {
        trace ( "this object is a Movieclip..." );

        var temp_MC = new in_Param();
        var temp_BMD : BitmapData = new BitmapData( temp_MC.width, temp_MC.height );

        my_BMP.bitmapData = temp_BMD; //assign data to this bitmap
        temp_BMD.draw (temp_MC); //update by drawing
    }

}

将图标(图像文件)添加到媒体库后,将其转换为MovieClips并设置它们的AS链接,例如:

例如,您可以使用Sprite对象将图标加载到Icon类实例中,其中Icon类可以是这样,例如:

package  {

    import flash.display.Sprite;

    public class Icon extends Sprite 
    {
        private var _icon:Sprite;

        public function Icon(IconClass:Class): void
        {
            _icon = new IconClass();
            addChild(_icon);
        }

        public function changeIcon(IconClass:Class): void 
        {
            removeChild(_icon);
            _icon = new IconClass();
            addChild(_icon);
        }

    }

}

然后在您的主代码中,可以使用该类:

import Icon;

var icon:Icon = new Icon(PHPIcon);
addChild(icon);

然后要更改图标,只需调用changeIcon()函数:

icon.changeIcon(JSIcon).

编辑:

如果您不想调用addChild()Icon类的实例添加到其父容器,则Icon类的构造函数可以像这样:

public function Icon(container:DisplayObjectContainer, IconClass:Class): void
{
    container.addChild(this);
    _icon = new IconClass();
    addChild(_icon);
}

然后就其实例

var icon:Icon = new Icon(this, PHPIcon);

希望能对您有所帮助。

终于谢谢了,现在我有了一个可以在将来的项目中使用的基类,我还使用了list所以我要做的就是调用new Icon(myIcon, x, y, this);

package  {

    import flash.display.Sprite;
    import flash.display.DisplayObjectContainer;

    public class Icon extends Sprite {
        public static var list:Array = new Array();
        private var icon:Sprite;
        private var n:int;

        public function Icon(IconClass:Class, x:int, y:int, container:DisplayObjectContainer):void {
            container.addChild(this);
            icon = new IconClass();
            n = list.push(this);
            addChild(icon);
            this.x = x; this.y = y;
        }
        public function changeIcon(IconClass:Class):void {
            removeChild(icon);
            icon = new IconClass();
            addChild(icon);
        }
        public function removeIcon():void {
            this.parent.removeChild(this);
            list.splice(n-1,1);
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM