Silverlight C# 遊戲開發:L9 天空盒

在前面的篇節中,基本上完成了一個Silverlight3D世界的構建,此時只需要一些邏輯和代碼就可以完成完整的遊戲,而今天我將最後一個部分補充:天空盒(SkyBox)。說到天空盒,以前學過D3D的朋友一定不陌生,其實就是六面方盒子,使用透視錯覺產生是一個球形。

 

從上圖可以想想,由6張圖片可以組合封閉空間,所以先準備上面的這樣的一張圖,我直接從別的地方借來了6張標準的SkyBox圖片,關於SkyBox的圖片可以請3D美術師幫助,或者藉助網絡資源,另外,有一些專門製作天空盒的軟件。

最先需要準備圖片,把他們加入到工程中

  

我爲了方便,這次不再構建很大的獨立控件,而是通過繼承的方式直接獲得之前寫過的類:

  1. public class Lesson09 : Lesson04  
  2. {  
  3.     public Lesson09()  
  4.     {  
  5.     }  

 

關於Lesson04,可以參見: Silverlight C# 遊戲開發:L4 模型組和簡單的動畫

我們將完成下面的這張截圖的效果: 

 

在繼承完了以後,需要對lesson04類做一些小小的改造,比如將Execution.Game給protected出來,將其中的DispatcherTimer的Tick事件執行方法virtual,這樣可以幫助Lesson09少寫很多的代碼。

  1. public class Lesson09 : Lesson04  
  2. {  
  3.     public Lesson09()  
  4.     {  
  5.         //創建天空盒  
  6.         Skybox skybox = new Skybox();  
  7.         //天空盒6個方向的指定貼圖  
  8.         skybox.Back = new ImageMap(Runtime.Instance.ContentManager.Load<Balder.Imaging.Image>("/Balder_Studio;component/SkyBox/cloudy_noon_BK.png"));  
  9.         skybox.Bottom = new ImageMap(Runtime.Instance.ContentManager.Load<Balder.Imaging.Image>("/Balder_Studio;component/SkyBox/cloudy_noon_DN.png"));  
  10.         skybox.Front = new ImageMap(Runtime.Instance.ContentManager.Load<Balder.Imaging.Image>("/Balder_Studio;component/SkyBox/cloudy_noon_FR.png"));  
  11.         skybox.Left = new ImageMap(Runtime.Instance.ContentManager.Load<Balder.Imaging.Image>("/Balder_Studio;component/SkyBox/cloudy_noon_LF.png"));  
  12.         skybox.Right = new ImageMap(Runtime.Instance.ContentManager.Load<Balder.Imaging.Image>("/Balder_Studio;component/SkyBox/cloudy_noon_RT.png"));  
  13.         skybox.Top = new ImageMap(Runtime.Instance.ContentManager.Load<Balder.Imaging.Image>("/Balder_Studio;component/SkyBox/cloudy_noon_UP.png"));  
  14.         //激活天空盒,如果沒有激活則不會顯示出來  
  15.         skybox.IsEnabled = true;  
  16.         //指定  
  17.         game.Skybox = skybox;  
  18.     }  
  19.     double _sin = 0;  
  20.     //重寫Lesson04中的Timer動畫  
  21.     protected override void _dispatchertimer_Tick(object sender, EventArgs e)  
  22.     {  
  23.         //首先執行原來的  
  24.         base._dispatchertimer_Tick(sender, e);  
  25.         //判斷是否存在攝像機  
  26.         if (game.Camera == null)  
  27.             return;  
  28.         //按照Sin曲線計算x,y,z的值,使之圍繞瀏覽Camera的TargetPoint  
  29.         var x = System.Math.Cos(_sin) * 250;  
  30.         var y = System.Math.Sin(2*_sin) * 250;  
  31.         var z = System.Math.Sin(_sin) * 150;  
  32.         game.Camera.Position.X = x;  
  33.         game.Camera.Position.Y = y;  
  34.         game.Camera.Position.Z = z;  
  35.         //變化  
  36.         _sin += 0.016;  
  37.     }  
上面的代碼就完成了天空盒的添加,如果你瞭解之前的內容,看起來很容易吧:)

點擊直接下載工程瀏覽和測試,運行效果如下:

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章