XNA 4.0在聲音的部分新增加了麥克風的功能,現在可以使用麥克風來錄製聲音。
這個功能支援WP7、Xbox 360和PC等具有麥克風的產品。
我們可以藉由這項功能,來豐富話我們的遊戲。
這邊就提供簡單的範例程式。用麥克風這項功能主要是會用到Microphone這個物件。
如果在標頭的地方沒有using Microsoft.Xna.Framework.Audio請手動加入。
XNA 4.0在聲音的部分新增加了麥克風的功能,現在可以使用麥克風來錄製聲音。
這個功能支援WP7、Xbox 360和PC等具有麥克風的產品。
我們可以藉由這項功能,來豐富話我們的遊戲。
這邊就提供簡單的範例程式。用麥克風這項功能主要是會用到Microphone這個物件。
如果在標頭的地方沒有using Microsoft.Xna.Framework.Audio請手動加入。
模型是由很多Vertex所組成的,在content pipeline中會將3D model轉換成XNB檔案。
然後在Content.Load這個指令再去讀取XNB檔案。
讀取進來以後,裡面就會有3D model有的資料(像是vertex, normal, texture coordniate等)
而我們要如何取出這些資訊呢?
我們需要準備N個容器(如果只要抓取Vertex就只要一個容器即可)。
在很早之前的文章,有針對XNA 1.0的版本做3D模型顯像的範例程式說明。
使用著還是可以參考之前的說明,然後對照看一下即可。
兩著不會差異太多。
要將模型顯像出來,首先需要宣告一個Model的物件
可以在類別中空白位置宣告一個變數
在XNA 4.0中,針對Audio的部分提供一個方便用好用的方法供使用者使用。
現在你可以將你的MP3 Content放在網路上面,然後再XNA用streaming的方式來播放音樂。
要使用這個功能相當的簡單!!
1. 開啟你的XNA 4.0專案。
2. 在initialize的函數中,打入以下程式碼
XNA 4.0提供狀態物件,狀態物件將原本以往零零散散的屬性設定變成一個單一個物件。
像原本3.0的時候,我們要將要將3D模型用網格畫出來,我需要設定特定的屬性。
設定Cull模式,也是要設應特定的屬性。
每次要找那些屬性都是一個頭兩個大,而在這次新的改版中,XNA 4.0提供
BlendState, DepthStencilState, RasterizerState, 和SamplerState,讓程式設計師使用。
比較常用的是
RasterizerState: 設定Cull模式(順時鐘或是逆時鐘),設定填滿模式(填滿或是網格)。
SamplerState: 設定貼圖取樣方式。在使用者自訂的shader code當中,我們可以在shader設定
貼圖取向的方式,如:
texture diffusemap;
sampler mdiffusemap;Sampler = sampler_state
{
texture = <diffusemap>;
magfilter = LINEAR;
minfilter = LINEAR;
mipfilter = LINEAR;
AddressU = CLAMP;
AddressV = CLAMP;
};
上述程式碼是使用shader的方式控制貼圖取樣。
而現在XNA 4.0讓你也可以在程式碼當中指定類似這樣的事情。
EX:
SamplerStateCollection temp = GraphicsDevice.SamplerStates;
temp[0].Filter = TextureFilter.Linear;
用這種方式來設定第0張貼圖的資訊。
XNA 4.0在特效上面提供更多的選擇讓使用者選擇使用,而這些效果都是可以支援到Reach和HiDef兩個Profile。
這次XNA 4.0提供的特效如下所示:
1. Basic Effects: 提供基本的Blinn-Phong打光效果,這是在之前的XNA版本就有提供的操作,設計者可以
自行開啟打光效果,設定相關參數設定等等。
2. Dual Texture Effects: 雙重貼圖效果,使用兩張貼圖並使用混合的方式達到更多樣的效果。(像是使用者
可以先貼上基本的貼圖,然後再貼上一張細節貼圖,增加模型的好看效果)
3. Alpha Test Effects: 提供一種方式來做Alpha的測試效果。
4. Skinned Effects: 這個效果是提供給Skinned(3D模型的變形)所使用的效果。(最多可以支援到72個骨頭,
每個骨頭最多可以有四個不同的權重。
5. Environment Map Effects: 使用環境貼圖的特效。
基本上上述五個特效,主要是補足Reach的不足。因為Reach並不支援使用者自訂的特效。所以我們可以藉由上述
五個預設的特效來做到我們需要的效果。
XNA 4.0在顯示上面(包含RenderTarget和一般直接顯像)有提供兩種不同的Profile,Profile根據文件所說指的就是硬體所提供的功能。
每個繪圖卡都可能會提供不同的功能,像是有些繪圖卡提供浮點數運算的材質貼圖,有些沒有這個功能等等。
在之前的XNA版本中,XNA主要受限這個限制所以有時候會發生一種情況...
明明寫了一個RT相關的程式,結果在自己的電腦跑不出來該有的效果,然後拿到別台又OK的情況...
在新版的XNA 4.0中,特別在RT上面提供兩種不同的格式: Reach和HiDef。
Reach主要適用於所有XNA可以支援的平台,包含PC、360和WP7等。
HiDef支援360和部分PC(需支援DX10顯卡)可能大家看了應該就很高興了,竟然會用到DX10顯卡的功能!!
這意味是不是XNA開始提供DX 10的功能了呢!?
這是否定的!XNA主要架構還是建立在DX9的SDK上面,會使用DX10顯卡,主要是確保顯卡能夠提供足夠的功能
(包含貼圖格式的屬性、大小限制等等)
要如何設定現在使用的是Reach還是HiDef格式呢?
在Initialize的地方:
graphics.GraphicsProfile = GraphicsProfile.HiDef;
這樣就是設定顯像方式的貼圖設定是使用HiDef的規格。
目前個人見解是... 如果是PC或XBOX360的遊戲開發,直接使用HiDef的格式比較好,提供的支援比較大。
兩個模式比較結果如下。
支援但是存有些限制(不支援Wrap重複貼圖模式、不支援MIPMAP、DXT壓縮格式需要2的指數次方)
這部份算官方文件的一部分,因為剛好也在學習中,所以就把所知道的東西分享出來。
WP7最低解析度800*480。如果要從ZUNE的專案改到WP7,解析度部分需要調整。(ZUNE HD 480*272)(ZUNE240*320)
針對解析度調整的部分,有兩種方式可以設定:
1. 由美術手動調整材質資源的大小(像是貼圖的大小調整)。
2. 由內建的硬體調整(也就是更改目前顯示的解析度)。對於上述所說的方法,第一種是不太建議的,通常都是使用第二種方法來做解析度的調整。
要調整解析度只需要更改preferred back buffer的大小即可,像是:
在Initialize的函數中的程式碼中
graphics = new GraphicsDeviceManager(this);
graphics.PreferredBackBufferWidth = 272;
graphics.PreferredBackBufferHeight = 480;
建立好GraphiceDeviceManager後可以使用graphice的物件來做preferred back buffer大小調整。
解析度調整過後,還需要針對於輸入操作上面做調整。在WP7上面你可以使用觸控或是加速器的資訊來做輸入的操作。
在觸控操作這邊需要手動加入一個標頭檔"Microsoft.Xna.Framework.Input.Touch"
在程式碼的最上方加入using Microsoft.Xna.Framework.Input.Touch,如此一來就可以開始寫觸控上面的操作。
在加速器的部分,這部分主要是由Microsoft Windows Phone Developer Tools CTP所管理的,並非XNA的framework內容
,所以需要引入Microsoft.Devices.Sensors來做加速器的資訊取得。
在WP7的儲存資源部分與ZUNE上有些微的不同,原本的在XNA 3.1之前都是使用StorageContainer.TitleLocation來設定儲存的設定。
不過StorageContainer.TitleLocation在4.0當中是已經不被准許的操作(這個方法被移除掉了)
如果要存取檔案的部分,這邊需要使用OpenStream的方式來做存取操作。
EX:
long size;
void openFile()
{
try
{
System.IO.Stream stream = TitleContainer.OpenStream("ship.dds");
System.IO.StreamReader sreader = new System.IO.StreamReader(stream);
// use StreamReader.ReadLine or other methods to read the file data
Console.WriteLine("File Size: " + stream.Length);
size = stream.Length;
stream.Close();
}
catch (System.IO.FileNotFoundException)
{
throw;
}
}
檔案存取的部分,可以用上述方式取得資料。但是,如果要將使用者的資訊儲存在WP7上面的話,需要使用IsolatedStorageFile.GetUserStoreForApplication來存取使用者個別的資料。
現在網路上面開始有些教學文件交使用者怎麼開發WP7的遊戲程式。
現在推薦一個簡易的PDF文件
裡面有交怎麼樣開發XNA的WP7遊戲程式
http://charlespetzold.com/phone/index.html
接下來就是進行實作的部分,時做的部分這邊我只說明實作可能會想問的問題,詳細內容各位可以下載原始的程式碼。
(本範例程式碼,包含使用基本的basicEffect特效將模型顯示)
模型的部分,這邊我是使用OBJ檔案格式,在XNA Creater club上面有一個範例,裡面是使用自定的content pipeline來將obj檔案資訊分析出來,這邊我們就直接運用它即可。
在renderer.cs的程式碼中,裡面有一個函數use_BasicEffect程式碼如下
1: public void use_BasicEffect()
2: {
3: for (int i = 0; i < scene_model.Length; i++)
4: {
5: foreach (ModelMesh mesh in scene_model[i].Meshes)
6: {
7: foreach (BasicEffect effect in mesh.Effects)
8: {
9: effect.EnableDefaultLighting();
10: effect.World = Matrix.Identity;
11: effect.View = camera.View;
12: effect.Projection = camera.Projection;
13: }
14: mesh.Draw();
15: }
16: }
17: }