天天看點

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

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

從上圖可以想想,由6張圖檔可以組合封閉空間,是以先準備上面的這樣的一張圖,我直接從别的地方借來了6張标準的SkyBox圖檔,關于SkyBox的圖檔可以請3D美術師幫助,或者借助網絡資源,另外,有一些專門制作天空盒的軟體。

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

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

public class Lesson09 : Lesson04  

{  

    public Lesson09()  

    {  

    }  

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

<a target="_blank" href="http://blog.51cto.com/attachment/201111/212633164.jpg"></a>

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

        //建立天空盒  

        Skybox skybox = new Skybox();  

        //天空盒6個方向的指定貼圖  

        skybox.Back = new ImageMap(Runtime.Instance.ContentManager.Load&lt;Balder.Imaging.Image&gt;("/Balder_Studio;component/SkyBox/cloudy_noon_BK.png"));  

        skybox.Bottom = new ImageMap(Runtime.Instance.ContentManager.Load&lt;Balder.Imaging.Image&gt;("/Balder_Studio;component/SkyBox/cloudy_noon_DN.png"));  

        skybox.Front = new ImageMap(Runtime.Instance.ContentManager.Load&lt;Balder.Imaging.Image&gt;("/Balder_Studio;component/SkyBox/cloudy_noon_FR.png"));  

        skybox.Left = new ImageMap(Runtime.Instance.ContentManager.Load&lt;Balder.Imaging.Image&gt;("/Balder_Studio;component/SkyBox/cloudy_noon_LF.png"));  

        skybox.Right = new ImageMap(Runtime.Instance.ContentManager.Load&lt;Balder.Imaging.Image&gt;("/Balder_Studio;component/SkyBox/cloudy_noon_RT.png"));  

        skybox.Top = new ImageMap(Runtime.Instance.ContentManager.Load&lt;Balder.Imaging.Image&gt;("/Balder_Studio;component/SkyBox/cloudy_noon_UP.png"));  

        //激活天空盒,如果沒有激活則不會顯示出來  

        skybox.IsEnabled = true;  

        //指定  

        game.Skybox = skybox;  

    double _sin = 0;  

    //重寫Lesson04中的Timer動畫  

    protected override void _dispatchertimer_Tick(object sender, EventArgs e)  

        //首先執行原來的  

        base._dispatchertimer_Tick(sender, e);  

        //判斷是否存在錄影機  

        if (game.Camera == null)  

            return;  

        //按照Sin曲線計算x,y,z的值,使之圍繞浏覽Camera的TargetPoint  

        var x = System.Math.Cos(_sin) * 250;  

        var y = System.Math.Sin(2*_sin) * 250;  

        var z = System.Math.Sin(_sin) * 150;  

        game.Camera.Position.X = x;  

        game.Camera.Position.Y = y;  

        game.Camera.Position.Z = z;  

        //變化  

        _sin += 0.016;  

上面的代碼就完成了天空盒的添加,如果你了解之前的内容,看起來很容易吧:)

本文轉自nowpaper 51CTO部落格,原文連結:http://blog.51cto.com/nowpaper/712763