这几个星期都在完善飞机游戏,今天收到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 才能画的出来
另外注意原图如果不是24位,直接存为24位是无效的,必须稍微改一点点再存~这个困扰了好久。。。。。
不要怕效率,以前用ddraw去关键色画帧数当时是30,换了这个帧数到了40,不过这个模拟器上会慢很多~真机很快~~~~
下面就是所谓的边缘透明图,会看到是有阴影的~~~