前面介绍了图片显示、时钟控制、字体管理几项基本技术。这是所有游戏都通用的基本技术。剩下的问题就是游戏逻辑,例如益智类、运动类、射击类、格斗类等等。当然,不同的游戏需要针对自身做一些优化,比如益智类游戏的时钟控制、画面刷新都更简单,而格斗游戏,画面的质量要更酷、更炫。下面要介绍整个游戏的核心层:逻辑控制。地图怎样绘制的?物品的坐标怎么存储?人物怎样移动?游戏流程是什么样的?
在介绍这些内容前,先打断一下思路,说程序是怎样写出来的,即“调试”。
程序就是一堆代码,了无秘密。初学时,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
本文介绍了游戏开发中的调试方法,包括如何使用跟踪打印来定位bug,以及一个用于日志记录的FILEREPORT类的实现。此外,还提供了超级玛丽游戏的源码链接。

1万+

被折叠的 条评论
为什么被折叠?



