您的位置:首页 > 其它

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

2011-09-29 18:10 441 查看
面向对象的输入系统(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))
     return 0;
其它设备相关的函数的使用方法与此类似,你可以在参考手册中查询到详细的说明。

完整的程序代码如下,这个程序完成的功能为,当你按下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键,就可以退出程序了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