我想在预加载器的背景下显示带有alpha通道的图像,用于具有haxe nme的flash目标。当涉及到预加载器时,这种需求似乎很常见。
我找到了几种可能的方法来做到这一点,但幸运的是他们中的任何一个。 由于我创建了一个继承默认NMEPreloader的自定义Preloader类,所以我的所有路径和错误都在这个类中。
方法#1 - nme.Assets方法 - 运行时错误
我尝试在Preloader的构造函数中调用Assets.loadBitmapData("assets/img/miniMoon.png")
。运行时出错:
[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类是否可以在预加载期间使用。
方法#2嵌入Flash方式 - 无透明渲染
由于使用嵌入不是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;
然后我可以看到图像。所以这可能是在嵌入nme期间丢失alpha通道值的问题。
带有小动画或小游戏的预加载器可以很有趣。我希望有一个解决方案。谢谢!
答案 0 :(得分:0)
问题是
new BDmoon(32,32,true,0x00000000)
最后一个0x00000000
表示用黑色填充透明区域的颜色。将其更改为
new BDmoon(32,32,true)
您可以使用Assets
类。
Assets.loadBitmapData("img/miniMoon.png")
即,从路径中省略文件夹assets
。
答案 1 :(得分: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