OpenTK.Core |没有检测到我的按键

时间:2017-08-15 18:05:51

标签: c# .net windows opengl opentk

我正在按照本教程学习如何在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,当我按AD时,它不会写Moving leftMoving 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。所以肯定是一个错误。

1 个答案:

答案 0 :(得分:0)

从我收集的内容(经历了类似的结果),OpenTK.Input.Keyboard API尚未实施。