超级玛丽制作揭秘8跟踪打印 类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
總結
以上是生活随笔為你收集整理的超级玛丽制作揭秘8跟踪打印 类FILEREPORT的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java文件传输(有进度条)
- 下一篇: js判断字符串是否包含中文或英文