`
blogfeifei
  • 浏览: 1197986 次
文章分类
社区版块
存档分类
最新评论

OIS输入系统-1_OIS简介与使用

 
阅读更多

面向对象的输入系统(Object-Oriented Input System(OIS) )
简介
使用OIS
1、创建常规的Windows窗口源代码下载
2、初始化OIS和常用输入设备
1、包含OIS库
2、创建输入输出设备管理器
3、创建键盘、鼠标输入设备
4、删除OIS系统,释放对应的资源
3、使用OIS,返回输入设备的状态源代码下载

文档下载

简介

OIS是一个面向对象的输入系统,理论上它可以支持任何输入设备,其中最主要的三类是键盘、鼠标和游戏控制器。OIS是一个开放源码的项目,你可以按你的要求定制它,以满足你的需求。

使用OIS

OIS系统必须初始化,然后才能使用,下面我们来一一介绍。

在介绍OIS的初始化以前,我们首先创建一个常规的Windows程序:

1、创建常规的Windows窗口

#include <windows.h>

//--------------------------------------------------------------------------------------
// 全局变量
//--------------------------------------------------------------------------------------
HINSTANCE g_hInst = NULL; //程序实例
HWND g_hWnd = NULL; //窗口句柄

//--------------------------------------------------------------------------------------
// 前向声明
//--------------------------------------------------------------------------------------
HRESULT InitWindow( HINSTANCE hInstance, int nCmdShow );
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

//--------------------------------------------------------------------------------------
// 程序入口。初始化所有资源,并进入到消息循环中。空闲时间用于渲染。
//--------------------------------------------------------------------------------------
int main()
{
g_hInst = GetModuleHandle(NULL);
if( FAILED( InitWindow( g_hInst, 1 ) ) )
return 0;

// 主消息循环
MSG msg = {0};
while( GetMessage( &msg, NULL, 0, 0 ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}

return (int) msg.wParam;
}


//--------------------------------------------------------------------------------------
// 注册窗口类并创建窗口
//--------------------------------------------------------------------------------------
HRESULT InitWindow( HINSTANCE hInstance, int nCmdShow )
{
// 注册窗口
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = NULL;
wcex.hCursor = LoadCursor( NULL, IDC_ARROW );
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = "TutorialWindowClass";
wcex.hIconSm = NULL;
if( !RegisterClassEx(&wcex) )
return E_FAIL;

// 创建窗口
g_hInst = hInstance;
RECT rc = { 0, 0, 640, 480 };
AdjustWindowRect( &rc, WS_OVERLAPPEDWINDOW, FALSE );
g_hWnd = CreateWindow( "TutorialWindowClass", "OIS教程", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, rc.right - rc.left, rc.bottom - rc.top, NULL, NULL, hInstance, NULL);
if( !g_hWnd )
return E_FAIL;

ShowWindow( g_hWnd, nCmdShow );

return S_OK;
}


//--------------------------------------------------------------------------------------
// 当程序获得一个消息时,调用这个函数一次
//--------------------------------------------------------------------------------------
LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
{
PAINTSTRUCT ps;
HDC hdc;

switch (message)
{
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
EndPaint(hWnd, &ps);
break;

case WM_DESTROY:
PostQuitMessage(0);
break;

default:
return DefWindowProc(hWnd, message, wParam, lParam);
}

return 0;
}

编译它我们得到一个典型的Windows窗口

以及一个命令行窗口,它主要用于显示相关信息:

整个界面如下:

2、初始化OIS和常用输入设备

1、包含OIS库

配置项目,包含头文件#include <OIS.h>,如果你想省事的话可以使用OIS的名字空间

using namespace OIS;

在我们的项目中要使用到字符串,因此把STL库一并添加如下:

#include <windows.h>

#include <OIS.h>
#include <sstream>
#include<string>

using namespace OIS;
using namespace std;

//--------------------------------------------------------------------------------------
// 全局变量
//--------------------------------------------------------------------------------------
HINSTANCE g_hInst = NULL; //程序实例
HWND g_hWnd = NULL; //窗口句柄

2、创建输入输出设备管理器

输入设备管理器(InputManager)是整个OIS的管理者,它用于创建和管理所有的输入输出设备,在创建它时必须指定相关的窗口句柄。因为在多窗口系统中,每个窗口都有自己的设备管理器,它用来管理属于这个窗口的设备。

InputManager * g_InputManager = 0; //输入系统管理器

g_InputManager = InputManager::createInputSystem(g_hWnd);

3、创建键盘、鼠标输入设备

有了设备管理器,我们就可以创建需要使用的设备了

Mouse* g_m = 0; //鼠标设备
Keyboard * g_kb = 0; //键盘设备
g_m = static_cast<OIS::Mouse*>(g_InputManager->createInputObject(OIS::OISMouse,false));
g_kb = static_cast<OIS::Keyboard*>(g_InputManager->createInputObject(OIS::OISKeyboard,false));

g_m为指向OIS::Mouse对象的指针,g_kb为指向OIS::Keyboard对象的指针,因为InputManager::createInputObject()函数总是返回设备的基对象,我们需要把它转换为实际的鼠标、键盘设备。函数createInputObject的第一个参数为我们要创建的设备类型,第二个参数设置我们使用立即模式,还是缓存模式,设置参数为false表示我们使用立即模式,这样我们可以随时获得设备的当前状态。

初始化OIS的全部代码如下:

#include <windows.h>

#include "OIS.h"
#include <sstream>
#include<string>
using namespace OIS;
using namespace std;
//--------------------------------------------------------------------------------------
// 全局变量
//--------------------------------------------------------------------------------------
HINSTANCE g_hInst = NULL; //程序实例
HWND g_hWnd = NULL; //窗口句柄
InputManager * g_InputManager = 0; //输入系统管理器
Mouse * g_m = 0; //鼠标设备
Keyboard * g_kb = 0; //键盘设备

//--------------------------------------------------------------------------------------
// 前向声明
//--------------------------------------------------------------------------------------
HRESULT InitWindow( HINSTANCE hInstance, int nCmdShow );
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

void InitOis()
{
g_InputManager = InputManager::createInputSystem((size_t)g_hWnd);

g_m = static_cast<OIS::Mouse*>(g_InputManager->createInputObject(OIS::OISMouse,false));
g_kb = static_cast<OIS::Keyboard*>(g_InputManager->createInputObject(OIS::OISKeyboard,false));
}

4、删除OIS系统,释放对应的资源

当你不需要再使用任何设备的时候,可以调用destroyInputSystem函数来释放整个系统。

void DestroyOis()
{
//清理未释放的设备
if( g_InputManager )
InputManager::destroyInputSystem(g_InputManager);
}

3、使用OIS,返回输入设备的状态

每次你需要获得输入设备的状态时,都需要完成以下两个步骤:

1.调用capture()函数获得当前设备的状态;

2.根据设备状态,进行相关的处理

//获到设备状态

g_kb->capture();

//根据设备状态,进行相关的处理

if(g_kb->isKeyDown(OIS::KC_ESCAPE))

return0;

其它设备相关的函数的使用方法与此类似,你可以在参考手册中查询到详细的说明。

完整的程序代码如下,这个程序完成的功能为,当你按下ESC时退出应用程序:

#include <windows.h>

#include "OIS.h"

#include <iostream>
#include <sstream>
#include<string>
using namespace OIS;
using namespace std;
//--------------------------------------------------------------------------------------
// 全局变量
//--------------------------------------------------------------------------------------
HINSTANCE g_hInst = NULL; //程序实例
HWND g_hWnd = NULL; //窗口句柄

InputManager * g_InputManager = 0; //输入系统管理器
Mouse * g_m = 0; //鼠标设备
Keyboard * g_kb = 0; //键盘设备

//--------------------------------------------------------------------------------------
// 前向声明
//--------------------------------------------------------------------------------------
HRESULT InitWindow( HINSTANCE hInstance, int nCmdShow );
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

void InitOis()
{
g_InputManager = InputManager::createInputSystem((size_t)g_hWnd);

g_m = static_cast<OIS::Mouse*>(g_InputManager->createInputObject(OIS::OISMouse,false));
g_kb = static_cast<OIS::Keyboard*>(g_InputManager->createInputObject(OIS::OISKeyboard,false));

}

void DestroyOis()
{
//清理未释放的设备
if( g_InputManager )
InputManager::destroyInputSystem(g_InputManager);
}
//--------------------------------------------------------------------------------------
// 程序入口。初始化所有资源,并进入到消息循环中。空闲时间用于渲染。
//--------------------------------------------------------------------------------------
int main()
{
g_hInst = GetModuleHandle(NULL);
if( FAILED( InitWindow( g_hInst, 1 ) ) )
return 0;

//初始化OIS系统
InitOis();

// 主消息循环
MSG msg = {0};
while( GetMessage( &msg, NULL, 0, 0 ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );

g_kb->capture();
if(g_kb->isKeyDown(OIS::KC_ESCAPE))
break;
}

//删除OIS系统
DestroyOis();
return (int) msg.wParam;
}


//--------------------------------------------------------------------------------------
// 注册窗口类并创建窗口
//--------------------------------------------------------------------------------------
HRESULT InitWindow( HINSTANCE hInstance, int nCmdShow )
{
// 注册窗口
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = NULL;
wcex.hCursor = LoadCursor( NULL, IDC_ARROW );
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = "TutorialWindowClass";
wcex.hIconSm = NULL;
if( !RegisterClassEx(&wcex) )
return E_FAIL;

// 创建窗口
g_hInst = hInstance;
RECT rc = { 0, 0, 640, 480 };
AdjustWindowRect( &rc, WS_OVERLAPPEDWINDOW, FALSE );
g_hWnd = CreateWindow( "TutorialWindowClass", "OIS教程", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, rc.right - rc.left, rc.bottom - rc.top, NULL, NULL, hInstance, NULL);
if( !g_hWnd )
return E_FAIL;

ShowWindow( g_hWnd, nCmdShow );

return S_OK;
}


//--------------------------------------------------------------------------------------
// 当程序获得一个消息时,调用这个函数一次
//--------------------------------------------------------------------------------------
LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
{
PAINTSTRUCT ps;
HDC hdc;

switch (message)
{
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
EndPaint(hWnd, &ps);
break;

case WM_DESTROY:
PostQuitMessage(0);
break;

default:
return DefWindowProc(hWnd, message, wParam, lParam);
}

return 0;
}

编译完成后,按ESC键,就可以退出程序了。

分享到:
评论

相关推荐

    OIS Object Oriented Input System OGRE例子中用的输入系统

    Object Oriented Input System (OIS) is meant to be a cross platform, simple solution for using all kinds of Input Devices (KeyBoards, Mice, Joysticks, etc) and feedback devices (e.g. forcefeedback). ...

    OIS:官方的OIS存储库。 面向对象的输入系统

    OIS:面向对象的输入系统 跨平台面向对象的输入库系统。 旨在非常健壮并与许多系统和操作系统兼容。 Linux 依存关系:X11 要构建和安装: cmake -H. -B./build cd ./build make make install 默认情况下, ...

    ois_v1-3.tar.gz_android开发_C/C++_

    跨平台的 输入管理 鼠标,键盘管理,win32

    数据融合matlab代码-pytorch-HED:HED在pytorch中的实现

    输入图像 dsn1 dsn2 dsn3 dsn4 dsn5 融合输出(dsn6) 在BSDS500上 方法 ODS(融合/合并) OIS(融合/合并) AP(融合/合并) 我们的实施 0.78731 / 0.78280 0.80623 / 0.80356 0.78632 / 0.83851 原始纸 0.782 / 0....

    快速全局刚度矩阵装配:以快速方式从单元刚度矩阵生成全局刚度矩阵-matlab开发

    输入: --------- Elements:一个结构包含 Elements{i}.K 和 Elements{i}.DOFs(第 i 个元素的刚度和自由度)。 输出: --------- K:稀疏全局刚度矩阵 参考----------------- Cuvelier,François,Caroline ...

    超市管理系统数据库设计(1).doc

    2、逻辑分析与详细分析 2.1系统功能 (1)、零售前台(POS)管理系统,本系统必须具有以下功能: 商品录入:根据超巿业务特点制定相关功能,可以通过输入唯一编号、扫描条形码、商 品名称等来实现精确或模糊的商品...

    sniis:简单的非侵入式输入系统

    简单的非侵入式输入系统 它能做什么: 查询来自桌面控件(例如键盘,鼠标,控制器,操纵杆)的输入 支持多个鼠标和键盘(当前仅Windows) 支持事件映射以可选地重新绑定控件 不接管游戏的主消息循环。 最小的C ++...

    ois:包含在Team Computing Olympics期间分配的编程任务的存储库

    ois 该存储库包含在Team Computing Olympics期间分配的调度任务。 资料夹结构 文件夹结构为&lt;anno&gt;/&lt;gara&gt;/&lt;nome&gt; ,其中: 是OIS版本决赛的年份(例如,如果是2015年2月23日进行决赛的OIS,则为2015年)。 是实践...

    超市管理系统数据库设计.doc

    2、逻辑分析与详细分析 2.1系统功能 (1)、零售前台(POS)管理系统,本系统必须具有以下功能: 商品录入:根据超巿业务特点制定相关功能,可以通过输入唯一编号、扫描条形码、商 品名称等来实现精确或模糊的商品...

    超市管理系统数据库设计(3).doc

    2、逻辑分析与详细分析 2.1系统功能 (1)、零售前台(POS)管理系统,本系统必须具有以下功能: 商品录入:根据超巿业务特点制定相关功能,可以通过输入唯一编号、扫描条形码、商 品名称等来实现精确或模糊的商品...

    ois2:用于修复ÕIS2的浏览器插件

    ois2 浏览器插件,用于修复主要与SIS2和其他一些站点有关的问题。要解决的问题[修复]繁琐的登录过程(3次单击) [固定]固定会话超时[已修复?]没有主题选择,没有黑暗模式注册时不显示实验时间缺少按时间过滤课程的...

    使用ogre做的练练看游戏

    使用oger做的练练看游戏,里面用到了CEGUI做界面,FMOD播放声音,OIS控制输入,免费给大家分享,有任何问题请邮件: xieaiwanli@hotmail.com

    java项目超市

    // 1.获取输入流 try { InputStream is = socket.getInputStream(); ObjectInputStream ois =new ObjectInputStream(is); // 2.获取输出流 OutputStream os = socket.getOutputStream(); ...

    OGRE基础教学文档

    在本指南最后你将了解帧监听,怎样运用帧监听去实现一些要求每一帧更新的东西,怎样去用Ogre的无缓冲输入系统。 OIS的带缓冲的输入 基础教程一 场景管理器,场景节点和实体 基础教程二 摄影机,阴影和光照处理...

    lxgui:Lua和XML图形用户界面-开源

    GUI可以通过C ++代码创建,也可以使用集成的“附加”系统创建,在该系统中,可以从XML和Lua文件中解析出该GUI。 它依赖于键盘和鼠标输入(未计划支持其他控制器)。 提供了用于OpenGL(用于图形)以及OIS和SFML...

    JetaShot!-开源

    JetaShot! 是计划/预Alpha流程中zlib / libpng许可下的跨平台Deathmatch Shooter,到目前为止,使用Ogre3D(www.ogre3d.org)作为渲染引擎,并使用OIS作为输入系统。 松鼠和OpenAL正在讨论中。

    MPU-6050模块(三轴陀螺仪 + 三轴加速度) 有代码和原理图-电路方案

    以数位输入的同步引脚(Sync pin)支援视频电子影相稳定技术与GPS 可程式控制的中断(interrupt)支援姿势识别、摇摄、画面放大缩小、滚动、快速下降中断、high-G中断、零动作感应、触击感应、摇动感应功能。 VDD供电...

    Mosquito-开源

    Mosquito是一种输入系统,它位于SDL或OIS之上,用于处理物理输入源到程序员可以使用的虚拟游戏手柄和鼠标的映射。 它支持通过配置文件,代码和游戏内重新映射进行配置。

Global site tag (gtag.js) - Google Analytics