原文 http://www.johanfalk.eu/blog/sharpdx-tutorial-part-2-creating-a-window

在第二篇教程中,我们将介绍如何创建一个稍后将呈现的简单窗口。

  1. 首先,我们将创建一个名为的新类Game。右键单击项目并选择“添加 - >类...”,将文件命名为“Game.cs”。

  2. 首先,我们将类RenderForm 设为public,然后添加一个带有两个变量来保存窗口客户端大小的宽度和高度(渲染大小,不包括窗口的边框)。该RenderForm 班还需要是一个引用添加到SharpDX.Windows

    using SharpDX.Windows;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks; namespace MySharpDXGame
    {
    public class Game
    {
    private RenderForm renderForm; private const int Width = 1280;
    private const int Height = 720;
    }
    }

    RenderForm Windows.Form SharpDX提供的子类。这个类就像Windows.Form为我们提供了一个带有边框,标题栏等的窗口。但它也为我们提供了一个针对3D图形进行了优化的渲染循环。如果您想了解更多相关信息,请查看SlimDX(类似于SharpDX的另一个包装器)文档:http://slimdx.org/tutorials/BasicWindow.php 。

  3. 接下来,我们将构造函数添加到Game 创建RenderForm 的类中。我们还需要添加一个引用System.Drawing。我们还将设置标题并禁止用户调整窗口大小。

    using System.Drawing;
    
    [...]
    
    public Game()
    {
    renderForm = new RenderForm("My first SharpDX game");
    renderForm.ClientSize = new Size(Width, Height);
    renderForm.AllowUserResizing = false;
    }
  4. 下一步是向我们的Game 类添加两个方法,一个用于启动渲染/游戏循环,另一个用于调用每个帧的回调方法。这是通过以下代码完成的:

    public void Run()
    {
    RenderLoop.Run(renderForm, RenderCallback);
    } private void RenderCallback()
    { }

    我们传入我们的RenderForm 方法和每个帧调用RenderLoop.Run(…) 方法。

  5. 我们现在将为我们的Game 类添加一些清理,以确保正确放置对象。所以我们让我们的Game 类实现接口IDisposable

    public class Game : IDisposable
    {
    [...] public void Dispose()
    {
    renderForm.Dispose();
    }
    }

    在这里,我们也确保处置我们的RenderForm

  6. 作为最后一步,我们现在将从main方法运行我们的游戏。因此,打开“Program.cs”类,它在创建“控制台应用程序项目”时自动添加,并将Main(…)方法更改为以下内容:

    [STAThread]
    static void Main(string[] args)
    {
    using(Game game = new Game())
    {
    game.Run();
    }
    }

    因为Game实现IDisposable 它会因using语句而自动正确处理。在此处详细了解其工作原理:https//msdn.microsoft.com/en-us/library/yh598w02.aspx

  7. 现在,如果您运行该程序,您应该看到一个空窗口,其中包含正确的大小和标题栏文本:

这就是本教程的全部内容,在下一部分中,我们将介绍初始化Direct3D设备并设置交换链。

最新文章

  1. 三种方法查看MySQL数据库的版本
  2. Python Day2
  3. Vault 不同版本的API的异同
  4. SpringMVC框架的工作原理
  5. Osmocom-BB中cell_log的多种使用姿势
  6. WF4 持久化 <第四篇>
  7. 关于arraylist.remove的一些小问题。
  8. nginx低版本不支持pathinfo模式,thinkphp针对此问题的解决办法
  9. JAVA并发实现二(线程中止)
  10. 套接字socket 的地址族和类型、工作原理、创建过程
  11. AWT与Swing的区别
  12. VS2010插件
  13. ssh框架总结之action接收参数的三种方式
  14. 让PC端页面在手机端显示缩小版的解决方法
  15. 167. Two Sum II - Input array is sorted (Array)
  16. MR数据生成工具指向目录
  17. ActiveMq 总结(二)
  18. [转]ASP.NET Core 指定环境发布(hosting environment)
  19. windows多线程(八) 信号量Semaphore
  20. CAMediaTimingFunction的使用

热门文章

  1. LC327 Count of Range Number
  2. TZ_10_常用的2中加密算法MD5,spring-sucrity
  3. tr的display属性出现td的colspan无效问题
  4. 一个页面多个bootstrip轮播以及一个页面多个swiper轮播 冲突问题
  5. [转]json对象详解
  6. C++怎么读入非文本文件中的内容
  7. 采坑“微信小程序”
  8. 学习JDK1.8集合源码之--WeakHashMap
  9. rabbitmq启用和禁用web界面管理插件
  10. GitHub - firebase/php-jwt: PEAR package for JWT