深入RPG游戲制作—圖形篇
發(fā)表時(shí)間:2023-08-22 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]文章作者:竺強(qiáng) 不知大家有沒有注意到這一點(diǎn):喜歡電腦的大都喜歡游戲。為什么呢?因?yàn)椴还軐δ信仙賮碚f,游戲都具有一種特殊的魅力,休閑的魅力、回味的魅力,或是競爭的魅力。但有時(shí)我也常常這樣想,比...
文章作者:竺強(qiáng)
不知大家有沒有注意到這一點(diǎn):喜歡電腦的大都喜歡游戲。為什么呢?因?yàn)椴还軐δ信仙賮碚f,游戲都具有一種特殊的魅力,休閑的魅力、回味的魅力,或是競爭的魅力。但有時(shí)我也常常這樣想,比如由于內(nèi)存或者硬件的什么原因,游戲玩不起來,請來朋友幫忙調(diào)整,問題解決了,興高采烈地繼續(xù)玩,那么你什么也沒學(xué)到。若是據(jù)此深入,刨根問底,從頭到尾搞明白了,相信不久你就會(huì)成為電腦高手。何謂高手也都是平常磨練出來的。大家由愛游戲而嘗試編游戲,也許有一天你會(huì)發(fā)覺雖然編程水平增長有限,但卻不知不覺中精通了3DS或者COREL DRAW等軟件,并能以另一個(gè)高度看待以前曾經(jīng)模棱兩可的操作系統(tǒng)概念,這就叫潛移默化。
那我們能編些什么游戲呢?QUAKE還是《AH-64D長弓阿帕奇》?這些恐怕許多專業(yè)編程人員也難以搞清楚其中的關(guān)鍵細(xì)節(jié)。我們不妨定得稍低一些,先從對速度、技巧要求較低的RPG、SLG開始,如果你有耐力、肯下苦功,再加上少許天賦與靈感,相信我們中間也能出一個(gè)Tom Hall,編出比QUAKE更酷的引擎程序。
(一)開篇
在高配置和軟件極其豐富的今天,我想當(dāng)年的《勇者斗惡龍》恐怕已很難再使玩家入迷了,從4色向16M真彩,從320×200轉(zhuǎn)向1024×768的發(fā)展是大勢所趨,那我們要如何來定位呢?以前介紹的16色只是給大家一個(gè)入門的簡單練習(xí),要想達(dá)到《炎龍騎士團(tuán)Ⅱ》、《仙劍奇?zhèn)b傳》這樣的養(yǎng)眼程度,256色是比較恰當(dāng)?shù),有很多朋友?huì)問:那么真彩呢?真彩固然好,但我們不妨作個(gè)比較,將一幅16M真彩圖片經(jīng)圖象轉(zhuǎn)換工具轉(zhuǎn)換成256色后,兩者相比除了光澤略減外,圖像失真并不嚴(yán)重。只有動(dòng)態(tài)的動(dòng)畫,如《銀河飛將Ⅳ》的過場動(dòng)畫只有真彩(其實(shí)是64K色)才會(huì)顯出真正的威力。不過,請大家有一點(diǎn)要記在心里,一個(gè)游戲的真正吸引力還在于內(nèi)涵和創(chuàng)意,空有一副外殼是沒有用的,象戰(zhàn)斗畫面絕不遜于《仙劍奇?zhèn)b傳》的《冥界幻姬》遭受失敗即是一個(gè)例子。光就美工水平而論,同樣是256色,制作的水準(zhǔn)也有相當(dāng)大的差異,有的甚至還不如16色。而16色中,做得好的也絕不遜于256色,象光榮的《三國志英杰傳》在畫面上就看不出哪點(diǎn)比智冠的《三國演義Ⅱ》差,好像還強(qiáng)些。游戲今后肯定向真彩發(fā)展,大家即使有了真彩的編程環(huán)境,美工仍是需要細(xì)致對待。
(二)色彩
顏色是物體的一個(gè)表面特征,對我們大多數(shù)人來說,并不能直接與光線打交道,我們看到的是色彩效果。當(dāng)我們坐在屏幕前,使用一種工具產(chǎn)生、控制各種顏色,必須明白眼睛看到的顏色實(shí)際上是由顏料反射的光線。這在一開始可能會(huì)不太習(xí)慣,但在深入學(xué)習(xí)包括光線效果在內(nèi)的美工技巧時(shí),有必要首先理解顏料的色彩。
畫家通過混合顏料來取得新的顏色,這種混合后能產(chǎn)生多種色彩變化效果的基色稱為原色,它們是紅、綠、藍(lán),譬如我們需要洋紅,那就混合紅和藍(lán),需要白色,就要混合等量的紅、綠、藍(lán),F(xiàn)在我們來看看另外一種配色方案:即由RGB三基色互補(bǔ)而成的洋紅色(MAGENTA)、雪青色(CYAN)、黃色(YELLOW)三色CYM模式。CYM模式的一個(gè)重要區(qū)別在于三基色混合在一起得到黑色而不是棕色,象通常我們接觸的LCD液晶顯示用的就是CYM方案。
色彩(HUE)就是通常所說的顏色。很多人可能會(huì)感到驚訝白、黑和灰也是無色彩的顏色,平常說的彩色即有色彩的顏色,而灰色則是彩色和黑的混合物,明白它們對理解電腦圖像創(chuàng)作是很重要的。不同的顏色在視覺上會(huì)產(chǎn)生不同的效果,有些容易讓人放松,有些使人惴惴不安,另有一些暗示著危險(xiǎn)或安全,所有這些在編游戲時(shí)都要考慮進(jìn)去。一件作品的好壞,也許和諧比華麗更重要,你不必一定要以一個(gè)藝術(shù)家的角度去繪制那些游戲畫面,但在游戲出品前,先聽聽其他人的意見是個(gè)不錯(cuò)的主意,如果這些色彩使他們厭煩,那我想在你的作品正式推出前會(huì)是件好事。
在PC機(jī)中,以標(biāo)準(zhǔn)VGA來說,R、G、B的亮度(即色彩深淺)各分為2^6(64)等分,一共需要18個(gè)位來表示,白色即(63,63,63),這種方法共能顯示2^6×2^6×2^6(256K)種顏色。對于SVGA真彩,由于每種顏色用8位來表示,所以共可顯示出2^8×2^8×2^8(16M)種顏色。
VGA/SVGA卡中負(fù)責(zé)顏色輸出的是RAM DAC(DIGTALTO ANALOG CONVERTOR)。VGA卡將8位的輸入數(shù)字信號經(jīng)一個(gè)顏色對照表和DAC的轉(zhuǎn)換后,由模擬信號線輸出到屏幕上。雖然顏色對照表中每個(gè)字段可有256K種顏色變化,但因輸入信號只有256種,所以屏幕上最多只能同時(shí)顯示256色,也就是說每次從256K種顏色中選出256種來顯示。SVGA卡中DAC芯片必須使用16位(32K、64K)的或24位(16M)的輸入接口,對這些芯片來說,輸入的信號就是真實(shí)的色值,所以只要按RGB格式轉(zhuǎn)換即可。由于采用的數(shù)據(jù)傳輸接口位數(shù)增加,所以在速度上可以提高不少,當(dāng)然SVGA卡上的集成化和一些加速設(shè)置也功不可沒。在繪圖模式下,這類卡提供硬件光標(biāo)功能,減輕了CPU負(fù)擔(dān)。
(三)顯示模式
VGA的繪圖模式中,最重要的是模式12和模式13(我想大部分玩家手上已經(jīng)沒有CGA、EGA顯示卡了吧)。模式12H采用平面式對應(yīng)的方法,支持640×480,視頻內(nèi)存起始地址為A0000H,和其它D、E、10H三種模式一樣同為16色,只是分辨率有所不同。視頻內(nèi)存地址上,每一個(gè)字節(jié)代表8個(gè)像素,每一位又可對應(yīng)到顏色平面中同樣位置的4位上。當(dāng)我們要在屏幕上繪出一個(gè)點(diǎn)時(shí),就必須將數(shù)據(jù)分別存放到四個(gè)顏色平面中對應(yīng)的位上。VGA提供了許多存取顏色平面數(shù)據(jù)的方法,如一次存取4個(gè)顏色平面數(shù)據(jù)或每次只對單一平面操作,哪種方法比較快呢?如果是圖像方面的處理,選擇第二種較理想;而對于畫點(diǎn)方式的作圖,第一種更快速一些。
模式13H是VGA卡中唯一可同顯256的模式,支持分辨率320×200,視頻內(nèi)存起始地址A0000H,它采用的是線性對應(yīng)的方法(SVGA的所有256色和真彩都是用這種方法)。線性對應(yīng)將屏幕上每一點(diǎn)與視頻內(nèi)存地址按順序一一對應(yīng)起來,一個(gè)點(diǎn)對應(yīng)一個(gè)字節(jié),這樣做的好處是:這種對應(yīng)方式比顏色平面對應(yīng)方式簡單多了,因?yàn)槲覀冎恍柚苯訉σ曨l內(nèi)存地址做存取即可,而不必理會(huì)顏色平面與內(nèi)存地址的對應(yīng)關(guān)系。大家不難看出,其實(shí)線性對應(yīng)就是將四個(gè)顏色平面的內(nèi)存串聯(lián)在一起,而成為一種直線的排列。
13H的初始化編碼,《大眾軟件》今年第一期中黃明朋友已經(jīng)給出,如果大家用的是TURBOC,也可以這樣寫:
[NO.1]
setup-graph() /* VGA 13h 模式初始化 */
{
union REGS r;
r.h.ah=0;
r.h.al=0×13;
int86(0x10,&r,&r);
}
close-graph() /* 關(guān)閉 VGA 13h 圖形系統(tǒng) */
{
union REGS r;
r.h.ah=0x00;
r.h.al=0x03;
int86(0x10,&r,&r);
}
SVGA由于要存取更高分辨率或更多顏色的數(shù)據(jù),一般都至少擁有512K以上的內(nèi)存,但其所占用視頻內(nèi)存的地址仍大都是64K。在內(nèi)存地址發(fā)生不夠用的情況下,SVGA的區(qū)域切換功能將整個(gè)內(nèi)存劃分為許多內(nèi)存頁,然后利用切換功能把不同的內(nèi)存頁對應(yīng)到A0000H或其它的視頻內(nèi)存地址上。但目前各個(gè)廠家的SVGA卡規(guī)格都不一樣,切換內(nèi)存頁的方法也不盡相同,而且有些顯示卡上還設(shè)有兩個(gè)切換開關(guān),這是我們需要注意的。
下面我們來看看SVGA的圖形初始化例程:
[NO.2]
#include
int huge Return-SVGA256(void)
{
return(0); /* 返回各種分辨率的對應(yīng)編號 0~6
0) Standard VGA/MCGA 320×200×256
1) 256K Svga/VESA 640×400×256
2) 512K Svga/VESA 640×480×256
3) 512K Svga/VESA 800×600×256
4) 1024K Svga/VESA 1024×768×256
5) 256K Svga 640×350×256
6) 1280K以上 VESA 1280×1024×256 */
}
void setup-svga256(void) /* SVGA 256色模式初始化 */
{
int gm,driver = DETECT;
installuserdriver(“svga256”,Return-SVGA256);
initgraph(&driver,&gm?);
}
void main()
{
setup-svga256();
setcolor(2);
circle(100,100,50);
getch();
closegraph();
}
大家只要把SVGA的圖形接口程序 SVGA256.BGI拷入C的系統(tǒng)程序目錄中編譯即可,為什么呢?因?yàn)檫@個(gè)驅(qū)動(dòng)程序當(dāng)然不會(huì)是BORLAND公司的產(chǎn)品。這樣做的一個(gè)好處是:讓還沒有圖形庫子函數(shù)編程經(jīng)驗(yàn)的朋友可以直接利用TURBO C圖形庫(GRAPHICS.LIB)嵌入文件GRAPHICS.H中定義的各種繪圖函數(shù)。
這個(gè)SVGA圖形驅(qū)動(dòng)程序效果不錯(cuò),也能支持大多數(shù)的SVGA卡,象ATI、Trident、Tseng等,由于SVGA卡兼容規(guī)格的局限性,筆者在一些卡上也碰到了一些問題,如9440卡不支持5號模式,5428卡則不支持1號、5號模式,但不管哪種類型的卡,都支持0號和2號模式。
(四)函數(shù)和優(yōu)化
如果大家仔細(xì)觀看TURBO C下的系統(tǒng)目錄,就可以發(fā)現(xiàn)很多 *.BGI文件。TURBO C圖形系統(tǒng)可分為與機(jī)器無關(guān)的圖形庫(GRAPHICS.LIB)和以文件形式存在于磁盤上的字體庫(*.CHR)、圖形設(shè)備驅(qū)動(dòng)程序(*.BGI)。BGI即Borland Graphics Interface的縮寫,是美國BORLAND公司編出的一套通用圖形接口,如EGAVGA.BGI為 EGA/VGA卡的驅(qū)動(dòng)程序。這是個(gè)通過建立功能函數(shù)庫而使編程者能在圖形處理上獨(dú)立于各類顯示系統(tǒng)的辦法,但出于兼容性的考慮是以犧牲速度作為補(bǔ)償?shù),而且它也不支持SVGA卡關(guān)鍵的256色或真彩顯示,雖然早期的許多游戲(甚至包括一些射擊游戲)確實(shí)都是在這些驅(qū)動(dòng)程序上編寫的,但對于現(xiàn)今速度上要求極高的、特別是三維游戲無疑是不現(xiàn)實(shí)的。一個(gè)最好的辦法就是自行編寫高效的圖形原碼,從畫點(diǎn)做起,進(jìn)而擴(kuò)充需要的整個(gè)圖形庫。有的朋友可能會(huì)說:“象RPG中畫幾條菜單框框慢不了多少時(shí)間吧!钡绻磔S平移呢?640×480×256是個(gè)什么樣的量級概念!就算慢不了多少,你為什么不能使它更快呢?
畫點(diǎn)是很重要的一步,幾乎所有的圖形函數(shù)都是以它為基礎(chǔ),下面我為大家提供一個(gè)適合于各種分辨率下的高效畫點(diǎn)原編碼:
[NO.3]
#include
void point(int x,int y,char color)
{
unsigned put;
put=y*320+x; /* 分辨率為320*200,若為其他分辨率請換算相應(yīng)的系數(shù) */
*((char far *)(0×A0000000L)+put)=color;
}
大家在創(chuàng)建自己的功能函數(shù)庫的同時(shí),必須注意一些速度上的編程技巧:1.避免乘法和除法,這是相當(dāng)浪費(fèi)CPU時(shí)間的一種運(yùn)算,求余數(shù)也應(yīng)該盡可能避免。2.多使用整數(shù),少用浮點(diǎn)數(shù),雙精度那就更慢了。3.減少讀取磁盤文件的操作,一次讀取多量的方式比少量數(shù)據(jù)的多次讀取要快很多。4.使用Register定義變量,寄存器的速度甚至比內(nèi)存還快。5.這會(huì)是經(jīng)常犯的毛病,盡量將費(fèi)時(shí)的運(yùn)算移到循環(huán)外進(jìn)行。
另外,畫圖子函數(shù)在算法上有些需要區(qū)別考慮,象斜線的Bresenham算法、填充的優(yōu)化算法等,這些請大家翻閱相關(guān)的數(shù)學(xué)算法程序書籍。還有呢?那當(dāng)然是匯編了,匯編是種較難維護(hù)的語言,有匯編程序經(jīng)驗(yàn)的朋友可以嘗試一些嵌入?yún)R編碼的方法,需要注意的是對匯編語言不同的C編譯程序規(guī)定了不同的調(diào)用規(guī)則。在TURBO C中用修飾符cdecl說明的函數(shù)或不加說明的函數(shù)按照從右向左的順序?qū)?shù)壓入堆棧,即給定調(diào)用函數(shù)(a,b,c)后,a最先進(jìn)棧,然后是b和c。進(jìn)入?yún)R編編碼過程后,寄存器BP內(nèi)容必須存在堆棧中,當(dāng)前棧指針SP的值存入BP,如果子程序用SI和DI,唯一必存的寄存器為SI和DI,從匯編語言子程序返回之前,必須恢復(fù)BP、SI和DI,并重新設(shè)置堆棧指針。
最后一種辦法,實(shí)在缺少函數(shù)編程經(jīng)驗(yàn)的朋友可以通過Internet下載一些支持VGA/SVGA的高效圖形函數(shù)庫,這些可是現(xiàn)成可以用的,翻閱README可找到詳盡的函數(shù)定義說明。“我一定要用Borland的驅(qū)動(dòng)程序作畫!”那我也不反對,也許明年786就要出來了(笑話)。