概要
精靈是取代3D空間而直接繪制在屏幕上的2D位圖, 通常用來顯示一些玩家信息, 如生命值、生命數或者得分。一些游戲,特別是早期的游戲,幾乎全部由精靈組成。
精靈在屏幕上是按坐標定位的。 屏幕的寬和高和后台緩存是一樣的(意思是如果你的屏幕為800x600的,那么后台緩存就是一個800x600x每個像素所占的內存數的大小的內存塊)。x軸表示屏幕的寬,y軸表示屏幕的高 。一定要注意y軸是從上到下遞增的,而x軸是從左到右遞增的。例如,當你的后台緩存是800x600時,(0,0)表示屏幕的左上角,(800,600)表示屏幕的右下角(請看圖1)
圖1. 一個位於屏幕坐標上的精靈(x 軸 400, y 軸 200)
要繪制精靈,必須先創建一個SpriteBatch對象, 通過調用Begin使其初始化 , 然后對每個精靈調用Draw方法。 精靈的位圖信息可以從Texture2D對象中得到 。為了能使部分紋理透明或半透明,紋理要包含alpha通道信息。你可以用Draw來調節着色,旋轉或者縮放精靈。 這個方法也可以讓你選擇在屏幕上只繪制紋理的一部分。 繪制完后,在調用Present之前調用End。
精靈原點
當你繪制精靈時要理解的最重要的概念就是原點。原點其實就是精靈中指定的一個點,這個點默認是在精靈的左上角(0,0)。Draw方法將使用你指定的屏幕位置作為精靈的原點開始繪制。例如,如果你在沒有為精靈指定一個原點(即使用默認原點)的情況下在(400,200)的位置繪制一個50x 50 像素的精靈,這個精靈的左上角將會在屏幕的(400,200)處。如果你使用 50 x 50精靈的中心(25,25)作為原點,想繪制相同的紋理到相同的位置(即上面的使用默認精靈原點繪制的位置),你就必須在屏幕位置上再加上原點的坐標(位置是425,225,原點是25,25,請看圖2)
圖 2. 藍色的點標記了精靈坐標的中心
當我們旋轉一個精靈的時候,將使用原點作為旋轉的中心。這樣的話,為了方便,我們就應該在屏幕上繪制精靈時普遍使用精靈的中心作為原點。
精靈深度
精靈也有深度的概念,當你繪制一個精靈的時候你可以指定其深度為0到1之間的一個浮點數。深度為0的精靈將在屏幕的最“前面”,他將覆蓋其他深度比他低的精靈。深度為1的精靈將在屏幕的最“后面”,他將被任何深度值小於1的精靈覆蓋。
取樣紋理
精靈是基於Texture2D對象的,其實精靈就是一個位圖 。Draw方法可以繪制整個紋理,或者紋理的一部分。要繪制紋理的一部分,就需要使用sourceRectangle 參數來指定哪些texels作為一個精靈來繪制, texel 其實就是紋理的一個像素。一個 32 x 32 的紋理里包含了1024個texel, 屏幕使用x和y值來指定屏幕上某像素的坐標,紋理的texel坐標也可以使用這種方式指定。指定一個值為 (0, 0, 32, 32) 的sourceRectangle將選擇紋理的左上角的32 x 32區域。
精靈縮放
Draw方法提供了三種縮放精靈的方法。Draw方法可以接受一個統一的縮放參數或者不統一的縮放參數或者是一個源矩形和目標矩形。統一縮放變量是一個浮點數,這個浮點數將和精靈的x和y軸相乘。這將以相等的值縮小或擴大精靈的每個軸,不會改變精靈原來的寬高比。
想要獨立的縮放x和y軸的話,Draw方法接受一個Vector2值作為縮放值。 這個Vector2指定不統一的縮放:Vector2的X和Y域分別指定了x 和 y 軸獨立的縮放值。
Draw方法也接受一個源矩陣和目標矩陣。目標矩陣指定繪制在屏幕上的哪個位置,源矩陣指定了要繪制的texels。Draw方法使用sourceRectangle指定的像素並且獨立縮放他們的x和y軸直到他可以填滿destinationRectangle指定的矩形大小。
精靈轉換矩陣(Sprite Transformation Matrices)
XNA Game Studio為sprite batches提供了一個功能—指定一個轉換矩陣使batch能在繪制前應用到每個精靈上。轉換矩陣可以是任意平移,旋轉或縮放矩陣的組合。這個組合矩陣包含了精靈的位置,旋轉,縮放和深度參數提供給Draw。因為矩陣還可應用到深度上,所以任意z坐標的轉換都可能使精靈深度比1大或比0小,這樣精靈就不可見了。
精靈字體(Sprite Fonts)
XNA Game Studio能讓你使用SpriteBatch繪制文字。DrawString方法使用位置,顏色,旋轉,原點和縮放在屏幕上繪制文字。DrawString還需要一個由SpriteFont類封裝的紋理。SpriteFont在你將一個Sprite Font文件添加到項目中時由內容管道創建。Sprite Font文件包含了諸如字體名和大小的信息, Unicode字符包含在SpriteFont紋理中。當運行時,一個SpriteFont象一個Texture2D對象一樣由ContentManager.Load加載。
Sprite(精靈) Batching
默認情況下,在你調用End之前,SpriteBatch實例不改變任何渲染狀態或繪制任何精靈,這被稱為Deferred模式。在Deferred 模式下, SpriteBatch 將為每個Draw的調用保存信息,直到他相應的End方法被調用為止。當你調用End后,SpriteBatch將該改變顯示設備設置,然后將這個批處理中的所有精靈繪制。然后如果指定了SaveStateMode.SaveState,那么End將會把設備復位。
如果你指定SpriteSortMode.Immediate調用SpriteBatch.Begin(),這將切換到立即模式。在立即模式中,SpriteBatch實例立即改變圖形設備的設置來為繪制精靈做准備,然后,調用Draw 時都將立即使用當前設備設置來繪制精靈。如果調用End時指定了SaveStateMode.SaveState,這將重新復位設備設置。
在立即模式下,當你調用了一個SpriteBatch的實例的SpriteBatch.Begin方法以后,就不應該再調用其他SpriteBatch實例的方法,直到你調用了第一個SpriteBatch的End方法。
Deferred 模式比立即模式慢,但是他允許多個SpriteBatch 實例的Begin和Draw的調用的共同存在而相互之間卻沒有沖突。
渲染狀態(Render States)
在繪制精靈時,SpriteBatch對象設置圖形卡的以下渲染狀態。
Render Stateh | Value |
---|---|
GraphicsDevice.RenderState.CullMode | CullMode.CullCounterClockwiseFace |
GraphicsDevice.RenderState.DepthBufferEnable | false |
GraphicsDevice.RenderState.AlphaBlendEnable | true |
GraphicsDevice.RenderState.AlphaBlendOperation | BlendFunction.Add |
GraphicsDevice.RenderState.SourceBlend | Blend.SourceAlpha |
GraphicsDevice.RenderState.DestinationBlend | Blend.InverseSourceAlpha |
GraphicsDevice.RenderState.SeparateAlphaBlendEnabled | false |
GraphicsDevice.RenderState.AlphaTestEnable | true |
GraphicsDevice.RenderState.AlphaFunction | CompareFunction.Greater |
GraphicsDevice.RenderState.ReferenceAlpha | 0 |
GraphicsDevice.SamplerStates[0].AddressU | TextureAddressMode.Clamp |
GraphicsDevice.SamplerStates[0].AddressV | TextureAddressMode.Clamp |
GraphicsDevice.SamplerStates[0].MagFilter | TextureFilter.Linear |
GraphicsDevice.SamplerStates[0].MinFilter | TextureFilter.Linear |
GraphicsDevice.SamplerStates[0].MipFilter | TextureFilter.Linear |
GraphicsDevice.SamplerStates[0].MipMapLevelOfDetailBias | 0.0f |
GraphicsDevice.SamplerStates[0].MaxMipLevel | 0 |
Point Sprites(點精靈)
點精靈是繪制在3D空中的精靈。這些精靈指定位置和大小。當繪制點精靈時,它的大小是不變的(無論3D空間中的相機如何變化)並總是朝向相機。點精靈被用來繪制粒子系統。