我相信在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