超级玛丽制作揭秘7字体管理 类MYFONT

本文介绍了一款超级玛丽游戏中的文字显示实现方法,通过自定义MYFONT类封装了文字显示的功能,包括字体选择、颜色设置及实际的文字绘制等。此外,还提供了具体的使用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

类说明:游戏当然少不了文字。在超级玛丽中,文字内容是比较少的,分两类:游戏菜单中的文字,游戏过程中的文字。
菜单中的文字包括:
 "制作: 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

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值