创建一个窗口
欢迎来到 LearnOpenTK 教程的第一篇。本指南将教你如何从 NuGet 获取 OpenTK,并打开你的第一个窗口。我们保证这将是一个简短的教程。
从NuGet安装
OpenTK 在 NuGet 上发布,NuGet 是 .NET 的官方包管理器。这是网址。OpenTK 3 可以安装在 .NET Framework 2.0 及其任何衍生的 Mono 版本上。
在 Visual Studio 2013/2015/2017 中,要访问 NuGet 包管理器,只需点击工具,悬停在 NuGet 上并选择包管理器控制台。
这将打开包管理器控制台 - 这是 Visual Studio 和 NuGet 的 PowerShell 扩展。要安装 OpenTK,只需在包管理器控制台中输入以下命令。
Install-Package OpenTK
就这样!OpenTK 已安装,你可以继续下一步的教程了!
创建一个窗口
与OpenGL不同,OpenTK自带窗口系统。本教程将教你如何使用它。继续在你喜欢的IDE中创建一个C#控制台项目,并创建一个名为Game.cs的新文件,然后添加以下using指令:
// OpenTK 4
using OpenTK.Graphics.OpenGL4;
using OpenTK.Windowing.Common;
using OpenTK.Windowing.Desktop;
using OpenTK.Windowing.GraphicsLibraryFramework;
namespace YourNamespaceHere
{
public class Game
{
}
}
// OpenTK 3
using OpenTK;
using OpenTK.Graphics;
namespace YourNamespaceHere
{
public class Game
{
}
}
现在我们有一个空白类。是时候将其转换为GameWindow了。要做到这一点,只需扩展GameWindow,如下所示:
public class Game : GameWindow
现在你的类是一个基本窗口。这很好,但仅凭这一点,你什么都做不了。有许多方法可以自定义你的 GameWindow,但在本教程中,我们将创建一个简单的构造函数,让我们可以设置窗口的宽度、高度和标题。
对于OpenTK 4,我们通过设置 NativeWindowSettings 的 Size 和 Title 属性来实现这一点。
对于OpenTK 3,我们通过覆盖OpenTK中包含的基本构造函数来实现这一点。
// OpenTK 4
public Game(int width, int height, string title) : base(GameWindowSettings.Default, new NativeWindowSettings() { Size = (width, height), Title = title })
{
}
// OpenTK 3
public Game(int width, int height, string title) : base(width, height, GraphicsMode.Default, title)
{
}
我们的GameWindow已经准备好了!现在你只需要在程序中创建一个它的实例。当你之前创建项目时,应该还创建了一个名为Program.cs的文件,其中包含一个Main函数。为了在程序启动时打开窗口,我们必须:
- 创建一个你的 Game 类的实例。
- 通过调用 Run 函数启动所有“泵”。
- 完成后,释放 Game。
// OpenTK 4
// 这行代码创建了一个新实例,并将其包装在 using 语句中,以便在退出代码块后自动释放该实例。
using (Game game = new Game(800, 600, "LearnOpenTK"))
{
game.Run();
}
// OpenTK 3
// 这行代码创建了一个新实例,并将其包装在 using 语句中,以便在退出代码块后自动释放该实例。
using (Game game = new Game(800, 600, "LearnOpenTK"))
{
//Run接受一个双精度浮点数,该数字表示每秒应努力达到的帧数。
//你可以省略这一点,它会以硬件允许的最快速度更新。
game.Run(60.0);
}
将那段代码插入到你的Main函数中,然后构建并运行你的程序!你现在有一个空白窗口,干得好!然而,你只能通过使用右上角的关闭(X)按钮或Alt+F4来关闭窗口。我们不希望这样,让我们来做一些输入处理!
GameWindow 有许多你可以重写的方法来为你的窗口添加各种功能。你可以在本网站的“API”部分查看所有这些方法,但在这种情况下,我们感兴趣的是 OnUpdateFrame。
只需键入 override OnUpdateFrame,您的 IDE 应该能够生成如下函数:
protected override void OnUpdateFrame(FrameEventArgs e)
{
base.OnUpdateFrame(e);
}
检测按键真的很简单!OpenTK 有一个叫做 KeyboardState 的类,它有一个 IsKeyDown 方法,如果键被按下则返回 true。例如,KeyboardState.IsKeyDown(Key.Escape) 只有在按下 Esc 键时才会返回 true。
我们希望在按下Esc键时退出,在考虑到上述信息的情况下,按下Esc键退出非常简单:
对于OpenTK 4:
// 获取本帧的键盘状态
// 'KeyboardState' 是 GameWindow 的属性
if (KeyboardState.IsKeyDown(Keys.Escape))
{
Close();
}
现在,该功能应如下所示:
protected override void OnUpdateFrame(FrameEventArgs e)
{
base.OnUpdateFrame(e);
if (KeyboardState.IsKeyDown(Keys.Escape))
{
Close();
}
}
对于OpenTK 3:
// 获取本帧的键盘状态
KeyboardState input = Keyboard.GetState();
if (input.IsKeyDown(Key.Escape))
{
Exit();
}
现在,该功能应如下所示:
protected override void OnUpdateFrame(FrameEventArgs e)
{
base.OnUpdateFrame(e);
KeyboardState input = Keyboard.GetState();
if (input.IsKeyDown(Key.Escape))
{
Exit();
}
}
回顾
在这个教程中,我们安装了OpenTK,创建了一个监听Esc键被按下的空白窗口,并在按下时退出。在下一个教程中,我们将在你刚刚创建的空白窗口上绘制一个三角形。就到这里吧!