<form id="hz9zz"></form>
  • <form id="hz9zz"></form>

      <nobr id="hz9zz"></nobr>

      <form id="hz9zz"></form>

    1. 明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

      深入RPG游戲制作—圖形篇

      [摘要]文章作者:竺強  不知大家有沒有注意到這一點:喜歡電腦的大都喜歡游戲。為什么呢?因為不管對男女老少來說,游戲都具有一種特殊的魅力,休閑的魅力、回味的魅力,或是競爭的魅力。但有時我也常常這樣想,比...
      文章作者:竺強
        
       不知大家有沒有注意到這一點:喜歡電腦的大都喜歡游戲。為什么呢?因為不管對男女老少來說,游戲都具有一種特殊的魅力,休閑的魅力、回味的魅力,或是競爭的魅力。但有時我也常常這樣想,比如由于內存或者硬件的什么原因,游戲玩不起來,請來朋友幫忙調整,問題解決了,興高采烈地繼續玩,那么你什么也沒學到。若是據此深入,刨根問底,從頭到尾搞明白了,相信不久你就會成為電腦高手。何謂高手也都是平常磨練出來的。大家由愛游戲而嘗試編游戲,也許有一天你會發覺雖然編程水平增長有限,但卻不知不覺中精通了3DS或者COREL DRAW等軟件,并能以另一個高度看待以前曾經模棱兩可的操作系統概念,這就叫潛移默化。

       那我們能編些什么游戲呢?QUAKE還是《AH-64D長弓阿帕奇》?這些恐怕許多專業編程人員也難以搞清楚其中的關鍵細節。我們不妨定得稍低一些,先從對速度、技巧要求較低的RPG、SLG開始,如果你有耐力、肯下苦功,再加上少許天賦與靈感,相信我們中間也能出一個Tom Hall,編出比QUAKE更酷的引擎程序。

      (一)開篇

       在高配置和軟件極其豐富的今天,我想當年的《勇者斗惡龍》恐怕已很難再使玩家入迷了,從4色向16M真彩,從320×200轉向1024×768的發展是大勢所趨,那我們要如何來定位呢?以前介紹的16色只是給大家一個入門的簡單練習,要想達到《炎龍騎士團Ⅱ》、《仙劍奇俠傳》這樣的養眼程度,256色是比較恰當的,有很多朋友會問:那么真彩呢?真彩固然好,但我們不妨作個比較,將一幅16M真彩圖片經圖象轉換工具轉換成256色后,兩者相比除了光澤略減外,圖像失真并不嚴重。只有動態的動畫,如《銀河飛將Ⅳ》的過場動畫只有真彩(其實是64K色)才會顯出真正的威力。不過,請大家有一點要記在心里,一個游戲的真正吸引力還在于內涵和創意,空有一副外殼是沒有用的,象戰斗畫面絕不遜于《仙劍奇俠傳》的《冥界幻姬》遭受失敗即是一個例子。光就美工水平而論,同樣是256色,制作的水準也有相當大的差異,有的甚至還不如16色。而16色中,做得好的也絕不遜于256色,象光榮的《三國志英杰傳》在畫面上就看不出哪點比智冠的《三國演義Ⅱ》差,好像還強些。游戲今后肯定向真彩發展,大家即使有了真彩的編程環境,美工仍是需要細致對待。

      (二)色彩

       顏色是物體的一個表面特征,對我們大多數人來說,并不能直接與光線打交道,我們看到的是色彩效果。當我們坐在屏幕前,使用一種工具產生、控制各種顏色,必須明白眼睛看到的顏色實際上是由顏料反射的光線。這在一開始可能會不太習慣,但在深入學習包括光線效果在內的美工技巧時,有必要首先理解顏料的色彩。

       畫家通過混合顏料來取得新的顏色,這種混合后能產生多種色彩變化效果的基色稱為原色,它們是紅、綠、藍,譬如我們需要洋紅,那就混合紅和藍,需要白色,就要混合等量的紅、綠、藍,F在我們來看看另外一種配色方案:即由RGB三基色互補而成的洋紅色(MAGENTA)、雪青色(CYAN)、黃色(YELLOW)三色CYM模式。CYM模式的一個重要區別在于三基色混合在一起得到黑色而不是棕色,象通常我們接觸的LCD液晶顯示用的就是CYM方案。

       色彩(HUE)就是通常所說的顏色。很多人可能會感到驚訝白、黑和灰也是無色彩的顏色,平常說的彩色即有色彩的顏色,而灰色則是彩色和黑的混合物,明白它們對理解電腦圖像創作是很重要的。不同的顏色在視覺上會產生不同的效果,有些容易讓人放松,有些使人惴惴不安,另有一些暗示著危險或安全,所有這些在編游戲時都要考慮進去。一件作品的好壞,也許和諧比華麗更重要,你不必一定要以一個藝術家的角度去繪制那些游戲畫面,但在游戲出品前,先聽聽其他人的意見是個不錯的主意,如果這些色彩使他們厭煩,那我想在你的作品正式推出前會是件好事。

       在PC機中,以標準VGA來說,R、G、B的亮度(即色彩深淺)各分為2^6(64)等分,一共需要18個位來表示,白色即(63,63,63),這種方法共能顯示2^6×2^6×2^6(256K)種顏色。對于SVGA真彩,由于每種顏色用8位來表示,所以共可顯示出2^8×2^8×2^8(16M)種顏色。

       VGA/SVGA卡中負責顏色輸出的是RAM DAC(DIGTALTO ANALOG CONVERTOR)。VGA卡將8位的輸入數字信號經一個顏色對照表和DAC的轉換后,由模擬信號線輸出到屏幕上。雖然顏色對照表中每個字段可有256K種顏色變化,但因輸入信號只有256種,所以屏幕上最多只能同時顯示256色,也就是說每次從256K種顏色中選出256種來顯示。SVGA卡中DAC芯片必須使用16位(32K、64K)的或24位(16M)的輸入接口,對這些芯片來說,輸入的信號就是真實的色值,所以只要按RGB格式轉換即可。由于采用的數據傳輸接口位數增加,所以在速度上可以提高不少,當然SVGA卡上的集成化和一些加速設置也功不可沒。在繪圖模式下,這類卡提供硬件光標功能,減輕了CPU負擔。

      (三)顯示模式

       VGA的繪圖模式中,最重要的是模式12和模式13(我想大部分玩家手上已經沒有CGA、EGA顯示卡了吧)。模式12H采用平面式對應的方法,支持640×480,視頻內存起始地址為A0000H,和其它D、E、10H三種模式一樣同為16色,只是分辨率有所不同。視頻內存地址上,每一個字節代表8個像素,每一位又可對應到顏色平面中同樣位置的4位上。當我們要在屏幕上繪出一個點時,就必須將數據分別存放到四個顏色平面中對應的位上。VGA提供了許多存取顏色平面數據的方法,如一次存取4個顏色平面數據或每次只對單一平面操作,哪種方法比較快呢?如果是圖像方面的處理,選擇第二種較理想;而對于畫點方式的作圖,第一種更快速一些。

       模式13H是VGA卡中唯一可同顯256的模式,支持分辨率320×200,視頻內存起始地址A0000H,它采用的是線性對應的方法(SVGA的所有256色和真彩都是用這種方法)。線性對應將屏幕上每一點與視頻內存地址按順序一一對應起來,一個點對應一個字節,這樣做的好處是:這種對應方式比顏色平面對應方式簡單多了,因為我們只需直接對視頻內存地址做存取即可,而不必理會顏色平面與內存地址的對應關系。大家不難看出,其實線性對應就是將四個顏色平面的內存串聯在一起,而成為一種直線的排列。

       13H的初始化編碼,《大眾軟件》今年第一期中黃明朋友已經給出,如果大家用的是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() /* 關閉 VGA 13h 圖形系統 */
      {
      union REGS r;
      r.h.ah=0x00;
      r.h.al=0x03;
      int86(0x10,&r,&r);
      }

       SVGA由于要存取更高分辨率或更多顏色的數據,一般都至少擁有512K以上的內存,但其所占用視頻內存的地址仍大都是64K。在內存地址發生不夠用的情況下,SVGA的區域切換功能將整個內存劃分為許多內存頁,然后利用切換功能把不同的內存頁對應到A0000H或其它的視頻內存地址上。但目前各個廠家的SVGA卡規格都不一樣,切換內存頁的方法也不盡相同,而且有些顯示卡上還設有兩個切換開關,這是我們需要注意的。

      下面我們來看看SVGA的圖形初始化例程:

      [NO.2]

      #include
      int huge Return-SVGA256(void)
      {
      return(0); /* 返回各種分辨率的對應編號 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的系統程序目錄中編譯即可,為什么呢?因為這個驅動程序當然不會是BORLAND公司的產品。這樣做的一個好處是:讓還沒有圖形庫子函數編程經驗的朋友可以直接利用TURBO C圖形庫(GRAPHICS.LIB)嵌入文件GRAPHICS.H中定義的各種繪圖函數。

       這個SVGA圖形驅動程序效果不錯,也能支持大多數的SVGA卡,象ATI、Trident、Tseng等,由于SVGA卡兼容規格的局限性,筆者在一些卡上也碰到了一些問題,如9440卡不支持5號模式,5428卡則不支持1號、5號模式,但不管哪種類型的卡,都支持0號和2號模式。

      (四)函數和優化

       如果大家仔細觀看TURBO C下的系統目錄,就可以發現很多 *.BGI文件。TURBO C圖形系統可分為與機器無關的圖形庫(GRAPHICS.LIB)和以文件形式存在于磁盤上的字體庫(*.CHR)、圖形設備驅動程序(*.BGI)。BGI即Borland Graphics Interface的縮寫,是美國BORLAND公司編出的一套通用圖形接口,如EGAVGA.BGI為 EGA/VGA卡的驅動程序。這是個通過建立功能函數庫而使編程者能在圖形處理上獨立于各類顯示系統的辦法,但出于兼容性的考慮是以犧牲速度作為補償的,而且它也不支持SVGA卡關鍵的256色或真彩顯示,雖然早期的許多游戲(甚至包括一些射擊游戲)確實都是在這些驅動程序上編寫的,但對于現今速度上要求極高的、特別是三維游戲無疑是不現實的。一個最好的辦法就是自行編寫高效的圖形原碼,從畫點做起,進而擴充需要的整個圖形庫。有的朋友可能會說:“象RPG中畫幾條菜單框框慢不了多少時間吧!钡绻磔S平移呢?640×480×256是個什么樣的量級概念!就算慢不了多少,你為什么不能使它更快呢?

       畫點是很重要的一步,幾乎所有的圖形函數都是以它為基礎,下面我為大家提供一個適合于各種分辨率下的高效畫點原編碼:

      [NO.3]
      #include
      void point(int x,int y,char color)
      {
      unsigned put;
      put=y*320+x; /* 分辨率為320*200,若為其他分辨率請換算相應的系數 */
      *((char far *)(0×A0000000L)+put)=color;
      }

       大家在創建自己的功能函數庫的同時,必須注意一些速度上的編程技巧:1.避免乘法和除法,這是相當浪費CPU時間的一種運算,求余數也應該盡可能避免。2.多使用整數,少用浮點數,雙精度那就更慢了。3.減少讀取磁盤文件的操作,一次讀取多量的方式比少量數據的多次讀取要快很多。4.使用Register定義變量,寄存器的速度甚至比內存還快。5.這會是經常犯的毛病,盡量將費時的運算移到循環外進行。

       另外,畫圖子函數在算法上有些需要區別考慮,象斜線的Bresenham算法、填充的優化算法等,這些請大家翻閱相關的數學算法程序書籍。還有呢?那當然是匯編了,匯編是種較難維護的語言,有匯編程序經驗的朋友可以嘗試一些嵌入匯編碼的方法,需要注意的是對匯編語言不同的C編譯程序規定了不同的調用規則。在TURBO C中用修飾符cdecl說明的函數或不加說明的函數按照從右向左的順序將參數壓入堆棧,即給定調用函數(a,b,c)后,a最先進棧,然后是b和c。進入匯編編碼過程后,寄存器BP內容必須存在堆棧中,當前棧指針SP的值存入BP,如果子程序用SI和DI,唯一必存的寄存器為SI和DI,從匯編語言子程序返回之前,必須恢復BP、SI和DI,并重新設置堆棧指針。

       最后一種辦法,實在缺少函數編程經驗的朋友可以通過Internet下載一些支持VGA/SVGA的高效圖形函數庫,這些可是現成可以用的,翻閱README可找到詳盡的函數定義說明!拔乙欢ㄒ肂orland的驅動程序作畫!”那我也不反對,也許明年786就要出來了(笑話)。


      日韩精品一区二区三区高清