和以往一樣,我們先來建立一個新的XNA項目。為簡單起見,這裡不使用遊戲架構,因此無需添加對它的引用或更改遊戲類的繼承結構;它仍然派生自Microsoft.Xna.Framework.Game類。
我們需要向遊戲類中添加一些類層級的變數以便管理將要渲染的情境。
private BasicEffect _effect;
private VertexPositionColor[] _vertices = new VertexPositionColor[4];
接下來,需要設定這些變數以便用於XNA中。此處所需的代碼會被添加到Initialize函數中。
這裡首先要做的是設定投影矩陣。我們將在下一章詳細地討論該內容,目前只關注它的主要任務,建立抽象座標系統。正如在下面代碼中看到的,螢幕的寬高比是由視區的寬度除以其高度來確定的,該比例值用於初始化矩陣。它可以確保在螢幕上繪製的對象始終為方形。
protected override void Initialize()
{
// Calculate the screen aspect ratio
float aspectRatio = (float)GraphicsDevice.Viewport.Width /GraphicsDevice.Viewport.Height;
// Create a projection matrix
Matrix projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45),aspectRatio, 0.1f, 1000.0f);
}
注意矩陣是通過調用Matrix結構的靜態方法進行初始化的。正如將在後面看到的,我們有多種方法來建立所有類型的矩陣。
接下來是建立視圖矩陣。它可以比作是情境內的攝像機,用來控制被渲染對象的可見度以及在螢幕中出現的範圍。下面代碼中展示了樣本項目中建立視圖矩陣的方法。
// Calculate a view matrix (where we are looking from and to)
Matrix view = Matrix.CreateLookAt(new Vector3(0, 0, 10), Vector3.Zero, Vector3.Up);
現在,我們需要建立一個效果對象來告知XNA應該如何將圖形渲染到螢幕中。所有的渲染都需要某種效果,而且在XNA的Windows Phone 7實現中也提供了幾種。
當執行個體化效果對象時,會傳入一個圖形裝置的引用,然後設定一系列的屬性以控制它的行為。這些就是在本章開頭處討論的狀態值。下面代碼展示了效果對象的建立和初始化。注意傳遞到其中的值是剛剛建立的投影和視圖矩陣。
_effect = new BasicEffect(GraphicsDevice);
_effect.LightingEnabled = false;
_effect.TextureEnabled = false;
_effect.VertexColorEnabled = true;
_effect.Projection = projection;
_effect.View = view;
_effect.World = Matrix.Identity;
現在已經完成了環境的初始化。不過還沒有進行任何繪製,在繪製之前需要關注一下這些內容。
如前面所述,在XNA中傾向於使用頂點來定義對象。通過它們來構造實心三角形從而形成在螢幕中看到的圖形。
頂點可以包含很多資訊。它們始終包含位置資訊,除此之外,還可能包含顏色資訊,紋理資訊以及其他影響繪製方式的資料。XNA為常見的頂點結構提供了很多內建的配置資訊,我們將會用到一個叫做VertexPositionColor的結構。顧名思義,它只儲存了位置和顏色資訊。
我們的樣本會在螢幕中繪製一個簡單的正方形。要向XNA描述該正方形,必須建立一個頂點對象的數組,描述每個頂點的位置和顏色。圖展示了用於組成這個正方形的頂點。座標(0,0,0)在正方形的正中間,正方形橫跨了x軸和y軸的2個單位(從每條軸上的的-1到1)。注意所有頂點的z座標都為0,所以正方形是平面的。
初始化過程的最後是為每個頂點提供顏色。這會在渲染時產生極富吸引力的效果——在使用精靈時如果不產生富含各種顏色的紋理是很難輕鬆實現這種效果的。餘下的頂點初始化過程以及最終的Initialize函數。
_vertices[0].Color = Color.Red;
_vertices[1].Color = Color.White;
_vertices[2].Color = Color.Blue;
_vertices[3].Color = Color.Green;
base.Initialize();