超级玛丽制作揭秘8跟踪打印 类FILEREPORT

本文介绍了游戏开发中的调试方法,包括如何使用跟踪打印来定位bug,以及一个用于日志记录的FILEREPORT类的实现。此外,还提供了超级玛丽游戏的源码链接。

 前面介绍了图片显示、时钟控制、字体管理几项基本技术。这是所有游戏都通用的基本技术。剩下的问题就是游戏逻辑,例如益智类、运动类、射击类、格斗类等等。当然,不同的游戏需要针对自身做一些优化,比如益智类游戏的时钟控制、画面刷新都更简单,而格斗游戏,画面的质量要更酷、更炫。下面要介绍整个游戏的核心层:逻辑控制。地图怎样绘制的?物品的坐标怎么存储?人物怎样移动?游戏流程是什么样的?
在介绍这些内容前,先打断一下思路,说程序是怎样写出来的,即“调试”。
程序就是一堆代码,了无秘密。初学时,dos下一个猜数字的程序,只需要十几行。一个纸牌游戏,一千多行,而超级玛丽增强版,近三千行。怎样让这么一堆程序从无到有而且运行正确?开发不是靠设计的巧妙或者笨拙,而是靠反复调试。在三千行的代码中,增加一千行,仍然运行正确,这是编程的基本要求。这个最基本的要求,靠设计做不到,只能靠调试。正如公司里的测试部,人力规模,工作压力,丝毫不比开发部差。即使如此,还是能让一些简单bug流入最终产品。老板只能先问测试部:“这么简单的bug,怎么没测出来?”再问开发部:“这么明显的错误,你怎么写出来的?”总之,程序是调出来的。
怎么调?vc提供了很全面的调试方法,打断点、单步跟踪、看变量。这些方法对游戏不适用。一个bug,通常发生在某种情况下,比如超级玛丽,玩家在水管上,按方向键“下”,新的地图显示不出来,屏幕上乱七八糟。请问,bug在哪里?玩家坐标出问题、按键响应出问题、地图加载出问题、图片显示出问题?打断点,无处下手。
解决方法是:程序中,创建一个文本文件,在“可能有问题”的地方,添加代码,向这个文件写入提示信息或变量内容(称为跟踪打印)。这个文本文件,就成了代码运行的日志。看日志,就知道代码中发生了什么事情。最终,找到bug。
FILEREPORT,就是对日志文件创建、写入等操作的封装。
成员函数功能列表:
class FILEREPORT
{
public:
 //功能 默认构造函数,创建日志trace.txt
 //入参 无
 FILEREPORT();
 //功能 指定日志文件名称
 //入参 日志文件名称
 FILEREPORT(char *p);
 //功能 析构函数,关闭文件
 //入参 无
 ~FILEREPORT();
 
 //功能 向日志文件写入字符串
 //入参 要写入的字符串
 void put(char *p);
 //功能 向日志文件写入一个字符串,两个整数
 //入参 字符串 整数a 整数b
 void put(char *p,int a,int b);
 //功能 计数器计数, 并写入一个提示字符串
 //入参 计时器id 字符串
 void putnum(int i,char *p);
 
 //功能 判断一个dc是否为null, 如果是,写入提示信息
 //入参 dc句柄 字符串
 void CheckDC(HDC h,char *p);

 //功能 设置显示跟踪信息的dc和文本坐标
 //入参 显示dc 横纵坐标
 void SetDevice(HDC h,int x,int y);
 //功能 设置要显示的跟踪信息
 //功能 提示字符串 整数a 整数b
 void Output(char *p,int a,int b);
 //功能 在屏幕上显示当前的跟踪信息
 void Show();


private:
 //跟踪文件指针
 FILE *fp;

 //计数器组
 int num[5];

 //显示dc
 HDC hshow;
 //跟踪文本显示坐标
 int xpos;
 int ypos;
 //当前跟踪信息
 char info[50];

};
函数具体实现很简单,只是简单的文件写入。要说明的是两部分,一:计数功能,有时要统计某个事情发生多少次,所以用一个整数数组,通过putnum让指定数字累加。二:显示功能,让跟踪信息,立刻显示在屏幕上。
使用举例:
没有使用。程序最终完成,所有的跟踪打印都已删除。

附:
超级玛丽第一版源码链接:http://download.csdn.net/source/497676
超级玛丽增强版源码链接:http://download.csdn.net/source/584350

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值