終于等到在網(wǎng)上買的書了,雖然這書時(shí)代有點(diǎn)老,但還是覺得還是有價(jià)值,應(yīng)該好好讀一讀,仔細(xì)閱讀當(dāng)然是要做些筆記啦。
學(xué)習(xí)前的準(zhǔn)備工作:
這本書的例子用的是VC++ 6.0+DirectX 7.0,所以先得到網(wǎng)上下載DirectX 7.0
SDK(8.0亦可),解壓,把Include 和lib 下的文件全部拷貝到Vc
++的對應(yīng)目錄下,然后,我就試著編譯了第一章的一個(gè)例子游戲---打磚塊的游戲,發(fā)現(xiàn)連接不了外部文件!無奈,百度一下,原來還得對編譯器做些工作:在Project/Settings /link Object/library 添加
ddraw.lib dxguid.lib 。
第一章 學(xué)海無涯
講解游戲誕生的整個(gè)過程,Windows下面的游戲運(yùn)行整個(gè)過程和游戲編程中的規(guī)范。
“
一個(gè)簡化游戲的結(jié)構(gòu):第一步,初始化
第二步,進(jìn)入游戲循環(huán)
第三步:獲得玩家的輸入信息
第四步:執(zhí)行人工智能和游戲邏輯
第五步:渲染下一幀圖像
第六步:同步顯示
第七步:循環(huán)
第八步:關(guān)閉 ”
啊哈原來一個(gè)游戲程序簡單點(diǎn)就是這樣運(yùn)行的,游戲也并不是那么神秘額。
另外的收獲就是游戲編程一些規(guī)范和技巧:
1.“你不應(yīng)當(dāng)在對運(yùn)行時(shí)間或內(nèi)存要求特別嚴(yán)格的代碼段中式用高層API。特別是與游戲內(nèi)循環(huán)有關(guān)的代碼大多需要手工編寫,否則游戲多半會遇到嚴(yán)重的速度和性能的問題。當(dāng)然,這并不一位著就不能信任DirectX等
API,因?yàn)镈irectX的設(shè)計(jì)目的就是兼顧高性能和“thin”原則。但就通常來講,應(yīng)當(dāng)避免頻繁調(diào)用高層的函數(shù)。”----這點(diǎn)是有點(diǎn)不太明白,作者是對API的性能不太信任?還是另有原因,暫且放在這里,等整體看完再研究之。
2.“不要害怕使用全局變量。”“由于參數(shù)要被壓棧和出棧,執(zhí)行這個(gè)函數(shù)體所需時(shí)間小于調(diào)用函數(shù)所需的時(shí)間,在這種情況下,更好的方法可以是設(shè)立一些全局變量,然后再調(diào)用前進(jìn)行賦值以傳遞參數(shù)”——時(shí)間是如此的重要!
3.“使用內(nèi)聯(lián)函數(shù)”--呵呵,這個(gè)上C++課時(shí)老師講啦。雖然使編譯后的程序變大了,但卻有效的提高運(yùn)行速度。
4.“盡量使用32位的變量而不是8位或16位變量。”
“struct CPOINT
{
short x,y;
unsigned char c;
} //
end CPOINT”
“注意,定義這個(gè)結(jié)果看上去不錯(cuò),但實(shí)際并非如此!首先,結(jié)構(gòu)本身是一個(gè)5字節(jié)長的結(jié)構(gòu)——(2*sizeof(short)+sizeof(char))=5
字節(jié)。這太糟了額,由于沒注意字節(jié)對齊,內(nèi)存尋址的時(shí)候會出大問題。”——這點(diǎn)確實(shí)不知道!標(biāo)記之。
5.“以類似RISC的方式來編程。換句話來說,盡量簡化你的代碼,而不是是他更復(fù)雜。”——以前一直想,能一句完成,就不要寫多幾行,原來簡單句子,執(zhí)行的更快。“使用二進(jìn)制移位運(yùn)算來進(jìn)行乘數(shù)是2的冪的簡單整數(shù)乘法。”
6.“不要為簡單的對象定義太多復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。鏈表結(jié)構(gòu)很好用,但并不意味著當(dāng)你所需要的其實(shí)是大約有256個(gè)固定數(shù)組的時(shí)候,你也該使用鏈表”
7.最后有一個(gè)小游戲,但是我對里面的碰撞算法,不太理解啊,真是有點(diǎn)難度啊。