原文:Directx11学习笔记【二十一】 封装键盘鼠标响应类

摘要: 本文由zhangbaochong原创,转载请注明出处:http://www.cnblogs.com/zhangbaochong/p/5804565.html

  由于我们练习的Demo一般都比较简单,对响应时间效率没有太高要求,因此键盘鼠标响应可以采用Win32的处理函数,而不必使用DirectInput,DirectInput在后面会专门再介绍。

  为了方便使用,封装了一个Input类用于处理键盘鼠标消息,为了方便采用单例模式,代码很简单:

Input.h

 #pragma once
#include <Windows.h> class Input
{
public:
~Input(); public:
void Init();
void Listen(UINT msg, float x, float y); // Listen to the user input
static Input* GetInstance()
{
static Input* instance = new Input(); return instance;
} public:
float GetMouseX() const;
float GetMouseY() const;
float GetLastMouseX() const;
float GetLastMouseY() const;
bool IsLMouseDown() const;
bool IsRMouseDown() const;
bool IsMouseUp() const;
bool IsMouseMove() const;
int IsKeyDown(int key) const; private:
POINT m_lastMousePos;
POINT m_mousePos;
bool m_lMouseDown;
bool m_rMouseDown;
bool m_mouseUp;
bool m_mouseMove; private:
Input();
Input(const Input&);
void operator=(const Input&);
};

Input.cpp

 #include "Input.h"

 //******************
//禁止构造复制
//******************
Input::Input() {}
Input::Input(const Input&) {}
Input::~Input() {}
void Input::operator=(const Input&) {} void Input::Init()
{
m_lastMousePos = { , };
m_mousePos = { , };
m_lMouseDown = false;
m_rMouseDown = false;
m_mouseUp = false;
m_mouseMove = false;
} void Input::Listen(UINT msg, float x, float y)
{
m_lastMousePos.x = m_mousePos.x;
m_lastMousePos.y = m_mousePos.y; m_mousePos.x = x;
m_mousePos.y = y; switch (msg)
{
case WM_LBUTTONDOWN:
m_lMouseDown = true;
break;
case WM_RBUTTONDOWN:
m_rMouseDown = true;
break;
case WM_LBUTTONUP:
case WM_RBUTTONUP:
m_mouseUp = true;
m_lMouseDown = false;
m_rMouseDown = false;
break;
case WM_MOUSEMOVE:
m_mouseMove = true;
break;
default:
m_mouseMove = false;
break;
}
} float Input::GetMouseX() const
{
return m_mousePos.x;
} float Input::GetMouseY() const
{
return m_mousePos.y;
} float Input::GetLastMouseX() const
{
return m_lastMousePos.x;
} float Input::GetLastMouseY() const
{
return m_lastMousePos.y;
} bool Input::IsLMouseDown() const
{
return m_lMouseDown;
} bool Input::IsRMouseDown() const
{
return m_rMouseDown;
} bool Input::IsMouseUp() const
{
return m_mouseUp;
} bool Input::IsMouseMove() const
{
return m_mouseMove;
} int Input::IsKeyDown(int vKey) const
{
return GetAsyncKeyState(vKey) & 0x8000;
}

  使用的时候先在Dx11Base基类中初始化,并在消息处理函数WndProc中调用Listen函数:

bool SystemClass::init(HINSTANCE hInstance, int nCmdShow)
{
InputClass::getInstance()->init();
...
}
LRESULT CALLBACK Dx11Base::WinProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
Input::GetInstance()->Listen(uMsg, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
...
}

  以上个教程MeshDemo为例,Input类使用如下:

 void MeshDemo::UpdateCamera(float dt)
{
//前后左右行走
if (Input::GetInstance()->IsKeyDown('A'))
{
m_camera.Strafe(-.f*dt);
}
else if (Input::GetInstance()->IsKeyDown('D'))
{
m_camera.Strafe(.f*dt);
}
if (Input::GetInstance()->IsKeyDown('W'))
{
m_camera.Walk(.f*dt);
}
else if (Input::GetInstance()->IsKeyDown('S'))
{
m_camera.Walk(-.f*dt);
} if (Input::GetInstance()->IsMouseMove())
{
float mouseX = Input::GetInstance()->GetMouseX();
float mouseY = Input::GetInstance()->GetMouseY();
if (Input::GetInstance()->IsLMouseDown())
{
float dx = XMConvertToRadians(0.25f*(mouseX - m_lastMousePos.x));
float dy = XMConvertToRadians(0.25f*(mouseY - m_lastMousePos.y)); OutputDebugString(L"left btn click");
m_camera.Pitch(dy);
m_camera.RotateY(dx);
}
m_lastMousePos.x = mouseX;
m_lastMousePos.y = mouseY;
} m_camera.UpdateViewMatrix();
}

