谢谢大家支持,我争取写详细点。游戏=图像处理层+逻辑处理层。图像显示方法、技巧很多。这个超级玛丽就用了一种(别的不会),BitBlt“去背”。
先说图像资源。每个游戏元素对应多帧图像,所有帧排成一行。各个游戏元素的图像从上至下排列。理论上,可以把所有元素,无论大小,全放到一张位图里。把这张“总图”,放到一个HBITMAP里,只需要按照游戏逻辑层的四个参数,即可完成显示工作,函数如下:
void MYANIOBJ::DrawItem(int x,int y,int id,int iframe)
横纵坐标,图像ID,图像帧。我想在下一个版本增加透明度alpha,大家给点帮助。
说一下“去背”,大部分元素都是不规则图形,BitBlt是按矩形绘制。怎样要把周围的背景区域去掉?这个游戏用的是最简单的方法。制作一个白底黑图的MASK图,原有图形的背景区域填成黑色。两次BitBlt:
BitBlt(hdcdest,x,y,wlist[id],hlist[id], hdcsrc, iframe*wlist[id],ylist[id]+hlist[id],SRCAND);
BitBlt(hdcdest,x,y,wlist[id],hlist[id], hdcsrc, iframe*wlist[id],ylist[id],SRCPAINT);
第一次用SRCAND的方式绘制MASK图,由于黑色是(0,0,0),与操作,表示图案的区域就? 闪撕谏话咨牵?xff,0xff,0xff),与操作,表示背景的区域不受影响。第二次用SRC PAINT,或操作,刚才图案的区域是黑色,与彩色的图案相“或”,彩色图案正常显示。背? 扒? 与黑色相或,仍然不变。由于从逻辑层接受的是图像ID,没有宽高信息。所以,在加载图像 资源的时候,要确定每个图像的宽高,显然,只能手工指定了。由一个全局变量负责: int mapani[3][5]={ {32,32,64,32,32}, {32,32,64,32,32}, {0,64,128,256,320},};
这个数组还可以优化,第一行是宽,第二行是高,第三行是起始纵坐标(每个元素都是从上至下排列)。初始化的时候,很简单:
bmAniObj.InitAniList(mapani[0],mapani[1],mapani[2],sizeof(mapani[0])/sizeof(int));
HBITMAP的初始化也简单: hBm=LoadBitmap(hInstance,MAKEINTRESOURCE(iResource));
实际的代码结构、类层次、参数有点冗余,下一个版本优化。至此图像的初始、图像的各个 属性设置,显示方法都完成了。它的横纵坐标,图像ID,图像帧需要逻辑层处理,下次再讲逻辑层的操作。