OIS几个重要的类的使用

一 OIS的简介:

     OIS有很多的类,头文件也10多个,很多人一到就蒙了,其实不然,虽然头文件很多,但是都很简单。

 

#include "OIS.h"           包含了所有用到的头文件,使用OIS时,只要包含这一个就行了。

#include "OISPrereqs.h"     一些平台选择和编译器的处理,还有一些简单的定义,不用管。

#include "OISInterface.h"   接口的说明,没有什么重要东西,了解而已。

#include "OISException.h"   异常的处理,编译程序时自动处理,不用管。

#include "OISEvents.h"      一些事件的定义,了解而已。

#include "OISEffect.h"      事件的效果,比如击键的周期啊,长短啊等,了解而已。

#include "OISForceFeedback.h" 事件的反馈,了解而已。

#include "OISFactoryCreator.h"制造鼠标键盘的类,了解而已。

#include "OISJoyStick.h"    摇杆类,PC机一般不用,了解而已。

#include "OISObject.h"      对鼠标键盘一些函数的类,了解而已。

 

下面3个类才是我们真正使用的类,学会下面3个类,就学会了OIS了。

#include "OISInputManager.h"    输入管理类

#include "OISMouse.h"            鼠标类

#include "OISKeyboard.h"         键盘类

二 InputManager的几个重要函数:

Public Member Functions

virtual Object* 

createInputObject(Type iType, bool bufferMode)=0

 

产生一个输入设备!

virtual void

destroyInputObject (Object *obj)=0

销毁一个输入设备

Static Public Member Functions

InputManager*

createInputSystem(std::size_t winHandle)

产生输入控制管理系统

InputManager*

createInputSystem(ParamList &paramList)

销毁控制管理系统

void

destroyInputSystem(InputManager *manager)

 

使用例子如下:

标准使用方法:

OIS::ParamList pl;

size_t windowHnd = 0;

std::ostringstream windowHndStr;

m_win->getCustomAttribute("WINDOW",&windowHnd);

windowHndStr << windowHnd;

pl.insert(std::make_pair(std::string("WINDOW"),windowHndStr.str()));

m_InputManager =OIS::InputManager::createInputSystem( pl );

    替换的使用方法:

size_t hWnd = 0;

m_win->getCustomAttribute("WINDOW",&hWnd);

m_InputManager =OIS::InputManager::createInputSystem(hWnd);

 

m_InputManage是InputManager的类型指针,m_win实例窗口的句柄。其他的几个个变量见名知意,不多解释了。两中方法都可以创建InputManager。

 

    以上创建了管理者,下面来创建鼠标和键盘的变量,获得键盘鼠标的控制权。

m_Mouse =static_cast<OIS::Mouse*>(m_InputManager->createInputObject

(OIS::OISMouse, false));

m_Keyboard=static_cast<OIS::Keyboard*>(m_InputManager->

createInputObject(OIS::OISKeyboard, false));

     m_Mouse 是OIS::Mouse object的一个指针, m_Keyboard 是OIS::Keyboard object的一个指针。False代表非缓冲。

嘎嘎,到此你就学会了使用InputManager类的几个最重要函数了,成功迈出了第一部,继续努力哦!

三 鼠标键盘的类的几个重要函数:

鼠标的2个重要类是Mouse,MouseListener,相应的键盘的2个重要类是Keyboard,MouseListener。

 

Mouse的重要函数:

Public Member Functions

virtual void

setEventCallback (MouseListener *mouseListener)

const MouseState& 

getMouseState () const

virtual void

capture()继承自Object类

MouseListener的重要函数

Public Member Functions

virtual void

mouseMoved( const MouseEvent &arg ) = 0

virtual void

mousePressed( const MouseEvent &arg, MouseButtonID id ) = 0

virtual void

mouseReleased( const MouseEvent &arg, MouseButtonID id ) = 0

Keyboard的重要函数

Public Member Functions

virtual bool 

isKeyDown (KeyCode key)=0

virtual void 

setEventCallback (KeyListener *keyListener)

virtual void

capture()继承自Object类

KeyListener的重要函数

Public Member Functions

