【问题标题】:how to make haxe nme preloader render bitmap with transparency如何使 haxe nme 预加载器渲染具有透明度的位图
【发布时间】:2013-04-22 13:11:20
【问题描述】:

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

我找到了几种可能的方法来做到这一点,但其中任何一种都没有运气。 由于我创建了一个继承默认 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 不喜欢使用 embed,但我已经尝试过:

@: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 通道值的问题。

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

参考: NME forum topic : Embed Transparent Png Image

【问题讨论】:

    标签: bitmap transparency preloader haxe nme


    【解决方案1】:

    问题是

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

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

    new BDmoon(32,32,true)
    

    您可以使用 Assets 类。

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

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

    【讨论】:

    • 第四个参数 0x00000000 实际上对于嵌入位图并不重要。因为每个像素甚至图像文件上的透明 0x0 都会替换填充颜色。无论哪种方式都有效!无论如何谢谢。
    【解决方案2】:

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

    因为我不知道如何用新的答案结束这个愚蠢的问题。我在这里提出了一个干净的解决方案。

    如果您想在预加载器中使用图像,这是我的代码。在 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-17
      • 2014-08-07
      • 2013-06-28
      相关资源
      最近更新 更多