读到本章前,读者或许会有一些疑惑:笔者将实体描述得很玄乎,可以构成游戏世界的基础,却丝毫没有提及到资源的应用。一个游戏能够离开图片资源而存在吗?答案是,当然不能。本文将介绍在ShinyNova中图片资源如何与实体结合工作。
PObject是一个纯粹的逻辑概念,仅能描述物体的性状而不包含任何资源信息,因此PObject本身是不可见的。BITObject与PlaneObject是PObject最重要的两个派生类,可以接受资源信息,并将其显示出来。
BITObject是图片引用实体,它能够显示内存中已经加载的图片资源,但不能对之进行更改,通常如下:
BITObject* bitObject;
SNG_PIC pic; //SNG_PIC是ShinyNova定制的图片描述结构,后章会有详细描述。
bitObject->LoadPic(pic);
BITObject的优点是大量重复使用时内存占用小,因为呈现同一张图片的多个BITObject指向的是同一段资源内存。缺点也很明显,就是无法修改图片内容,仅能调节显示的部位,大小和帧数。BITObject最常使用的函数是:
DWORD GoToFrame(WORD index); //跳到第几帧,返回该帧延迟
DWORD GoToFrameByLifeTime(DWORD time); //根据生存时间计算当前帧数
DWORD GoToNextFrame();
DWORD GetDelay(WORD index); //获取第几帧的延迟,返回该帧延迟
当BITObject加载了一个多帧图片时,可以使用该函数组来切换显示帧,这是ShinyNova引擎播放动画的基础。
PlaneObject是资源定制实体,它向系统申请指定大小的内存,并将该段内存代表的内容显示到屏幕上。PlaneObject的优点是像素级定制,其申请的空间必须是矩形,而该矩形上任意一个点的颜色分量,ALPHA值都可以由程序员指定。缺点是内存占用量相对较大,每一个像素需要占用4BTYE(B,G,R,A),内容重复的PlaneObject也需要申请相同大小的内存。PlaneObject同样可以通过void DrawPic(SNG_PIC& pic)函数显示已经加载到内存中的外部图片资源,其原理是将外部资源画到PlaneObject申请的这段内存中,但PlaneObject中不存在图片帧概念,如果想使用PlaneObject动态显示多帧图片,必须多次使用void DrawPic(SNG_PIC& pic)重绘。
PlaneObject非常重要的作用是文字书写。使用GDI开发时如果要在屏幕上显示文字,我们通常是调用TextOut直接画到背景CDC上。但在ShinyNova中,任何资源必须由实体来承载(桌面背景固然可以定制修改,但意味着必然位于画面的最底层)。而文字的承载实体只能是PlaneObject,相关函数如下:
virtual void SetTextColor(UINT color);
virtual void SetTextSize(int size,int weight=400,char *FontType="宋体");
virtual void SetSpace(int character,int row);
virtual void SetItatic(BOOL bnItalic);
virtual void SetUnderLine(BOOL bnUnderLine);
virtual void SetBesideLine(int leftline,int rightline);//设置边距 |lefline<正文>rightline|,注意是到左右边的距离
virtual void SetFontInfo(FONTINFO& font);
virtual void TextOut(int x,int y,LPCTSTR str);//以文字左上方为基准
virtual void TextOutEx(int x,int y,LPCTSTR str);//以文字中心为中心
virtual void AutoText(LPCTSTR str,int size=0,int leftline=0,int upline=0);
需要注意的是,TextOut与TextOutEx函数中的坐标是相对于PlaneObject左上角的坐标。
PlaneObject使用杨红(RGB(255,0,255))作为透明色,即如果该像素的颜色为杨红,那么该点是透明的。善用PlaneObject可以实现很多特殊的效果,如实现半透明膜,使背景颜色反转,色彩过滤等。如想实现更高级的PlaneObject应用,可以使用BYTE* GetPlaneData()获取实体所申请的内存。一个宽3像素高4像素的图片排列结构如下:
B G R A B G R A B G R A
B G R A B G R A B G R A
B G R A B G R A B G R A
B G R A B G R A B G R A