【问题标题】:AS3 Dynamically change image of objectAS3 动态改变物体的图像
【发布时间】:2015-12-02 22:42:11
【问题描述】:

如何更改已创建对象的图像
假设我有一个名为 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 上做这样的事情吗?

【问题讨论】:

  • 你想用addChild(this)做什么?那行不通……

标签: actionscript-3 flash


【解决方案1】:

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

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

1) 打开Library (ctrl+L),右键选择MovieClip类型的“create new symbol”,命名为Icon,然后查看高级标签在下方...

2) 勾选名为“Export For ActionScript”的框,该框会自动填充名为 Class 的框,其中包含 Icon 文字。点击确定,您就准备好了。

3) 将一个或两个图像添加到库中,然后右键单击选择“属性”,然后再次像 链接 部分中的步骤 (2) 一样勾选“导出为 AS”选项并给出您希望稍后通过代码键入的名称。我们假设您选择了 Pic1 和 Pic2 等名称。还要注意这些位图的“基类”是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
}

但既然你说它可以是任何东西,有时是位图,有时是影片剪辑,那么在这种情况下你必须检查输入并相应地处理。

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
    }

}

【讨论】:

  • 是的 addChild 只会将对象添加到舞台,但我正在寻找的是一种更改对象本身图像的方法,或者这不可能吗?
  • 抱歉,我之前没有看到您的 Java 更新。通知让我上次看到你的评论。我已尽力帮助更新。
  • 这是非常有用的解决了使用不同类型对象的一些麻烦,但这仍然是一个非常复杂的功能,我想我以后必须弄清楚,希望有一个简单的方法来改变图像
【解决方案2】:

将图标(图像文件)添加到库后,将它们转换为 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);

希望能有所帮助。

【讨论】:

  • 如果您花时间对我的帖子投了反对票,您可以有几秒钟的时间来说明它为什么没用以及它的问题所在。我知道,说实话可能很难,但相信我,试试吧……
  • 我不知道谁对你的帖子投了反对票,但它确实有效,我需要的是非常简单的例子,我没有在我的问题中提供更多细节,但我想做的就是利用构造函数,而不是使用变通方法,例如我只输入new Icon(myIcon),构造函数负责其余的工作,现在剩下的唯一问题是我仍然需要从外部图标类添加另一个addChild。
  • @Waras 哦,不要在意否决票......关于addChild(),我编辑了我的答案,看看。
【解决方案3】:

最后感谢,现在我有一个基类可以在未来的项目中使用,我也使用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);
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-21
    • 2012-09-29
    • 1970-01-01
    • 2011-01-09
    • 2014-03-12
    • 1970-01-01
    • 2021-08-23
    • 2012-05-15
    相关资源
    最近更新 更多