好久没更新了~~今日圣诞节~~分享画PNG透明的方法

这几个星期都在完善飞机游戏,今天收到Xer的新UI哈哈,正在写橡皮筋算法~

 

昨天调通了OpenGLES,这玩意可真是麻烦的要命啊,各种初始化~~~不过M8的支持还可以了。

 

另外说个画带边缘透明的PNG的方法~~我试了好几天啊。。。。。

 

所谓带透明的PNG,就是指那些有的地方透明,有的 地方不透明的图片,也就是无底PNG

 

传统做法是ddraw设置关键色,然后图片要透明地方做关键色处理,但是这样出来的图片毛边特多~不美观

 

以前我写过一个用BitBlt画透明图片,效率不是很高,今天讲一个高效的处理方法~~

 

 

那就是AlphaBlend+DDraw+ImagingHelper

首先要做的就是LoadImage

 

 ImagingHelper imMenu;

imMenu.LoadImageFromRes(MzGetInstanceHandle(),L"PNG",MAKEINTRESOURCE(IDB_PNG_MENU),true,false,true);

 

注意如下两点:

1,imMenu最好保存起来,等程序结束再释放,因为一会要用他做文章。

2,LoadImageFromRes的倒数三个参数必须为true,false,true,其意义为拷贝到内存,不自动释放,加载自定义通道。

 

然后要做如下画图函数

 

 BLENDFUNCTION bf;
bf.BlendOp   =   AC_SRC_OVER;  //目前只有这个
 bf.BlendFlags   =   0;   //保留位,目前只有这个
 bf.AlphaFormat   =   AC_SRC_ALPHA;   //这个参数是指定加载自带Alpha通道
 bf.SourceConstantAlpha   =   255; //如果上面用了自带通道,那这个值就没意义

pDDSurface ->GetDC(&hDC);//这个surface就是background 的surface

 AlphaBlend(hDC,505,128,165,83,imMenu.GetDC(),505,128,165,83,bf);

 pDDSurface ->ReleaseDC(hDC);

其速度比DDraw去关键色快很多,而且又能做很好的特效,我试验过

 

这里讲一下原理:在M8中24位PNG是自带alpha通道的,所以做一张透明底的png,然后AlphaBlend到background的surface上就会成功。

有些人试验后就会说,为啥我的画不出来,这个当时我也困惑了两天,其原因就是PNG 图片生成的问题~

这里讲一下生成的方法:(本想画图的,发现不会上传。。)

1.新建一个底色为透明色的PNG

2.图像-模式下面设置为8或者16位通道,32是不支持的。

3.画好图后文件-存储为web和设备所用格式

4选择PNG-24

好久没更新了~~今日圣诞节~~分享画PNG透明的方法_第1张图片

这样存下来的PNG 才能画的出来

另外注意原图如果不是24位,直接存为24位是无效的,必须稍微改一点点再存~这个困扰了好久。。。。。

 

 

不要怕效率,以前用ddraw去关键色画帧数当时是30,换了这个帧数到了40,不过这个模拟器上会慢很多~真机很快~~~~

 

下面就是所谓的边缘透明图,会看到是有阴影的~~~

 

 好久没更新了~~今日圣诞节~~分享画PNG透明的方法_第2张图片

 

 

 

 

你可能感兴趣的:(好久没更新了~~今日圣诞节~~分享画PNG透明的方法)