类说明:游戏当然少不了文字。在超级玛丽中,文字内容是比较少的,分两类:游戏菜单中的文字,游戏过程中的文字。
菜单中的文字包括:
"制作: programking 2008年8月",
"操作: Z:子弹 X:跳 方向键移动 W:默认窗口大小",
"地图文件错误,请修正错误后重新启动程序。",
"(上下键选择菜单,回车键确认)",
"开始游戏",
"操作说明",
"博客: http://blog.youkuaiyun.com/programking",
"(回车键返回主菜单)"
这几个字符串存储在一个指针数组中(全局变量),通关数组下标使用各个字符串。
游戏中的文字只有两个:’LIFE’,’WORLD’。
其他的文字其实都是位图,例如“通关”、“gameover”以及碰到金币后的“+10”。这些都是位图图片,在pic文件夹里一看便知。
成员函数功能列表:
class MYFONT
{
public:
//构造函数,初始化”字体表”,即5个字体句柄构成的数组,字体大小依次递增.
MYFONT();
~MYFONT();
//功能 设置显示文字的dc
//入参 显示文字的dc句柄
void SetDevice(HDC h);
//功能 设置当前显示的字体
//入参 字体表下标
void SelectFont(int i);
//功能 设置当前字体为默认字体
//入参 无
void SelectOldFont();
//功能 在指定坐标显示字符串
//入参 横纵坐标 字符串指针
void ShowText(int x,int y,char *p);
//功能 设置文字背景颜色,文字颜色
//入参 文字背景颜色 文字颜色
void SetColor(COLORREF cbk, COLORREF ctext);
//功能 设置文字背景颜色,文字颜色
//入参 文字背景颜色 文字颜色
void SelectColor(COLORREF cbk, COLORREF ctext);
//显示文字的dc
HDC hdc;
//字体表,包含5个字体句柄,字体大小依次是0,10,20,30,40
HFONT hf[5];
//默认字体
HFONT oldhf;
//color
COLORREF c1;//字体背景色
COLORREF c2;//字体颜色
};
技术原理:要在屏幕上显示一个字符串,分以下几步:将字体句柄选入dc,设置文字背景色,设置文字颜色,最后用TextOut完成显示。这个类就是将整个过程封装了一下。显示dc,背景色,文字颜色,字体句柄都对应各个成员数据。函数具体实现很简单,一看便知。
使用举例:
定义
mario01/mario01.cpp(89):MYFONT myfont;
初始化设置显示dc
mario01/mario01.cpp(258): myfont.SetDevice(hscreen);
地图文件错误:设置颜色,设置字体,显示提示文字
mario01/mario01.cpp(327): myfont.SelectColor(TC_WHITE,TC_BLACK);
mario01/mario01.cpp(328): myfont.SelectFont(0);
mario01/mario01.cpp(329): myfont.ShowText(150,290,pPreText[3]);
游戏开始菜单:设置字体,设置颜色,显示三行菜单文字
mario01/mario01.cpp(336): myfont.SelectFont(0);
mario01/mario01.cpp(337): myfont.SelectColor(TC_BLACK, TC_YELLOW_0);
mario01/mario01.cpp(338): myfont.ShowText(150,260,pPreText[4]);
mario01/mario01.cpp(339): myfont.ShowText(150,290,pPreText[5]);
mario01/mario01.cpp(340): myfont.ShowText(150,320,pPreText[6]);
游戏操作说明菜单:设置字体,设置颜色,显示四行说明文字
mario01/mario01.cpp(348): myfont.SelectFont(0);
mario01/mario01.cpp(349): myfont.SelectColor(TC_BLACK, TC_YELLOW_0);
mario01/mario01.cpp(350): myfont.ShowText(150,230,pPreText[8]);
mario01/mario01.cpp(351): myfont.ShowText(50,260,pPreText[1]);
mario01/mario01.cpp(352): myfont.ShowText(50,290,pPreText[0]);
mario01/mario01.cpp(353): myfont.ShowText(50,320,pPreText[7]);
这个类的使用就这些。这个类只是负责菜单文字的显示,那么,游戏中的LIFE,WORLD的提示,是在哪里完成的呢?函数如下:
void GAMEMAP::ShowInfo(HDC h)
{
char temp[50]={0};
SetTextColor(h, TC_WHITE);
SetBkColor(h, TC_BLACK);
sprintf(temp, "LIFE : %d",iLife);
TextOut(h, 220,100,temp,strlen(temp));
sprintf(temp, "WORLD : %d",iMatch+1);
TextOut(h, 220,130,temp,strlen(temp));
}
这个函数很简单。要说明的是,它并没有设置字体,因为在显示菜单的时候已经设置过了。
至此,所有文字的处理全部实现。
附:
超级玛丽第一版源码链接:http://download.youkuaiyun.com/source/497676
超级玛丽增强版源码链接:http://download.youkuaiyun.com/source/584350