Directx11学习笔记【二十一】 封装键盘鼠标响应类的更多相关文章

  1. python3.4学习笔记(二十一) python实现指定字符串补全空格、前面填充0的方法

    python3.4学习笔记(二十一) python实现指定字符串补全空格.前面填充0的方法 Python zfill()方法返回指定长度的字符串,原字符串右对齐,前面填充0.zfill()方法语法:s ...

  2. (C/C++学习笔记) 二十一. 异常处理

    二十一. 异常处理 ● 异常的概念 程序的错误通常包括:语法错误.逻辑错误.运行异常. 语法错误指书写的程序语句不合乎编译器的语法规则,这种错误在编译.连接时由编译器指出. 逻辑错误是指程序能顺利运行 ...

  3. selenium_学习笔记——二次封装常用的方法

    # coding = utf-8 ''' 二次封装元素方法 加入循环查找方法,提高查找元素的稳定性 ''' from selenium import webdriver from selenium.w ...

  4. Java基础学习笔记二十一 多线程

    多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念.进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线 ...

  5. 过滤器(web基础学习笔记二十一)

    一.过滤器简介 二.在Eclipse中创建过滤器 三.使用过滤器设置全部web字符编码 public void doFilter(ServletRequest request, ServletResp ...

  6. Java学习笔记二十一:Java面向对象的三大特性之继承

    Java面向对象的三大特性之继承 一:继承的概念: 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方 ...

  7. PHP学习笔记二十一【全局变量】

    <?PHP //定义全局变量 global $a; $a=9; //给全局变量赋值 function test1() { global $a; $a=45; } test1(); echo $a ...

  8. Directx11学习笔记【十一】 画一个简单的三角形--effect框架的使用

    这里不再介绍effect框架的具体使用,有关effect框架使用可参考http://www.cnblogs.com/zhangbaochong/p/5475961.html 实现的功能依然是画一个简单 ...

  9. angular学习笔记(二十一)-$http.get

    基本语法: $http.get('url',{}).success(function(data,status,headers,config){}).error(function(data,status ...

随机推荐

  1. python使用matplotlib:subplot绘制多个子图

    1 问题描述 matploglib 能够绘制出精美的图表, 有些时候, 我们希望把一组图放在一起进行比较, 有没有什么好的方法呢? matplotlib 中提供的 subplot 可以很好的解决这个问 ...

  2. php 5.4 windows2003 iis 安装 注意

    php5.3 以上 不再支持ISAPI模式 只能用 FastCGI ....

  3. springcloud注册中心eureka

    1.前提 springcloud的注册中心是以springboot为基础搭建起来的. 开发工具:IDEA 项目管理工具:maven 2.搭建步骤 创建一个web项目(建议使用IDEA工具构建项目) 修 ...

  4. LintCode 链表倒数第n个节点

    找到单链表倒数第n个节点,保证链表中节点的最少数量为n. 样例 给出链表 3->2->1->5->null和n = 2,返回倒数第二个节点的值1. 分析:设两个指针 p1和p2 ...

  5. Jeecms网站直接访问html静态页面

    jeecms网站维护,遇到了直接通过链接的方式访问静态页面,jeecms官网也做了详细的解答,但是没有得到满意的结果.但是通过自己的深入研究以及别人的帮助,发现了一个很好的解决方法. 首先说明一下je ...

  6. 【Scala学习笔记】一、函数式编程的思想

    1. 函数是头等值.     在函数编程中,函数也是值,与整数和字符串处于同一地位.函数可以像变量一样被创建,修改,并当成变量一样传递,返回或是在函数中嵌套函数. 函数可以当做参数传递给其他函数.   ...

  7. Slackware网卡配置文件和配置工具

    Slackware 有关网卡的配置文件是/etc/rc.d/rc.inet1.conf , 这个文件包括乙太网接口的网卡和无线网卡的配置.Slackware 还是比较纯净的,网络配置也较简单:在Sla ...

  8. 怎么让一个不定宽高的div垂直水平居中?

    方法一:使用CSS3 transform 父盒子设置:position:relative; div设置:position:absolute;transform:translate(-50%,-50%) ...

  9. 2019阿里云开年Hi购季基础云产品分会场全攻略!

    2019阿里云云上Hi购季活动已经于2月25日正式开启,从已开放的活动页面来看,活动分为三个阶段: 2月25日-3月04日的活动报名阶段.3月04日-3月16日的新购满返+5折抢购阶段.3月16日-3 ...

  10. line-height的用法(一)

    行高”顾名思意指一行文字的高度.具体来说是指两行文字间基线之间的距离. 从上到下四条线分别是顶线.中线.基线.底线,很像才学英语字母时的四线三格,我们知道vertical-align属性中有top.m ...