virtual bool 

keyPressed( const KeyEvent &arg ) = 0

virtual void 

keyReleased( const KeyEvent &arg ) = 0

    

好了就这几个类和它们分别得函数。有起来很简单。在第一节里边创建了

InputManager,m_Mouse和m_Keyboard。

首先设置鼠标的范围,使鼠标只捕获程序的内的消息!

unsigned int width, height, depth;

int top, left;

m_win->getMetrics(width, height,depth, left, top);

const OIS::MouseState &ms =m_Mouse->getMouseState();

ms.width = width;

ms.height = height;

getMetrics这个函数用于得到窗口的一些属性,通过getMouseState()来设置m_Mouse的私有变量MouseState的值。这样鼠标的状态就设置好了,就这么简单。

好了,到这里我可以恭喜你了,你已经迈出了成功的第二步了。下面是最后的使用了,也是最后一部,也是最重要的地方。

 

首先我们先讲一个问题,就是 缓冲和非缓冲。

缓冲输入就是说你每次的按键值都要先存入缓冲区,等程序有时间了就会去做相应的处理,意思说只要你按了某个键,电脑早晚都会给你做相应的事情,哪怕等到程序死机(如果这样,说明你很不幸哦!)。非缓冲就是程序现在有时间处理你的时候来问你,“有什么要做的没?“,如果这是你的鼠标键盘有任何时间的话,程序就做相应的处理,没有的话,不做任何处理,哪怕在这之前你按了鼠标或者键盘的某些键,程序也会忽略。它们的区别就是缓冲可以处理一切事件,但是需要缓冲,则比较慢,非缓冲可能会忽略某些信息,但是它不需要缓冲,处理速度要快一些。

 

好了,现在你可以准备迈出关键的第三步了。

非缓冲处理:

m_Mouse =static_cast<OIS::Mouse*>(m_InputManager->createInputObject

(OIS::OISMouse, false));

m_Keyboard=static_cast<OIS::Keyboard*>(m_InputManager->

createInputObject(OIS::OISKeyboard, false));

这是在第一节讲的,那个false代表使用非缓冲处理。

在程序的每帧中调用以下函数来获得当前鼠标和键盘的状态。

mMouse->capture();
      mKeyboard->capture();

然后调用以下函数就可以做相应的处理了

if(mKeyboard->isKeyDown(OIS::KC_ESCAPE))
        return false;
    if(mMouse->getMouseState().buttonDown(OIS::MB_Left))

       return true;

KC_ESCAPE和MB_Left都是定义的一些常量,见名知意,没有必要多解释了。如果你想做对什么键盘鼠标的处理,可以查OISKeyboard.h里的KeyCode和 OISMouse.h里的MouseButtonID。

 

缓冲处理:

m_Mouse =static_cast<OIS::Mouse*>(m_InputManager->createInputObject

(OIS::OISMouse, true));

m_Keyboard=static_cast<OIS::Keyboard*>(m_InputManager->

createInputObject(OIS::OISKeyboard, true));

    这里就应该设置成true了。

然后再构造函数里注册鼠标键盘的侦听器

       mMouse->setEventCallback(this);

       mKeyboard->setEventCallback(this);

最后实现消息以下的处理函数就可以处理相应的事件了。

  鼠标MouseListener

    bool mouseMoved(constOIS::MouseEvent &e)

    bool mousePressed(constOIS::MouseEvent &e, OIS::MouseButtonID id)

    bool mouseReleased(constOIS::MouseEvent &e, OIS::MouseButtonID id)

 

键盘 KeyListener

    bool keyPressed(constOIS::KeyEvent &e)

    bool keyReleased(constOIS::KeyEvent &e)

 

以下是3个例子,及供参考。

 

bool keyPressed( const OIS::KeyEvent&e )

{
     using namespace OIS;//要加上这句哦,才能使用命名空间里的定义的变量。
     switch ( e.key )

{
         case KC_ESCAPE:
        // KC_ESCAPE代表ESC 退出;
           break;

case  --//其他的按键
        -----------//按键的处理

  break;

}
       return true;
     }

 

 

 

