Nebula3的Input系统

相对于其他的子系统来说, 输入系统是比较简单的. 很多游戏根本就没有对这一块进行封装, 而直接采用了Win32的消息机制.

不过经过封装的输入系统使用起来很方便, 呵呵.

N3中有三种输入设备, 键盘, 鼠标, 手柄. 分别是基于Win32消息, DirectInput, XInput实现的. 这里有一个继承图能够很好的说明输入系统的组织结构:

基本的消息处理机制是这样的一个流程:

InputServer里有默认的一个键盘, 一个鼠标, 一个手柄的"handler", 在每帧开始时InputServer会检测当前的输入消息,  得到一个InputEvent, 由相应的InputHandler来处理.  各个InputHandler都保存着当前帧各种输入状态的缓存(如鼠标左键是否按下), 因此, 在程序运行过程中, 我们只要在绘制结束前检测各个InputHandler的状态就相当于知道当前用户是怎样输入的了.

一般只需要关心这么几个函数就够了:

////////////////////// Mouse////////////////////////////  
 /// return true if button is currently pressed  
 bool ButtonPressed(Input::MouseButton::Code btn) const;  
 /// return true if button was down at least once in current frame  
 bool ButtonDown(Input::MouseButton::Code btn) const;  
 /// return true if button was up at least once in current frame  
 bool ButtonUp(Input::MouseButton::Code btn) const;  
 /// return true if a button has been double clicked  
 bool ButtonDoubleClicked(Input::MouseButton::Code btn) const;  
 /// return true if mouse wheel rotated forward  
 bool WheelForward() const;  
 /// return true if mouse wheel rotated backward  
 bool WheelBackward() const;  
 /// get current absolute mouse position (in pixels)  
 const Math::float2& GetPixelPosition() const;  
 /// get current screen space mouse position (0.0 .. 1.0)  
 const Math::float2& GetScreenPosition() const;  
 /// get mouse movement  
 const Math::float2& GetMovement() const;  

//////////////////////Keyboard//////////////////////  
 /// return true if a key is currently pressed  
 bool KeyPressed(Input::Key::Code keyCode) const;  
 /// return true if key was down at least once in current frame  
 bool KeyDown(Input::Key::Code keyCode) const;  
 /// return true if key was up at least once in current frame  
 bool KeyUp(Input::Key::Code keyCode) const;  
 /// get character input in current frame  
 const Util::String& GetCharInput() const;  

GamePad先略过, 原理相同

测试例子, 在上一次的代码中添加一段:

 void OnRenderFrame()  
{  
 if (this->inputServer->GetDefaultMouse()->ButtonDown(MouseButton::LeftButton))  
    {  
        MessageBoxA(this->displayDevice->GetHwnd(), "Left Button Down", NULL, 0);  
    }  
//...//  
}  

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏北京马哥教育

python实现简单爬虫功能

iOS开发如果之前没接触过除了c和c++(c++太难了,不花个十来年基本不可能精通)的语言,第二门语言最好的选择就是Python.原因就是 1.语法简单 2.库...

3347
来自专栏FreeBuf

XSS编码剖析

作者 0xExploit 0×00 引言 很多不了解html、js编码的童鞋挖掘xss漏洞时,都是一顿乱插,姿势对了,就能获得快感,姿势不对,就么反应。另外在f...

3158
来自专栏吴伟祥

Velocity语法大全 转

本文转载自:http://www.cnblogs.com/codingsilence/archive/2011/03/29/2146580.html

664
来自专栏软件开发

CSS3与页面布局学习总结(七)——前端预处理技术(Less、Sass、CoffeeScript、TypeScript)

CSS不像其它高级语言一样支持算术运算、变量、流程控制与面向对象特性,所以CSS样式较多时会引起一些问题,如修改复杂,冗余,某些别的语言很简单的功能实现不了等。...

2275
来自专栏Django中文社区

Django模板标签regroup的妙用

在使用 Django 开发时,有时候我们需要在模板中按对象的某个属性分组显示一系列数据。例如博客文章按照时间归档分组显示文章列表(示例效果请看我的博客的归档页面...

3306
来自专栏lhyt前端之路

从单向到双向数据绑定0.前言1.单向数据(代表:react)2.观察者模式3.双绑的中间枢纽——Object.defineproperty(代表:vue)4. 脏值检测(代表:angular1)前面说

用户最满意的,无非就是界面的操作能实事反应到数据。而实现这种的可以有双向数据绑定、单向数据流的形式。双向数据绑定是,ui行为改变model层的数据,model层...

2014
来自专栏Java帮帮-微信公众号-技术文章全总结

深入浅出爬虫之道: Python、Golang与GraphQuery的对比

本文将分别使用 Python ,Golang 以及 GraphQuery 来解析某网站的 素材详情页面 ,这个页面的特色是具有清晰的数据结构,但是DOM结构不够...

1201
来自专栏逸鹏说道

Python3 与 C# 并发编程之~ 进程篇中

接着上面继续拓展,补充说说获取函数返回值。 上面是通过成功后的回调函数来获取返回值,这次说说自带的方法:

1423
来自专栏为数不多的Android技巧

Android Studio你不知道的快捷键(二)

在Android Studio你不知道的快捷键(一)里面,主要讲述了一些窗口操作的快捷键还有补全参数提示等,这一篇会分享一些代码代码编辑的快捷键。(默认Keym...

1162
来自专栏nice_每一天

教你开发jQuery插件(转) 教你开发jQuery插件(转)

原文:http://www.cnblogs.com/Wayou/p/jquery_plugin_tutorial.html

1761

扫码关注云+社区

领取腾讯云代金券