本文章支援格式為XNA 1.0 版本,1.0以上的版本請事情況自行調整
首先在進入XNA時,從基本的先來體驗,將一張2D的圖片用XNA的處理來呈現在程式裡面吧。
首先,先開啟C# EXPRESS 2005,在【File】->【New Project】,選擇Windows Game這個專案。
除了建構子以外,會先看到幾個精靈所建置的Function
1. Initialize : 初始化函式,在這個函式初始化,在遊戲執行時期的物件內容。
2. LoadGraphicsContent : 讀取圖片內文,用來載入想要開啟的圖片或是即將繪製在Graphics Device上面的元件。
3. UnloadGraphicsContent : 卸載已經被載入的元件,檔案等等。
4. Update : 用來即時更新所有現在繪製的圖形,可能像是被旋轉的之類等等,更新過後再重新繪製。
5. Draw : 繪製。將所要顯現的結果繪製出來。
在新開專案後,可以按下F5,先看看建置結果,出來應該是一個天空藍的視窗。
看看精靈除了建置函數以外還有做哪些事情。
在主程式裡面,一開始就會看到兩個事先宣告的物件。
GraphicsDeviceManager graphics;
ContentManager content;
GraphicsDeviceManager : 處理圖型設備的設定和管理。
ContentManager : 是執行期間的元件,用管線處理的方式載入管理Binary檔案。
接下來開始準備開始在程式中繪製一個2D紋理。
首先我們要加入兩個新的物件,Texture2D和SpriteBatch。
Texture2D myTexture;
SpriteBatch spriteBatch;
Texture2D用途式呈現一個2D的方格圖片。
SpriteBatch能夠繪製一組圖片使用相同的設定。
再來要將圖片加入置專案,在Solution Explorer中,對著專案按下右鍵選擇Exits Item(一般會建立一個content的資料夾),尋找要加入的圖片。
加入完成後,接下來再LoadGraphicsContent函數中,加入依些載入資訊。
myTexture = content.Load<Texture2D>("GameThumbnail");
spriteBatch = new SpriteBatch(graphics.GraphicsDevice);
用ContentManger來載入所以開啟的圖檔,使用ContentManger的Load函式來載入。
因為ContentManger用來開啟和管理執行中的文件,可能你目前載入的文件是文字格式,或是圖檔等等。
而Load函式是一個樣板函式<T>用來將回傳值轉型,以上述例子所說,現在希望將回傳值轉成Texture的格式,所以在Load的函數中<T>填上<Texture2D>。
而函數所要填上的變數,就是要開啟的檔名字串。
SpriteBatch這個物件比較建議在Initialize這個函數中進行初始化,當然也可以在準備載入圖片的時候載入。
建構這個這個物件的時候需要傳入一個GraphicsDevice的物件,所以我們必須用GrapicsDeviceManger來取得關於GraphicsDevice資訊。
現在背景資料都已經載入完畢,像是開啟圖片至Content Pipeline等等。
再來把裡面的東西呈現出來,用Draw函式來繪製。
跟DirectX一樣,在繪製的時候,須要先清除緩衝區,而在XNA也類似這種工作。
用GraphicsDeviceManger的GraphicsDevics中的Clear函數,將背景清除,函數的傳值就是Color類別,可以指定要將背景清除的顏色。
graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
清除完背景過後,就是要開始繪製,在這邊可以直接用SpriteBatch.Begin不使用參數直接告訴設備我準備要繪製,或是設定blend選項。
spriteBatch.Begin(SpriteBlendMode.AlphaBlend);
告訴設備要開始繪製後,接下來就是真正的輸出,使用SpriteBatch中的Draw來繪製。
spriteBatch.Draw(myTexture, Object, Color.White);
函數參數(繪製的紋理,圖形要放置的位置,顏色填充)。
圖形位置,是一個二維的向量座標或是一個矩形區域。
顏色填充的部分,目前不清楚出來的效果。
告訴設備已經繪製完成。
spriteBatch.End();
注意 : 第一次直接寫的時候可能會發生,無法找到載入的圖片資料,這個時候在Solution explorer點選要載入的圖片,在Properties中的XNA FrameWork Content中要選擇"True",否則執行期間將會發生錯誤。
範例連結 :
下載

