Silverlight C# 游戏开发:L9 天空盒

news/2024/7/7 7:02:35 标签: runtime, c#
Silverlight C# 游戏开发:L9 天空盒

在前面的篇节中,基本上完成了一个Silverlight3D世界的构建,此时只需要一些逻辑和代码就可以完成完整的游戏,而今天我将最后一个部分补充:天空盒(SkyBox)。说到天空盒,以前学过D3D的朋友一定不陌生,其实就是六面方盒子,使用透视错觉产生是一个球形。

 

从上图可以想想,由6张图片可以组合封闭空间,所以先准备上面的这样的一张图,我直接从别的地方借来了6张标准的SkyBox图片,关于SkyBox的图片可以请3D美术师帮助,或者借助网络资源,另外,有一些专门制作天空盒的软件。

最先需要准备图片,把他们加入到工程中

  

我为了方便,这次不再构建很大的独立控件,而是通过继承的方式直接获得之前写过的类:

 

public   class  Lesson09 : Lesson04
{
    
public  Lesson09()
    {
    }
}

 

 

关于Lesson04,可以参见: Silverlight C# 游戏开发:L4 模型组和简单的动画

我们将完成下面的这张截图的效果: 

 

在继承完了以后,需要对lesson04类做一些小小的改造,比如将Execution.Game给protected出来,将其中的DispatcherTimer的Tick事件执行方法virtual,这样可以帮助Lesson09少写很多的代码。

public   class  Lesson09 : Lesson04
{
    
public  Lesson09()
    {
        
// 创建天空盒
        Skybox skybox  =   new  Skybox();
        
// 天空盒6个方向的指定贴图
        skybox.Back  =   new  ImageMap(Runtime.Instance.ContentManager.Load < Balder.Imaging.Image > ( " /Balder_Studio;component/SkyBox/cloudy_noon_BK.png " ));
        skybox.Bottom 
=   new  ImageMap(Runtime.Instance.ContentManager.Load < Balder.Imaging.Image > ( " /Balder_Studio;component/SkyBox/cloudy_noon_DN.png " ));
        skybox.Front 
=   new  ImageMap(Runtime.Instance.ContentManager.Load < Balder.Imaging.Image > ( " /Balder_Studio;component/SkyBox/cloudy_noon_FR.png " ));
        skybox.Left 
=   new  ImageMap(Runtime.Instance.ContentManager.Load < Balder.Imaging.Image > ( " /Balder_Studio;component/SkyBox/cloudy_noon_LF.png " ));
        skybox.Right 
=   new  ImageMap(Runtime.Instance.ContentManager.Load < Balder.Imaging.Image > ( " /Balder_Studio;component/SkyBox/cloudy_noon_RT.png " ));
        skybox.Top 
=   new  ImageMap(Runtime.Instance.ContentManager.Load < Balder.Imaging.Image > ( " /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 ;
    }
}

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

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

 

获取 Microsoft Silverlight

工程中如果缺少Balder.dll请在这里快速下载:SL4_Balder.rar

推荐Silverlight游戏开发博客:深蓝色右手

posted on 2011-02-10 10:06 nowpaper 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/nowpaper/archive/2011/02/10/1950553.html


http://www.niftyadmin.cn/n/1784522.html

相关文章

jetson系列安装jtop工具

jtop工具在查看jetson边缘计算产品的cpu&#xff0c;gpu,以及内存使用率时非常方便&#xff0c;而且还能查看cuda,cudnn&#xff0c;opencv等相关工具的详细版本号&#xff0c;基本是使用jetson边缘计算产品必装的工具。因此英伟达在jetpack4.5及以后的版本中已经囊括到jetpack…

ChinaJoy现场展示

前天下班的时候才知道有chinajoy这回事&#xff0c;昨天一大早&#xff08;其实出门的时候已经九点了&#xff0c;但相比平时已经早了N多&#xff09;便奔赴浦东新国际博览中心。经过一个多小时的排队终于在十二点的时候准时入场。在这里先BS下自己&#xff0c;刚上地铁拍了两张…

TX2使用sdkmanager刷机问题记录

问题1&#xff1a;连接TX2失败 在TX2刷机过程中&#xff0c;在刷完系统后需要刷SDK&#xff0c;这时需要输入设备的ip&#xff0c;以及用户名密码&#xff0c;这时报错如下&#xff1a; 报这种错误一般是IP地址填写有问题&#xff0c;如果用户名和密码有问题&#xff0c;可以登…

ajax下导出excel的解决办法(转载)

AJAX下EXCEL不能按原来的方式导出&#xff0c;因为在异步方式下Response.write是会出错的&#xff0c;所有在页面加载的时候可以将导出按钮注册为同步方式&#xff0c;同时在UpdatePanel里不能注册导出按钮&#xff0c;即可解决该问题。【对于VS自带的ajax此办法即可解决&#…

pjreddie版darknet在cudnn8.x环境下编译问题解决

前言&#xff1a;alexeyab版darknet出现&#xff0c;与pjreddie相比训练与推理速度有了一定的提升&#xff0c;且多了很多功能&#xff0c;如自动画l训练过程的loss曲线图&#xff0c;自动生成anchor值等&#xff0c;但是精度有一些损失&#xff0c;在实际使用过程中可以权衡利…

如何获取重载函数的地址 - 回复 flq_00000 的问题

问题来源: http://www.cnblogs.com/del/archive/2008/07/30/1039045.html#1272783在编译器看来, 重载函数根本就是完全不同的几个函数, 当然就会有不同的函数地址; 我们用常规方法获取的地址只是第一种重载的地址.代码文件:unit Unit1;interfaceusesWindows, Messages, SysUtil…

opencv函数解读之模板匹配函数

模板匹配&#xff0c;顾名思义是利用给定的已知模板与待匹配的图像或数组计算匹配度&#xff0c;以达到寻找目标的目的。模板可以是矩形块也可以是一维数组&#xff0c;如果模板是一个矩阵&#xff0c;一般待匹配的数据也矩阵&#xff0c;如果模板是一个一维数据&#xff0c;那…

在Asp.Net中动态加载控件

在Asp.Net中动态加载控件 原文&#xff1a;http://bhaidar.net/cs/pages/load-controls-dynamically-in-asp-net.aspx 作者&#xff1a;BilalHaidar [MVP] 发表于&#xff1a;2008-7-27 1:44 AM 译者&#xff1a;兴百放 摘要: 在本文中,我将向您演示在Asp.Net页面中动态加…