AS3嵌入图像类,然后将这些图像放到另一个类中?

use*_*346 5 air embed image actionscript-3

例如,现在我有一个名为"Balls.as"的类.在这里,我加载了10个不同的球图像.你知道,像这样:

[Embed(source = "/ball1.png")]
[Embed(source = "/ball2.png")]
Run Code Online (Sandbox Code Playgroud)

问题是,如果我产生5个球,这些球的图像会被嵌入5*5次吗?如我错了请纠正我!所以我可以,我不能有一个ballimageloading类吗?加载这些图像一次,然后在Balls.as我可以加载我想要的任何球吗?

Gio*_*Gio 10

最好的做法是有一个Assets包含静态嵌入图像的类,如下所示:

[Embed(source="ball1.png")]
public static var BallImage1:Class;
Run Code Online (Sandbox Code Playgroud)

然后你要做的就是为你的加载声明一个变量Bitmap并使用它,如下所示:

protected var mBall1:Bitmap = new Assets.BallImage1() as Bitmap;
Run Code Online (Sandbox Code Playgroud)

这将创建已Bitmap加载图像的实例,然后您可以将其添加到显示列表中.每张图片只会加载一次,您可以轻松获得所有图片,可以从您拥有的每个课程中访问.


cha*_*iik 10

您不需要"加载"它们,它们是嵌入式的.你只需要实例化图像.有一个管理共享资源的类是个好主意,如下所示:

public class TextureAssets 
{
    [Embed(source = "../lib/ball1.png")]
    private static var Ball1:Class;

    [Embed(source = "../lib/ball2.png")]
    private static var Ball2:Class;

    public static var ball1Texture:BitmapData;
    public static var ball2Texture:BitmapData;

    public static function init():void
    {
        ball1Texture = (new Ball1() as Bitmap).bitmapData;
        ball2Texture = (new Ball2() as Bitmap).bitmapData;
    }
Run Code Online (Sandbox Code Playgroud)

然后,你会调用TextureAssets.init()一次(在Main.as例如),当你需要的位图数据:使用new Bitmap(TextureAssets.ball1Texture)
这种方式,你的程序需要使用只需要一个位图数据,而不是有许多这最终是相同的内存.
如果您需要在保留原始内容的同时对bitmapData执行操作,您可以使用:

var modified:bitmapData = TextureAssets.ballTexture.clone();
Run Code Online (Sandbox Code Playgroud)


此外,如果要从一个类中实例化所有球图像,最好删除静态访问,而是在构造函数中初始化bitmapDatas,创建一个新的TextureAssets()并通过变量调用纹理
(静态字段访问比直接(.)访问:http://jacksondunstan.com/articles/1690)

  • @Gio:主要的一点是,如果要共享相同的图像并保持不变,则将bitmapData构建一次.上面的代码为每次调用'var mBall1:Bitmap = new Assets.BallImage1()创建一个新的bitmapData对象作为Bitmap;' 如果user1941346在从显示列表中删除它或丢失引用之前没有调用mBall1.bitmapData.dispose(),则会导致内存泄漏.除了每次构建新的bitmapData的成本之外,对于100次调用,还有aprox的差异.对于64x64 png,500 kb,与上述方法的aprox 100 kb相比. (2认同)
  • 只有在需要"修改bitmapData"(如颜色转换或过滤器)以保留原始内容时,我才给出克隆示例. (2认同)