以文本方式查看主题 - 中文XML论坛 - 专业的XML技术讨论区 (http://bbs.xml.org.cn/index.asp) -- 『 Dot NET,C#,ASP,VB 』 (http://bbs.xml.org.cn/list.asp?boardid=43) ---- 使用 DirectX 的假日屏幕保护程序 (http://bbs.xml.org.cn/dispbbs.asp?boardid=43&rootid=&id=58700) |
-- 作者:卷积内核 -- 发布时间:2/1/2008 3:25:00 PM -- 使用 DirectX 的假日屏幕保护程序 Coding4Fun 小组询问:“我们能提供一些假日主题的 Coding4Fun 文章吗?” 当然,回答读者的问题也很重要。因此在后面的几篇文章中,我将构建一个项目,以便于回答一些问题并赋予 Coding4Fun“目前的成员”的愉快体验。以下是本文将涵盖的几个问题: 1. 该项目将是一个假日主题的屏幕保护程序,假设将其命名为 DirectXmas(这并不是因为我要区分某个特定的假日庆典,而是因为我不想在 DirectX 中使用两次 X)。我将使用在以前文章中说明的纹理技术,来制作一系列圣诞树和其他假日装饰的动画。 创建屏幕保护程序 图 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 AskZman.Textures.DirectXmas(); 现在运行程序,您将看到上一篇教程中带纹理的地球。但请等一下,这并不是屏幕保护程序的预期外观。首先,它位于一个窗口中;其次,当您移动鼠标或按下某个按键时,它没有关闭。 示例框架创建全屏应用程序很容易。找到创建 DirectX 设备的行: sampleFramework.CreateDevice( 0, true, Framework.DefaultSizeWidth, 然后,将“true”更改为“false”。第二个参数控制是否在窗口中创建设备。您可能会注意到,程序以较低的分辨率运行,原因是默认的高度和宽度为 640x480。这是屏幕保护程序设置屏幕中的一个设置,但是现在可以使用当前的屏幕分辨率。将代码更改为: sampleFramework.CreateDevice(0, false, 现在,程序以全屏方式运行;但是,您只能通过按 ESC 键退出。 打开示例屏幕保护程序 ScreenSaverForm.cs 的源代码,了解它们如何检查鼠标和键盘。KeyDown 和 MouseDown 事件只负责关闭窗体并退出程序。MouseMove 事件有一点复杂。首次调用它时,代码会存储鼠标的位置。在后续调用中,代码检查鼠标是否从存储点进行了明显的移动。在本例中,明显移动意味着在任意方向上移动超过 10 个像素。我并不十分确定编写该代码的原因,但我怀疑这只是为了防止桌面震动和微弱的地震会取消屏幕保护程序(这在美国西海岸十分重要)。 如果仔细查看过任何 DirectX 示例,就会知道,尽管您看到的是一个窗体,但代码实际上并不是从 Windows 窗体继承的,因此代码必须经过更改才能使用。幸运的是,示例框架提供了类似的功能。 如果您还要查看上面的 CreateDevice() 调用,则只需查看应用程序挂钩 KeyDown 事件的上一行内容。 sampleFramework.Window.KeyDown += new System.Windows.Forms.KeyEventHandler(sample.OnKeyEvent); 您应该为 MouseMove 和 MouseDown 事件另外添加两个事件处理程序: sampleFramework.Window.MouseMove += new System.Windows.Forms.MouseEventHandler(sample.OnMouseMove); 新的 OnMouseDown() 函数如下所示: private void OnMouseDown(object sender, System.Windows.Forms.MouseEventArgs e) 此外,您应该用相同的两行代码取代 OnKeyEvent() 代码。 以屏幕保护程序示例为例,OnMouseMove() 函数应更改为: private bool isActive = false; 现在,运行程序将获得所需的效果。 如果您从上一个教程开始就一直进行代码的构建,那么需要改正上次的代码中的一个小“错误”。该代码包含一个到地球纹理的硬编码路径,但当屏幕保护程序位于屏幕保护程序所在的 system32 目录中时,该路径不可用。您可以使用示例框架 Utility.FindMediaFile() 函数来帮助定位该路径。如果查看该函数的源代码,您就会发现它的工作方式是搜索一组“类似的”路径,直到找到命名文件。在 texture.cs 中,OnResetDevice() 用以下代码取代加载地球纹理的代码: //Load the textures 要使程序作为屏幕保护程序运行,还需要手动执行几个步骤: 1. 现在,右键单击桌面并选择 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。您可以在他的网络日记中看到他的工作进度。 转到原英文页面
|
-- 作者:卷积内核 -- 发布时间:2/1/2008 3:27:00 PM -- 第二次绘制树 让我们再来一次,现在有一个更好的体系结构。在最后的源代码中,我保留了原始代码,但进行了注释,以便您可以同时看到两个版本。 为泛型集合添加一个 using 子句: using System.Collections.Generic; 类声明: private Mesh trunk; OnCreateDevice:请注意,旋转仅应用于根节点。由于所有转换都是相对的,这意味着,应用于父节点的任何转换都会应用于其下的所有子代;因此,以正确方向旋转树干会旋转整棵树。还要注意的是,现在的位置是相对的,因此更加易于理解: //Create materials and Meshes here //For the screen saver we create the meshes and the scene graph at the same time 但是,如果运行该程序,就会发现它看上去不再像是一棵树了。 由于这是呈现场景的一个普通方式,因此 DirectX 会提供 helper 例程。它们封装在 [URL=http://msdn.microsoft.com/library/?url=/library/en-us/directx9_m/directx/ref/ns/microsoft.directx/c/matrixstack/matrixstack.asp]MatrixStack[/URL] 类中。 使用 MatrixStack 绘制树 修改 GameObject 类以包含单个静态 MatrixStack: static MatrixStack stack = new MatrixStack(); 将 Render() 方法更新为 push 和 pop,并使用 MatrixStack 操作进行转换: public void Render(Device device) //if there are any children then draw them too //Restore the transformations 最后的呈现看上去应该再次像是一棵树。您应该能够更改单个物品的位置和旋转,并看到此更改会自动影响所有子代。 在最终的源代码中,我为树添加了一些装饰品。 本文中的代码使用了 [URL=http://msdn.microsoft.com/vstudio/express/visualCsharp/default.aspx]Visual C# 2005 Express Edition[/URL] 和 [URL=http://www.microsoft.com/downloads/details.aspx?FamilyId=1C8DC451-2DBE-4ECC-8C57-C52EEA50C20A]October 2005 DirectX SDK[/URL]。 ZMan 将在这里解决托管 DirectX 编程问题。如果您有问题,请发送到 [URL=mailto:ZMan@thezbuffer.com]ZMan@thezbuffer.com[/URL]。 鸣谢: 感谢 [URL=mailto:web@carlosag.NET]Carlos Aguilar[/URL] 提供了[URL=http://www.carlosag.net/Tools/CodeColorizer/Default.aspx]代码着色程序[/URL] Copyright ® 2005 TheZBuffer.com ZMan 创建了第一个托管 DirectX 社区 Web 站点:[URL=http://www.thezbuffer.com/]http://www.thezbuffer.com[/URL]。最近,他脱离了 Microsoft 的工作任务,以便专注于游戏技术和 TheZBuffer。您可以[URL=http://www.indiegameguy.com/blogs/ZMan/default.aspx]在他的网络日记[/URL]中看到他的工作进度。 [URL=http://msdn.microsoft.com/coding4fun/holiday/DirectXmas2/default.aspx]转到原英文页面[/URL] |
W 3 C h i n a ( since 2003 ) 旗 下 站 点 苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》 |
93.750ms |