嗯~~我還想問個問題 這已經算是2D貼圖的慣例了吧XD 就是XNA怎麼去指定我要不顯示出來的顏色呢? 就只是想顯示圖中特定形狀而已
這部分我還要在看一下 因為在DRAW這個函數當中的有一種格式,最後一個變數可以決定哪個顏色不要畫出來,只是我上次用都沒有反應
請問一下 我將JPG圖加入CONTENT 接著直接COMPILE 他會把JPG轉成XNB檔~~~這樣變超大的 為什麼要這樣呢?~~~這樣有甚麼好處?
目前這個問題,我沒有辦法給你正確的答案。(因為連我自己都不確定) 我是這樣想的,如果沒有了CONTENT PIPELINE,這樣在PC上也許不會有問題,但是XBOX360認得JPG、GIF檔案嗎? 也許XNB就是跨平台的一個主要媒介... 再來就是你用TEXTURE2D,你覺得效率好嗎?也許現在只是單純載入一張圖片,或是10幾20張,可是當如果要載入很多的話,這樣怎麼辦呢,效能一定會有差別,CONTENT PIPELINE會幫你管控好,所以不用擔心... 至於XNB檔案很大的問題,這個XNA開發小組有意識到...為什麼這樣說呢,XACT這個應該有聽過吧,他只支援WAV檔案,編譯後只可以存程PCM這種大型體積的檔案。在XACT3.0呢新增了WMV檔案,大幅壓縮的檔案(我做過實驗,我用XACT2.0容量500MB,用3.0以後才50MB) 所以他們有注意到這個問題也在改進當中,目前雖然檔案很大,但是後面可能就會慢慢改進了...(除非他們,想要讓一個小遊戲用一個DB儲存...)
因為XNB太大了~~我現在都用Texture2D.FromFile來載入 但是有點不高興這樣用!! 用Content.Load來載入圖檔
只能載入XNB檔嗎?
有地方可以讓他載入其他檔案嗎?
這個問題我就有點看不太懂了,可能要請你詳細解說一下
若用Content.Load("pic");
則他會載入Content目錄下的pic.xnb
但是我想要他載入pic.jpg就沒辦法了嗎?
因為我有十張左右不同時候要用到的JPG圖
本來總共只有一百多K~但是若要轉成XNB會變十多MB
我作業可是要用EMAIL寄的
這樣會死人啊!!
所以目前我是用Texture2D.FromFile這個方法載入圖檔
這樣可以直接載入JPG檔而不用轉成XNB了
畫面上要顯示的2D圖形雖然已經整合成一張
但是總不能遊戲裡全部的2D圖形只合成一張吧
總還是會分類一下
你沒有這個困擾嗎?
我是直接用電腦DEMO的 雖然空間一直被XNA給吃掉,如果你懂得怎麼改寫content pipeline的話,或許可以找到方法降低空間... 我目前都是用CONTENT PIPELINE
恩~~今天研究了很久還是找不到有關於指定顏色透明的語法 最後在網路上發現原來也有人使用繪圖軟體來修改圖片讓它可以不要的地方透明 之後慣了軟體自己試了一下 發現目前只有PNG檔案的格式才可以透明 存成JPG的話會將沒有顏色的部份弄成白色 = =|||這問題居然這麼困難 還是希望看到別的方法解決
原本想要寫一篇新的文章來說一下,結果ORZ 剛剛全選,不小心按到一個按鍵,就不回來變成空白的,所以現在不太想寫= =" 還有另一個做法是DDS,他跟PNG的方式類似,只是DDS他提供專門的Alpha的數值。 要做DDS圖片可以用Photoshop或是DIRECTX sdk上面的工具去完成。 補充 : XNA預設的SpriteBatch是自動開啟Alpha值的讀取,你可以用SpriteBatch.Begin(SpriteBlendMode.None);可以去看看這樣的效果如何
恩~~這個範例也是有看到過 不過因為他要的軟體我沒有所以就沒有試了 可是基本上這樣應該都算是運用軟體來解決不太算用程式 我之前有碰過一點Python的pygame這個函式庫(也算是微軟做的) 他在2D上就比較方面只需要指定哪個顏色不要顯示出來就好了 分別給他RGB的值就有函式可以達成了 不知為何XNA卻沒有反而這樣使用有點麻煩~~XD 話說我還有個問題不知道要去哪問所以在這裡順便問一下 就是做完的專案可不可以弄成EXE檔 在別的電腦在沒有灌XNA也沒有C# Express的狀況下執行遊戲
對方沒有安裝XNA執行XNA開發的程式... http://blog.pixnet.net/teexit1224/post/15511476 你可以參考這一篇... 關於XNA2D方面我比較不清楚,不過我目前看到現在的處理方是大多是PNG跟DDS的方式,DDS你可以安裝DIRECTX SDK。 還有就是SpriteBatch.Draw()雖然有一個參數是設定顏色,不過那個算是遮罩,跟Alpha遮罩不一樣。只是順便提一下。