新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论.NET,C#,ASP,VB技术
    [返回] 中文XML论坛 - 专业的XML技术讨论区计算机技术与应用『 Dot NET,C#,ASP,VB 』 → 使用 DirectX 的假日屏幕保护程序 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 7604 个阅读者浏览上一篇主题  刷新本主题   平板显示贴子 浏览下一篇主题
     * 贴子主题: 使用 DirectX 的假日屏幕保护程序 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 Dot NET,C#,ASP,VB 』的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客楼主
    发贴心情 使用 DirectX 的假日屏幕保护程序

    Coding4Fun 小组询问:“我们能提供一些假日主题的 Coding4Fun 文章吗?”

    当然,回答读者的问题也很重要。因此在后面的几篇文章中,我将构建一个项目,以便于回答一些问题赋予 Coding4Fun“目前的成员”的愉快体验。以下是本文将涵盖的几个问题:

    1.
    如何使用托管 DirectX 构建屏幕保护程序?

    2.
    您是否能够解释 MatrixStack 函数的工作方式?

    3.
    是否能够将图形存储在资源文件中?

    该项目将是一个假日主题的屏幕保护程序,假设将其命名为 DirectXmas(这并不是因为我要区分某个特定的假日庆典,而是因为我不想在 DirectX 中使用两次 X)。我将使用在以前文章中说明的纹理技术,来制作一系列圣诞树和其他假日装饰的动画。

    创建屏幕保护程序
    幸运的是,C# 和 VB.Net Express Editions 均随附有屏幕保护程序初学者工具包(图 1)。

    按此在新窗口浏览图片

    图 1. C# 中的屏幕保护程序初学者工具包项目类型。

    “重用”在教程中与在代码中同等重要,因此,有关如何在初学者工具包中创建项目的说明,请参阅 [URL=http://msdn.microsoft.com/Coding4Fun/weekend/weekend1/default.aspx]Andrew Coates 的 weekend warriors 专栏[/URL],该专栏还可在 [URL=http://msdn.microsoft.com/Coding4Fun/]Coding4Fun[/URL] 中找到。您无需阅读整篇文章(当然,除非您打算如此)。只需阅读到创建并运行项目即可。

    该项目将使用 DirectX 示例框架代码以及以前文章中提及的代码,因此需要添加对 Microsoft.DirectX、.Direct3D 和 .Direct3DX 的引用。浏览到示例框架源(通常位于 C:\Program Files\Microsoft DirectX 9.0 SDK (October 2005)\Samples\Managed\Common 下),并添加与 dx*.cs 匹配的文件(避开以 w 开头的文件;它们是未来 DirectX SDK 的测试文件)。最后,添加 Media 文件夹和[URL=http://msdn.microsoft.com/Coding4Fun/zman/zmanTextures3/default.aspx]上一篇纹理文章[/URL]中的三个源文件。解决方案资源管理器如图 2 所示。

    按此在新窗口浏览图片

    图 2. 项目起始点。

    如果您试图在此处编译,会遇到两个错误。第一个错误表明代码不安全。由于性能原因,DirectX 框架具有一些不安全的代码。在项目属性中启用了该选项,如图 3 所示。

    按此在新窗口浏览图片

    图 3. 该项目启用了不安全代码。

    第二个错误表明有两个入口点 — 这很有意义,因为此时有两个项目合并在一起。由于屏幕保护程序示例具有一些有用的代码,因此您应该将其保留为主入口点,并重命名 Texture.cs 中的入口点:

    static int Main()

    更改为

    public static int DirectXmas()

    现在,可以编译并运行整个项目,并且您仍然可以看到示例的默认屏幕保护程序。

    让屏幕保护程序使用 DirectX
    看一下 program.cs 源文件,特别是 Main() 函数。屏幕保护程序只是重命名为 .SCR 的一般 .EXE 程序。当它们运行时,系统会传递一个命令行参数,以告诉它们是否按一般方式运行、显示选项对话框或者在预览窗口中显示。当命令行是 /s 或者没有参数时,屏幕保护程序就会运行。代码位于 ShowScreenSaver() 函数中。要调用原来的入口点并运行我们的 DirectX 代码,请用以下代码取代该例程中的两行代码:

    AskZman.Textures.DirectXmas();

    现在运行程序,您将看到上一篇教程中带纹理的地球。但请等一下,这并不是屏幕保护程序的预期外观。首先,它位于一个窗口中;其次,当您移动鼠标或按下某个按键时,它没有关闭。

    示例框架创建全屏应用程序很容易。找到创建 DirectX 设备的行:

    sampleFramework.CreateDevice( 0, true, Framework.DefaultSizeWidth,
          Framework.DefaultSizeHeight, sample);

    然后,将“true”更改为“false”。第二个参数控制是否在窗口中创建设备。您可能会注意到,程序以较低的分辨率运行,原因是默认的高度和宽度为 640x480。这是屏幕保护程序设置屏幕中的一个设置,但是现在可以使用当前的屏幕分辨率。将代码更改为:

    sampleFramework.CreateDevice(0, false,
    System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width,
    System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height,
    sample);

    现在,程序以全屏方式运行;但是,您只能通过按 ESC 键退出。

    打开示例屏幕保护程序 ScreenSaverForm.cs 的源代码,了解它们如何检查鼠标和键盘。KeyDownMouseDown 事件只负责关闭窗体并退出程序。MouseMove 事件有一点复杂。首次调用它时,代码会存储鼠标的位置。在后续调用中,代码检查鼠标是否从存储点进行了明显的移动。在本例中,明显移动意味着在任意方向上移动超过 10 个像素。我并不十分确定编写该代码的原因,但我怀疑这只是为了防止桌面震动和微弱的地震会取消屏幕保护程序(这在美国西海岸十分重要)。

    如果仔细查看过任何 DirectX 示例,就会知道,尽管您看到的是一个窗体,但代码实际上并不是从 Windows 窗体继承的,因此代码必须经过更改才能使用。幸运的是,示例框架提供了类似的功能。

    如果您还要查看上面的 CreateDevice() 调用,则只需查看应用程序挂钩 KeyDown 事件的上一行内容。

    sampleFramework.Window.KeyDown += new System.Windows.Forms.KeyEventHandler(sample.OnKeyEvent);

    您应该为 MouseMoveMouseDown 事件另外添加两个事件处理程序:

    sampleFramework.Window.MouseMove += new System.Windows.Forms.MouseEventHandler(sample.OnMouseMove);
    sampleFramework.Window.MouseDown += new System.Windows.Forms.MouseEventHandler(sample.OnMouseDown);

    新的 OnMouseDown() 函数如下所示:

    private void OnMouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
    {
                    GraphicsWindow window = (GraphicsWindow)sender;
      window.Close();
    }

    此外,您应该用相同的两行代码取代 OnKeyEvent() 代码。

    以屏幕保护程序示例为例,OnMouseMove() 函数应更改为:

    private bool isActive = false;
    private Point mouseLocation;
    private void OnMouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
    {
      // Set IsActive and MouseLocation only the first time this event is called.
      if(!isActive)
      {
        mouseLocation = e.Location;
        isActive = true;
      }
      else
      {
        // If the mouse has moved significantly since first call, close.
        if ((Math.Abs(e.Location.X - mouseLocation.X) > 10) ||
            (Math.Abs(e.Location.Y - mouseLocation.Y) > 10))
        {
          GraphicsWindow window = (GraphicsWindow)sender;
          window.Close();
        }
      }
    }

    现在,运行程序将获得所需的效果。

    如果您从上一个教程开始就一直进行代码的构建,那么需要改正上次的代码中的一个小“错误”。该代码包含一个到地球纹理的硬编码路径,但当屏幕保护程序位于屏幕保护程序所在的 system32 目录中时,该路径不可用。您可以使用示例框架 Utility.FindMediaFile() 函数来帮助定位该路径。如果查看该函数的源代码,您就会发现它的工作方式是搜索一组“类似的”路径,直到找到命名文件。在 texture.cs 中,OnResetDevice() 用以下代码取代加载地球纹理的代码:

    //Load the textures
    sphericalTexture = TextureLoader.FromFile(e.Device, Utility.FindMediaFile("earth2k.jpg"));

    要使程序作为屏幕保护程序运行,还需要手动执行几个步骤:

    1.
    浏览到 debug 目录并找到 DirectXmas.exe,然后将其重命名为 DirectXmas.scr。

    2.
    将该文件复制到 c:\windows\system32 中。

    3.
    浏览到 Media 目录,并找到 earth2k.jpg 和 UI 文件夹。

    4.
    将它们复制到 c:\windows\system32 中。确保复制整个 UI 文件夹及其内容。

    现在,右键单击桌面并选择 Properties,然后选择 Screen Saver 选项卡(图 4)。

    按此在新窗口浏览图片

    图 4. 选择 DirectXmas 屏幕保护程序。

    选择 DirectXmas 并按 preview 键来查看结果。这里没有屏幕快照,因为屏幕的外观与上一教程末尾的屏幕外观完全相同;只不过它作为屏幕保护程序运行。

    代码还远远没有完成:

    • “Settings”对话框是用于旧示例的;

    • 它只在两个监视器的其中之一上运行;

    • 最糟糕的是,它还没有将我置于假日气氛中!
    上述内容将在后续文章中说明,如果您有任何建议,请告诉我们。

    这次的家庭作业(虽然我从未让任何人将答案发给我):

    • 从示例中移除 UI 代码和特殊呈现(例如,形状选择和透明度),因为它现在确实没有用 — 除了取消屏幕保护程序外,鼠标和键盘没有其他功能。

    • 更改照相机/视图矩阵代码,使屏幕保护程序显示整个世界旋转 — 额外加分点是让地球指向正确方位!

    本文中的代码使用了 C# 2005 Express Edition 和 October 2005 DirectX SDK。

    ZMan 将在这里解决托管 DirectX 编程问题。如果您有问题,请发送到 zman@thezbuffer.com。

    鸣谢:

    感谢

    Carlos Aguilar 提供了代码着色程序

    Fridger Schrempp 提供了 Celestia MotherLode 中的地球纹理

    Copyright ® 2005 TheZBuffer.com

    ZMan 创建了第一个托管 DirectX 社区 Web 站点 http://www.thezbuffer.com。最近,他脱离了 Microsoft 的工作任务,以便专注于游戏技术和 TheZBuffer。您可以在他的网络日记中看到他的工作进度。

    转到原英文页面


       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2008/2/1 15:25:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 Dot NET,C#,ASP,VB 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/5/10 20:28:50

    本主题贴数4,分页: [1]

     *树形目录 (最近20个回帖) 顶端 
    主题:  使用 DirectX 的假日屏幕保护程序(8258字) - 卷积内核,2008年2月1日
        回复:  [B]本页内容[/B][URL=http://www.microsoft.com/china/M..(10396字) - 卷积内核,2008年2月1日
        回复:  [B]第二次绘制树[/B]让我们再来一次,现在有一个更好的体系结构。在最后的源代码中,我保留了原..(5422字) - 卷积内核,2008年2月1日
        回复:  [B]本页内容[/B][URL=http://www.microsoft.com/china/M..(11338字) - 卷积内核,2008年2月1日

    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    62.500ms