正文

GDI圖形編程(12)

Windows移動游戲開發(fā)實戰(zhàn) 作者:(美)Adam Dawes


 

如果您想修改該圖形文件,只需要用圖像編輯器從Resources目錄中打開它,修改后進行保存即可。每次編譯時Visual Studio都會自動選擇該文件的最新版本。

將圖形嵌入后,我們需要知道如何通過代碼來讀取它。這是通過Assembly.GetManifest-

ResourceStream函數(shù)來實現(xiàn)的。我們只需要將包含了圖形文件程序集的路徑作為一個字符串傳遞給該函數(shù)即可。該路徑包含了幾個元素,元素之間用句點分隔:

● 程序集的名稱;

● Solution Explorer窗口中包含了資源文件的目錄的名稱(子目錄用句點來分隔,而不是DOS路徑格式中的反斜杠)。這個元素只有在需要時才出現(xiàn);

● 資源文件的文件名。

所有這些元素都是區(qū)分大小寫的。

可以用下面的代碼來編程檢索程序集的名稱:

String AssemblyName = Assembly.GetExecutingAssembly().GetName().Name;

通過代碼來查找程序集的名稱意味著,當(dāng)您決定修改程序集的名稱后,代碼仍然可以繼續(xù)正常工作。因此我推薦您使用這種方法。一旦使用了這個方法,我們會將重點放到目錄及文件名上,這樣才能得到完整的資源名稱。然后將資源名稱傳遞到GetManifestResourceStream函數(shù)中,就能以Stream的方式獲得圖形資源,Bitmap對象的一個構(gòu)造函數(shù)能夠識別Stream對象。將所有這些操作組合到一起,我們就得到程序清單3-9。

程序清單3-9  從一個嵌入資源中載入位圖圖像

// Declare the Bitmap object that we are going to create

Bitmap myBitmap;

private void InitializeBitmap()

{

// Get the assembly name

String AssemblyName = Assembly.GetExecutingAssembly().GetName().Name;

// Add the resource path and name

String ResourceName = AssemblyName + ".Resources.Rocket.png";

// Generate the resource bitmap -- this will contain our spaceship image

using (System.IO.Stream str =

Assembly.GetExecutingAssembly().GetManifestResourceStream

(Resor-uceName))

{

myBitmap = new Bitmap(str);

}

}

如果指定的資源名稱不正確,則GetManifestResourceStream函數(shù)也不會拋出異常,而是返回null。當(dāng)您在實例化一個Bitmap對象時如果碰到一個NullReferenceException異常,那么最大的可能就是由于資源名稱不正確所造成的。為了能夠?qū)@種情形做出有用的響應(yīng),最好是將該操作放在一個try/catch代碼塊中。這樣在捕獲了一個NullReferenceException異常后,您可以提供一條更加有用的錯誤消息。以后當(dāng)您不知道項目為何不啟動時這樣做能減少很多令人頭疼的問題。

2. 從文件中讀取圖形

在一些情況下,您還是會希望將圖形存放在單獨的文件中。例如,允許用戶選擇文件夾來存放不同的圖形,或者允許用戶提供自己的圖形。要將圖像從一個文件加載到一個Bitmap對象中,只需要在實例化對象時提供該文件的文件名即可:

myBitmap = new Bitmap("Graphics.png");

如果指定的圖像文件不存在,那么系統(tǒng)會拋出一個FileNotFoundException異常。

3. 關(guān)于圖形文件格式的一個注意事項

在對用于游戲中的圖形文件進行保存時,可以對圖形文件的格式進行選擇。有些格式明顯要比其他格式好,下面對它們做個總結(jié):

● BMP(Bitmap,位圖)文件使用了一個簡單的內(nèi)部結(jié)構(gòu),因此用圖形庫可以非常容易地與它進行交互。其原因之一是該格式?jīng)]有應(yīng)用任何壓縮。所以,BMP文件的體積可能會比其他圖形格式文件大很多。沒有什么原因需要必須使用BMP文件,所以盡量避免使用它們。

● GIF(Graphics Interchange Format,圖形交換格式)文件已經(jīng)成為了一個使用很廣泛的圖形格式,而不只是被Web所采用。它可以存儲最多256色的圖片并且對內(nèi)容進行了壓縮以減小文件的大小。它采用了無損壓縮的方式,所以圖片質(zhì)量不會下降。在GIF文件中可以存儲簡單的動畫,但在.NET CF中該功能會被忽略,因此沒有為我們提供什么優(yōu)勢。它是合適的圖形存儲格式,不過在壓縮率方面,PNG文件更為強大。

● PNG(Portable Network Graphics,便捷網(wǎng)絡(luò)圖像)文件是最近才開發(fā)的文件格式,.NET CF支持該文件格式。它可以用24位真彩色來保存圖像,并且還支持alpha(透明度)信息。與GIF文件一樣,它也采用的是無損壓縮,但文件要小于GIF格式的文件。對于非照片圖像,我推薦采用這種文件格式。

JPG(JPEG的縮寫,Joint Photographic Experts Group開發(fā)了這種格式)文件使Web發(fā)生了變革,并且在很多其他領(lǐng)域也成為成熟的技術(shù),例如數(shù)碼相機。這個格式強大的壓縮能力可以使圖像文件比未壓縮時小很多,遠遠超過了GIF和PNG能提供的壓縮率。然而問題在于,JPG使用的是有損壓縮技術(shù):對圖像進行解壓縮后,就不能精確地恢復(fù)成原始圖像。壓縮后的JPG圖像的打開速度快但圖形會失真,對于那些包含了高對比度色彩區(qū)域的圖像來說最為明顯。例如那些在電腦游戲中常常出現(xiàn)的圖片。JPG文件對減小照片圖像的文件大小很有幫助,但不太適合手繪的游戲圖片。即使對于照片圖形,要注意不要把圖像壓縮到失真的地步。


上一章目錄下一章

Copyright ? 讀書網(wǎng) ranfinancial.com 2005-2020, All Rights Reserved.
鄂ICP備15019699號 鄂公網(wǎng)安備 42010302001612號