我相信在OpenTK中做到这一点的正确方法是从GameWindow
类继承,然后覆盖OnUpdateFrame
and OnRenderFrame
。结帐时包含一个快速入门解决方案,检查Game.cs
文件。
[编辑]为了进一步澄清,OpenTK.GameWindow
类提供了一个Keyboard
属性(类型为OpenTK.Input.KeyboardDevice),应该在里面读取OnUpdateFrame
。无需单独处理键盘事件,因为这已由基类处理。
/// <summary>
/// Called when it is time to setup the next frame. Add you game logic here.
/// </summary>
protected override void OnUpdateFrame(FrameEventArgs e)
{
base.OnUpdateFrame(e);
TimeSlice();
// handle keyboard here
if (Keyboard[Key.Escape])
{
// escape key was pressed
Exit();
}
}
此外,对于更详细的示例,请从他们的网页下载另一个入门工具包。该类应如下所示:
// Note: Taken from http://www.opentk.com
// Yet Another Starter Kit by Hortus Longus
// (http://www.opentk.com/project/Yask)
partial class Game : GameWindow
{
/// <summary>Init stuff.</summary>
public Game()
: base(800, 600, OpenTK.Graphics.GraphicsMode.Default, "My Game")
{ VSync = VSyncMode.On; }
/// <summary>Load resources here.</summary>
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
// load stuff
}
/// <summary>Called when your window is resized.
/// Set your viewport/projection matrix here.
/// </summary>
protected override void OnResize(EventArgs e)
{
base.OnResize(e);
// do resize stuff
}
/// <summary>
/// Called when it is time to setup the next frame. Add you game logic here.
/// </summary>
protected override void OnUpdateFrame(FrameEventArgs e)
{
base.OnUpdateFrame(e);
TimeSlice();
// handle keyboard here
}
/// <summary>
/// Called when it is time to render the next frame. Add your rendering code here.
/// </summary>
protected override void OnRenderFrame(FrameEventArgs e)
{
base.OnRenderFrame(e);
// do your rendering here
}
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
using (Game game = new Game())
{
game.Run(30.0);
}
}
}
我建议你下载Yask并检查它是如何在那里实现的。