0

我想在预加载器的背景上显示带有 alpha 通道的图像,用于带有 haxe nme 的闪存目标。当涉及到预加载器时,这种需求似乎很常见。

我找到了几种可能的方法来做到这一点,但其中任何一个都没有运气。由于我创建了一个继承默认 NMEPreloader 的自定义 Preloader 类,因此我所有的跟踪和错误都在这个类中。

方法 #1 - nme.Assets 方法 - 运行时错误

我尝试调用Assets.loadBitmapData("assets/img/miniMoon.png")Preloader 的构造函数。运行时发生错误:

[Fault] exception, information=ArgumentError: Error #2015: Invalid BitmapData.

使用调用堆栈:

flash.display::BitmapData/ctor
flash.display::BitmapData
NME_assets_img_minimoon_png1 at H:\MWHx\export\flash\haxe\ApplicationMain.hx:2053
Type$/createInstance at C:\Motion-Tween\haxe\std\flash\_std\Type.hx:136
nme.installer::Assets$/getBitmapData at H:\MWHx\export\flash\haxe\nme\installer\Assets.hx:721
Preloader at H:\MWHx\source\Preloader.hx:55
...

我想知道 nme.Assets 类是否可以在预加载期间使用。

Method #2 Embed in Flash Way - 不透明渲染

通过使用嵌入不是 NME 的青睐,我已经尝试过这个:

@:bitmap("assets/img/miniMoon.png") class BDmoon extends BitmapData {}
...
var moon:Bitmap;
...
moon = new Bitmap(new BDmoon(32,32,true,0x00000000));

它只是运行,但显示的图像不透明,所有具有 alpha 0 的像素都在背景下呈现为白色。

作为进一步的测试,我使用moon.alpha = 0.5;then I can see through the image。所以这可能是在嵌入 nme 期间丢失 alpha 通道值的问题。

带有小动画或小游戏的预加载器会很有趣。我希望有一个解决方案。谢谢!

参考: NME论坛主题:嵌入透明PNG图像

4

2 回答 2

0

问题是

new BDmoon(32,32,true,0x00000000)

最后一个0x00000000表示用黑色填充透明区域的颜色。将其更改为

new BDmoon(32,32,true)

你可以使用这个Assets类。

Assets.loadBitmapData("img/miniMoon.png")

assets即,从路径中省略文件夹。

于 2013-05-01T06:33:54.047 回答
0

抱歉,这是我自己的图像文件的问题!

因为我不知道如何关闭这个愚蠢的问题以获得新的答案。我在这里提出了一个干净的解决方案。

如果你想在预加载器中使用图像,这是我的代码。在 NME 3.5.5 下测试。

 @:bitmap("assets/img/miniMoon.png") class BDmoon extends nme.display.BitmapData{}

class MyPreloader extends NMEPreloader 
{
    public var embedBmp:nme.display.Bitmap;
    public var bmpFromAssets:nme.display.Bitmap;

    public function new(){
        super();

        embedBmp = new nme.display.Bitmap(new BDmoon(64, 64, true));
        addChild(embedBmp);

        // Line below cause problem, nme.Assets not ready in preloader
        bmpFromAssets = new nme.display.Bitmap(Assets.getBitmapData("assets/img/miniMoon.png"));
        addChild(bmpFromAssets);
    }

    public override function onLoaded()
    {
        // dispatchEvent (new Event (Event.COMPLETE));
    }
}

参考:http ://haxeflixel.com/forum/help/nme-355-preloader-flash-error

于 2013-05-06T03:55:27.267 回答