OpenTK调用Keyboard.GetState()等方法提示命名空间不存在报错
问题根因
这个报错和程序集引用无关,是版本API不兼容导致的:你当前使用的是OpenTK 4.x及以上版本,而你参考的教程是基于OpenTK 3.x编写的。OpenTK 4.0对输入系统、窗口生命周期API做了破坏性变更,原先的OpenTK.Input.Keyboard静态类、全局Exit()方法都已被移除,直接照搬旧代码必然触发类型找不到的编译错误。
修复方法
- 首先在代码顶部引入两个必需的命名空间:
using OpenTK.Windowing.Common; using OpenTK.Windowing.GraphicsLibraryFramework; - 把你原来的
OnUpdateFrame方法替换为4.x版本的正确实现,不需要自定义额外字段,键盘状态直接从当前窗口实例获取,退出方法替换为实例方法Close():protected override void OnUpdateFrame(FrameEventArgs args) { // 直接从当前窗口实例读取本帧键盘状态,无需调用静态Keyboard类 KeyboardState input = KeyboardState; if (input.IsKeyDown(Keys.Escape)) { // 旧版全局Exit()已废弃,直接调用窗口实例的Close()方法退出 Close(); } base.OnUpdateFrame(args); }
注意事项
- 不要尝试手动添加旧版OpenTK.Input的引用,4.x版本的输入系统已经和GLFW深度绑定,所有输入状态都和具体窗口实例绑定,不存在全局静态的状态获取入口。
- 如果提示
Keys类型找不到,先确认你已经加了OpenTK.Windowing.GraphicsLibraryFramework的using,部分小版本中枚举名是Key,根据IDE提示补全即可。 - 如果你确实要使用旧版API,可以通过Nuget安装OpenTK 3.3.3版本,不需要修改你原来写的代码就能正常运行,但更建议用新版API,后续维护支持更好。
内容的提问来源于stack exchange,提问作者Alfons Lorente Darder
相关产品推荐
相关产品推荐

