【WP7進階】——XNA遊戲精靈放大、旋轉、層深度

遊戲不少都是涉及到操縱遊戲精靈的相關知識,本篇仍是根據遊戲精靈的一些經常使用知識作的學習,下面是本文大綱:ide

  • 精靈界面居中
  • 精靈放大而且旋轉
  • 紋理的層深度

精靈在界面居中

上篇文章咱們爲遊戲添加一個背景圖片,接下來咱們但願不讓遊戲精靈走動了,而是讓其在遊戲的正中間停靠。學習

默認Window.ClientBounds這個矩形塊能夠得到當前設備的寬度和高度-(這裏是絕對寬度和高度,不管你屏幕如何旋轉它始終獲取原始寬高。this

而使用graphics.GraphicsDevice.Viewport 獲取設備的寬高則是經過上面設置的PreferredBackBuffer 屬性獲取而來。這個是二者的區別spa

使精靈界面居中,代碼以下:code

// 這個方法在xbox 中能夠
             
// vect = new Vector2(
             
//    (Window.ClientBounds.Width/2)-(user.Width/2), 
             
//    (Window.ClientBounds.Height/2)-(user.Height/2)
             
//    );
            
// Windows Phone 7 最好使用這個,用這個方法能夠精肯定位精靈到屏幕的中心點
             vect  =   new  Vector2(
               (graphics.GraphicsDevice.Viewport.Width 
/   2 -  (user.Width  /   2 ),
               (graphics.GraphicsDevice.Viewport.Height 
/   2 -  (user.Height  /   2 ));

 

運行效果以下:對象

精靈放大而且旋轉

spriteBatch.Draw 有多個重載方法,其中使用如下的重載方法能夠實現精靈的放大而且設置其旋轉方式:blog

使用代碼以下:排序

 

spriteBatch.Draw(user,  // 要繪製的紋理  
              vect   // 繪製圖像的左上角座標
               ,  null // 容許您繪製原始圖像的一部分,這裏使用null
               , Color.White  // 染色顏色 
                ,  0   // 旋轉圖像,如今使用0
                , Vector2.Zero   // 指定旋轉的參照點,如今使用Vector2.Zero
                ,  1.5f        // 綻開比例,使用1表明按照原始尺寸繪製,1.5f 表示放大圖像到150%
                , SpriteEffects.FlipVertically, // 使用SpriteEffects 枚舉來垂直或水平翻轉圖像
                 0     // 容許您指定圖像的層疊次序(哪張圖像在其它圖像之上),如今使用0
                );

 

運行效果以下:遊戲

 

紋理的層深度

一個遊戲會有不少紋理圖像,若是當純以上篇所說的,控制畫的位置那是不現實的。而XNA 可讓您爲每一個圖像指定一個層深度,使圖像老是能有正確的Z次序。要修改層深度,須要使用SpriteBatch.Begin 方法的另外一個重載版本。其中它的重載參數爲以下:圖片

SpriteSortMode

 定義渲染精靈的排序械,有五個模式

  • Deferred:精靈不會被繪製直到SpriteBatch.End 被調用,而後End 以它們被調用的次序送到圖形設備中。在這個模式下,操做多個SpriteBatch 對象時它可讓Draw 調用不會產生衝突。這是默認模式。
  • Immediate:Begin 調用會當即設置圖像設備,Draw 調用會當即進行繪製。同一時間只能一個SpriteBatch 對象被使用。這是最快的模式。
  • Texture:和Deferred 模式同樣,可是精靈在繪製以前按照紋理進行排序。
  • BackToFront :和Deferred 模式同樣,不過精靈按照層深度參數從前日後排序。
  • FrontToBack:和Deferred 模式同樣,不過精靈按照層深度從後往前排序。

BlendState

決定精靈顏色怎樣和背景色混合,有三個模式:

  • None :不進行顏色混合。
  • AlphaBlend :使用alpha 值進行混合,這是默認模式,並開啓透明效果,像以前提到的,若是您有帶透明背景的圖像,就應該使用AlphaBlend。
  • Additive :將精靈顏色和背景顏色進行混合 。

那行明白上面的原理,咱們按照上面給出的意思而且咱們將代碼的位置調換一下,以後的代碼將會是這樣:

 

  protected   override   void  Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);

            
//  TODO: Add your drawing code here
            spriteBatch.Begin(SpriteSortMode.FrontToBack,BlendState.AlphaBlend);    // 給spriteBatch下命令準備開始動做

             
            
// 畫背景圖
           
            
// 將user 按Vector2指定的位置開始畫圖
            
// spriteBatch.Draw(user, vect, Color.White);
            spriteBatch.Draw(user,  // 要繪製的紋理  
              vect   // 繪製圖像的左上角座標
               ,  null // 容許您繪製原始圖像的一部分,這裏使用null
               , Color.White  // 染色顏色 
                ,  0   // 旋轉圖像,如今使用0
                , Vector2.Zero   // 指定旋轉的參照點,如今使用Vector2.Zero
                ,  1.5f        // 綻開比例,使用1表明按照原始尺寸繪製,1.5f 表示放大圖像到150%
                , SpriteEffects.FlipVertically, // 使用SpriteEffects 枚舉來垂直或水平翻轉圖像
                 0     // 容許您指定圖像的層疊次序(哪張圖像在其它圖像之上),如今使用0
                );

            spriteBatch.Draw(background, rect, Color.White);
           
            
// 中止時打印出stop
            spriteBatch.End(); // 給spriteBatch下命令結束動做
             base .Draw(gameTime);
        }

 

從上面的代碼看到,背景圖在精靈圖以後再畫,那麼以上篇給出的建議是否是背景圖會覆蓋掉精靈呢?看圖示:

 

代碼下載:

遊戲DEMO

相關文章
相關標籤/搜索