bool mousePressed(const OIS::MouseEvent &e, OIS::MouseButtonID id)

{
     using namespace OIS;//要加上这句哦,才能使用命名空间里的定义的变量。
     switch (id )

{
         case MB_Left:    // MB_Left代表鼠标左键;
           break;

case  -- //鼠标其他的键
        -----------

  break;

}
       return true;
     }

 

bool mouseMoved(const OIS::MouseEvent &e)

{

   using namespace OIS;//要加上这句哦,才能使用命名空间里的定义的变量。

  if(e.state.buttonDown(MB_RIGHT))

       //鼠标移动并且右键按下的处理。

    return true;

}

  关于OIS的更详细的内容就需要自己挖掘了,再见!

转载于:https://www.cnblogs.com/gamesky/archive/2013/01/25/2876617.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/482714.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

元宇宙的“42条共识”

来源&#xff1a; 量子学派*以下内容、图片综合自《图说元宇宙》《设计元宇宙》系列01元宇宙不是一天建成的罗马不是一天建成的&#xff0c;元宇宙也一样。人类从未像今天这样&#xff0c;可以自己成为“创世主”。元宇宙融合了信息技术&#xff08;5G/6G&#xff09;、互联网时…

struts2被淘汰的原因

Struts2是一个基于MVC设计模式的Web应用框架&#xff0c;它本质上相当于一个Servlet。在MVC设计模式中&#xff0c;Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts2是Struts的下一代产品&#xff0c;是在Struts1和WebWork的技术基础上进行了合并的全新的Str…

手把手教你用java读写excel表格文件(POI,EasyExcel)

视频链接-我是学习之星我为狂神打call~ 【狂神说Java】POI及EasyExcel一小时搞定通俗易懂 想给项目添加一个表格导入导出功能吗&#xff1f; “xxx管理系统”没有导入导出功能逼格不够了&#xff1f; 想简单入手下 how to 用java 生成excel又找不到合适的教程&#xff1f; com…

欢迎参加2022年第一次《城市大脑建设标准规范》专家研讨会

来源&#xff1a;世界数字大脑标准研究组2018年以来&#xff0c;城市大脑正成为智慧城市和智能产业的新热点&#xff0c;有近500个城市提出城市大脑的建设规划&#xff0c;数千家大中型科技企业进入城市大脑的建设领域。如何理清城市大脑的概念和定义&#xff0c;制定统一的城市…

面试问题

什么是闭包&#xff1f;1. 当一个内部函数被调用&#xff0c;就会形成闭包&#xff0c;闭包就是能够读取其他函数内部变量的函数定义&#xff1a;闭包是能够读取其他函数内部变量的函数&#xff0c;在js中&#xff0c;只有函数内部的子函数才能读取局部变量&#xff0c;所以闭包…

Spring常用注解的讲解

转载&#xff0c;原文链接 作者&#xff1a;字母哥博客 本文出自&#xff1a;springboot深入浅出系列 文章目录一、常用注解回顾1.1 RequestBody与ResponseBody1.2. RequestMapping注解1.3. RestController与Controller1.4. PathVariable 与RequestParam二、接收复杂嵌套对象参…

复杂系统与人工生命:十年研究概览

来源&#xff1a;集智俱乐部作者&#xff1a;Thomas McAtee、Claudia Szabo译者&#xff1a;陈翔 审校&#xff1a;刘培源编辑&#xff1a;邓一雪导语人工生命&#xff08;artificial life&#xff09;是通过仿真建模、机器技术和生物化学等方式模拟自然生命系统&#xff0c;进…

day22-面向对象之封装

# 封装 什么是封装? # 就是将复杂的丑陋的,隐私的细节隐藏到内部,对外提供简单的使用接口 # 对外隐藏内部实现细节,并提供访问的接口 为什么需要封装? ​ # 两个目的 ​ 1.为了保证关键数据的安全性 ​ 2.对外部隐藏实现细节,隔离复杂度 什么时候应该封装? #​ 当有一些数据…

5.1传输层概述

5.1传输层概述 文章目录传输层概述传输层的两个协议传输层的寻址与端口传输层概述 传输层的两个协议 传输层的寻址与端口

