我相信在OpenTK中做到这一点的正确方法是继承GameWindow
类,然后覆盖OnUpdateFrame
和OnRenderFrame
。当您结帐时,包含QuickStart解决方案,请检查Game.cs
文件。
[编辑]为了进一步阐明,OpenTK.GameWindow
类提供一个Keyboard
属性,它应内部OnUpdateFrame
被读取(类型OpenTK.Input.KeyboardDevice的)。不需要单独处理键盘事件,因为这已经由基类处理过了。
/// <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();
}
}
另外,如需更详细的示例,请从其网页下载Yet another starter kit。该类应该是这个样子:
// 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,并检查它是如何实现的存在。
是不是一个事件的整个点,你不同步处理它,即当达到特定的代码行?如果你的“事件”不是真正的“事件”,或许你应该探索一种不同的设计策略。另外,反应式扩展是处理事件的真正强大的框架 - http://msdn.microsoft.com/zh-cn/data/gg577609。一探究竟。 –
作为发布事件答案的替代方案,请参阅[mine](http://stackoverflow.com/q/8249664/593627)了解游戏中更常用的方法(轮询)。 –
@ Sean:游戏循环是游戏编程中很常见的模式。它不一定需要用这种方式来实现,但重点是在渲染每一帧之前完全处理输入和游戏逻辑。随机发生事件的可能性大大增加了游戏设计的复杂性。 – Groo