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.     }  
上面的代码就完成了天空盒的添加,如果你了解之前的内容,看起来很容易吧:)

点击直接下载工程浏览和测试,运行效果如下:



本文转自nowpaper 51CTO博客,原文链接:http://blog.51cto.com/nowpaper/712763

相关文章
|
8月前
|
存储 开发框架 .NET
【C#】C# 基础语法与游戏开发
【1月更文挑战第21天】【C#】C# 基础语法与游戏开发
|
5月前
|
图形学 C# 开发者
全面掌握Unity游戏开发核心技术:C#脚本编程从入门到精通——详解生命周期方法、事件处理与面向对象设计,助你打造高效稳定的互动娱乐体验
【8月更文挑战第31天】Unity 是一款强大的游戏开发平台,支持多种编程语言,其中 C# 最为常用。本文介绍 C# 在 Unity 中的应用,涵盖脚本生命周期、常用函数、事件处理及面向对象编程等核心概念。通过具体示例,展示如何编写有效的 C# 脚本,包括 Start、Update 和 LateUpdate 等生命周期方法,以及碰撞检测和类继承等高级技巧,帮助开发者掌握 Unity 脚本编程基础,提升游戏开发效率。
127 0
|
8月前
|
存储 开发框架 .NET
【C#】认识C# (为了游戏开发 O(≧口≦)O)
【1月更文挑战第26天】【C#】认识C# (为了游戏开发 O(≧口≦)O)
|
存储 C# 图形学
Unity游戏开发之C#快速入门
Unity游戏开发之C#快速入门C#是微软团队在开发.NET框架时开发的,它的构想接近于C、C++,也和JAVA十分相似,有许多强大的编程功能。个人感受是C#吸收了众多编程语言的优点,从中可以看到C、C++、Java、Javascript、python的影子,设计思想都是相通的(过段时间一定要看看设计模式),对比迁移地学习基本只需要记关键字、语法和包的用法。
1714 0