我正在按照本教程学习如何在C#中使用OpenGL。一切都运行良好,直到这部分:OpenGL 4 with OpenTK in C# Part 10: Asteroid Invaders。我没有使用与本教程中使用的完全相同的OpenTK。我在这里使用的是与.NET Core兼容的版本:https://www.nuget.org/packages/OpenTK.NETCore/
似乎OpenTK没有检测到我的键盘。我有一个简单的更新循环来处理键盘输入,如下所示:
OnUpdateFrame
protected override void OnUpdateFrame(FrameEventArgs e)
{
base.OnUpdateFrame(e);
this.HandleKeyboard(e.Time);
// {...} Update Logic
}
HandleKeyboard
protected void HandleKeyboard(double delta)
{
Console.WriteLine("Handling keyboard");
var keyState = this.Keyboard.GetState();
if (keyState.IsKeyDown(Key.Escape))
{
this.Exit();
}
if (keyState.IsKeyDown(Key.A))
{
Console.WriteLine("Moving left");
this.player.MoveLeft();
}
if (keyState.IsKeyDown(Key.D) {
Console.WriteLine("Moving right");
this.player.MoveRight();
}
if (!this.gameOver && keyState.IsKeyDown(Key.Space) && this.lastKeyboardState.IsKeyUp(Key.Space))
{
this.gameObjects.Add(this.gameObjectFactory.CreateBullet(this.player.Position));
}
this.lastKeyboardState = keyState;
}
控制台多次显示Handling keyboard
,当我按A
或D
时,它不会写Moving left
或Moving right
。当我调试并将鼠标悬停在keystate
上时,会有一个属性IsConnected = false
。也许OpenTK无法识别我的键盘?
我正在使用笔记本键盘,所以没什么特别的。
根据Keyboard.GetState()的文档,它说Gets the primary Keyboard device, or null if no keyboard exists
。但它不会返回null?
我该如何解决这个问题?感谢
我在另一个解决方案上试过这个:
using System;
using OpenTK;
using OpenTK.Input;
namespace OpenTKTest
{
class Program
{
[STAThread]
static void Main(string[] args)
{
using (var window = new GameWindow())
{
window.UpdateFrame += (sender, eventArgs) =>
{
var state = window.Keyboard.GetState();
if (state.IsKeyDown(Key.A))
{
Console.WriteLine("KEYSTATE");
}
};
window.KeyDown += (sender, eventArgs) =>
{
if (eventArgs.Key == Key.A)
{
Console.WriteLine("KEYDOWN EVENT");
}
};
window.Run(60);
}
}
}
}
实际上,当我按下A
键时,KEYDOWN EVENT
会被写入,但不是KEYSTATE
。所以肯定是一个错误。
答案 0 :(得分:0)
从我收集的内容(经历了类似的结果),OpenTK.Input.Keyboard
API尚未实施。