多细胞生命进击之路:单细胞为何放弃自由,长成复杂的多细胞?

来源&#xff1a;集智俱乐部作者&#xff1a;Veronique Greenwood译者&#xff1a;赵雨亭审校&#xff1a;张澳编辑&#xff1a;邓一雪导语人类作为复杂的多细胞生命&#xff0c;似乎理所当然地认为&#xff0c;多细胞生命相对单细胞生命有绝对的优势。但实际上单细胞生命进化为…

5.2 UDP协议

5.2 UDP协议 文章目录用户数据报协议udp概述udp首部形式udp校验用户数据报协议udp概述 udp首部形式 udp校验

一个XML转换的例子

问&#xff1a; 我想把字符串转换成stream, 然后 System.Xml.XmlTextReader xmlReader new System.Xml.XmlTextReader(System.IO.Stream input) ______________________________________________________________________________________________ 答1&#xff1a; 为何一定要…

msil 笔记

public class TestImpl : ITest {// Propertiespublic string Address{get{return "abc";}}//msil:address不是在接口中定义的 //hidebysig:使用时看不见这个方法,因为是给属性用的.specialname也是说是给属性用的(但不指明),只是说是特殊的. .method public hidebys…

焦李成院士:进化优化与深度学习的思考

来源&#xff1a;AI科技评论作者&#xff1a;焦李成整理&#xff1a;维克多编辑&#xff1a;青暮2021年12月17日&#xff0c;西安电子科技大学人工智能学院教授、欧洲科学院外籍院士、IEEE Fellow焦李成受邀参加2021中国计算机大会“下一代演化计算发展趋势”论坛&#xff0c;并…

5.3.1 TCP协议特点和TCP报文段格式

5.3.1 TCP协议特点和TCP报文段格式 文章目录tcp协议的特点tcp 报文段首部格式tcp协议的特点 tcp 报文段首部格式

互补性:从不同的角度思考同一个事物时,发现它同时具有不同甚至相互矛盾的性质...

来源&#xff1a;混沌巡洋舰检验一流智力的标准是头脑中能同时持有两种截然相反的观点&#xff0c;却能并行不悖。——弗朗西斯斯科特菲茨杰拉德显然&#xff0c;这种互补性推翻了学术的本体论。真理是什么&#xff1f;我们之所以要提出彼拉多的问题&#xff0c;并不是出于怀疑…

ObjectArx R14-2007下载地址

2008 &#xff0d;32位 http://download.autodesk.com/esd/objectarx/2008/ObjectARX_2008_32Bit.exe &#xff0d;64位 http://download.autodesk.com/esd/objectarx/2008/ObjectARX_2008_64Bit.exe 2007 &#xff0d;Core http://download.autodesk.com/esd/objectarx/2007/…

5.3.2 TCP连接管理

5.3.2 TCP连接管理 文章目录tcp 连接管理tcp的连接简历TCP传输连接中的SYN、ACK、SEQ、 AN分别是什么意思?syn洪泛攻击tcp的连接释放tcp 连接管理 tcp的连接简历 TCP传输连接中的SYN、ACK、SEQ、 AN分别是什么意思? syn洪泛攻击 tcp的连接释放

2021年量子计算的研发现状与未来展望

来源&#xff1a;AI科技评论作者&#xff1a;杏花编辑&#xff1a;青暮从硬件、软件和算法以及各国政策等方面展现量子技术最新进展。超导量子计算过去宣称实现的量子霸权在最新的获得戈登贝尔奖被宣告打破&#xff0c;但谷歌和IBM依然在这一领域有着雄心勃勃的计划。离子阱则凭…

Aligning Plots in a Column作图列对齐

Plot[Sin[x], {x, 0, Pi}] Plot[10000 Sin[x], {x, 0, Pi}]直接作图左边无法对齐&#xff0c;影响图的美观。可以使用左边界空格实现列对齐&#xff0c;代码如下&#xff1a; options {ImageSize -> 400, Frame -> True, ImagePadding -> {{60, Automatic}, {Automat…