AS3 动态改变对象的图像
AS3 Dynamically change image of object
如何更改已创建对象的图像
假设我有一个名为 Icon 的空 class,在运行时我想将它的图像更改为某种东西并将其添加到舞台上。图像可以作为另一个对象来自库,也可以只是位图。
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 上做这样的事情?
Let's say I have an empty class named Icon and on runtime I want to
change its image to something
在编写代码之前,请确保您已按照这些示例步骤进行了准备...
1) 打开Library (ctrl+L) 并右击选择"create new symbol" MovieClip 类型并命名为Icon 然后查看下方的 高级 选项卡...
2) 勾选名为 "Export For ActionScript" 的方框,这将自动填充名为 Class 的方框,其中的文字为 Icon。单击“确定”即可。
3) 将一张或两张图片添加到图库中,然后右键单击选择 "properties",然后再次像步骤 (2) 在 linkage 部分勾选 "Export for AS" 选项并给出一个您希望稍后通过代码输入的名称。我们假设您选择了 Pic1 和 Pic2 这样的名称。还要注意这些位图的 "base Class" 是 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
}
}
将图标(图像文件)添加到您的库后,将它们转换为 MovieClip 并像这样设置它们的 AS 链接,例如:
例如,您可以使用 Sprite
对象将您的图标加载到 Icon
class 实例中,您的 Icon
class 可以是像这样,例如:
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);
}
}
}
然后在你的主代码中,你可以使用 class :
import Icon;
var icon:Icon = new Icon(PHPIcon);
addChild(icon);
然后要更改图标,您只需调用 changeIcon()
函数:
icon.changeIcon(JSIcon).
编辑:
如果您不想调用 addChild()
将您的 Icon
class 实例添加到它的父容器中,您的 Icon
class 例如可以是这样的:
public function Icon(container:DisplayObjectContainer, IconClass:Class): void
{
container.addChild(this);
_icon = new IconClass();
addChild(_icon);
}
然后举个例子
var icon:Icon = new Icon(this, PHPIcon);
希望能帮到你。
感谢,现在我终于有了基础 class 可以用于未来的项目,我也使用 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);
}
}
}
如何更改已创建对象的图像
假设我有一个名为 Icon 的空 class,在运行时我想将它的图像更改为某种东西并将其添加到舞台上。图像可以作为另一个对象来自库,也可以只是位图。
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 上做这样的事情?
Let's say I have an empty class named Icon and on runtime I want to change its image to something
在编写代码之前,请确保您已按照这些示例步骤进行了准备...
1) 打开Library (ctrl+L) 并右击选择"create new symbol" MovieClip 类型并命名为Icon 然后查看下方的 高级 选项卡...
2) 勾选名为 "Export For ActionScript" 的方框,这将自动填充名为 Class 的方框,其中的文字为 Icon。单击“确定”即可。
3) 将一张或两张图片添加到图库中,然后右键单击选择 "properties",然后再次像步骤 (2) 在 linkage 部分勾选 "Export for AS" 选项并给出一个您希望稍后通过代码输入的名称。我们假设您选择了 Pic1 和 Pic2 这样的名称。还要注意这些位图的 "base Class" 是 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
}
}
将图标(图像文件)添加到您的库后,将它们转换为 MovieClip 并像这样设置它们的 AS 链接,例如:
例如,您可以使用 Sprite
对象将您的图标加载到 Icon
class 实例中,您的 Icon
class 可以是像这样,例如:
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);
}
}
}
然后在你的主代码中,你可以使用 class :
import Icon;
var icon:Icon = new Icon(PHPIcon);
addChild(icon);
然后要更改图标,您只需调用 changeIcon()
函数:
icon.changeIcon(JSIcon).
编辑:
如果您不想调用 addChild()
将您的 Icon
class 实例添加到它的父容器中,您的 Icon
class 例如可以是这样的:
public function Icon(container:DisplayObjectContainer, IconClass:Class): void
{
container.addChild(this);
_icon = new IconClass();
addChild(_icon);
}
然后举个例子
var icon:Icon = new Icon(this, PHPIcon);
希望能帮到你。
感谢,现在我终于有了基础 class 可以用于未来的项目,我也使用 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);
}
}
}