Directx11学习笔记【二十一】 封装键盘鼠标响应类
原文: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学习笔记【二十一】 封装键盘鼠标响应类的更多相关文章
- python3.4学习笔记(二十一) python实现指定字符串补全空格、前面填充0的方法
python3.4学习笔记(二十一) python实现指定字符串补全空格.前面填充0的方法 Python zfill()方法返回指定长度的字符串,原字符串右对齐,前面填充0.zfill()方法语法:s ...
- (C/C++学习笔记) 二十一. 异常处理
二十一. 异常处理 ● 异常的概念 程序的错误通常包括:语法错误.逻辑错误.运行异常. 语法错误指书写的程序语句不合乎编译器的语法规则,这种错误在编译.连接时由编译器指出. 逻辑错误是指程序能顺利运行 ...
- selenium_学习笔记——二次封装常用的方法
# coding = utf-8 ''' 二次封装元素方法 加入循环查找方法,提高查找元素的稳定性 ''' from selenium import webdriver from selenium.w ...
- Java基础学习笔记二十一 多线程
多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念.进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线 ...
- 过滤器(web基础学习笔记二十一)
一.过滤器简介 二.在Eclipse中创建过滤器 三.使用过滤器设置全部web字符编码 public void doFilter(ServletRequest request, ServletResp ...
- Java学习笔记二十一:Java面向对象的三大特性之继承
Java面向对象的三大特性之继承 一:继承的概念: 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方 ...
- PHP学习笔记二十一【全局变量】
<?PHP //定义全局变量 global $a; $a=9; //给全局变量赋值 function test1() { global $a; $a=45; } test1(); echo $a ...
- Directx11学习笔记【十一】 画一个简单的三角形--effect框架的使用
这里不再介绍effect框架的具体使用,有关effect框架使用可参考http://www.cnblogs.com/zhangbaochong/p/5475961.html 实现的功能依然是画一个简单 ...
- angular学习笔记(二十一)-$http.get
基本语法: $http.get('url',{}).success(function(data,status,headers,config){}).error(function(data,status ...
随机推荐
- python使用matplotlib:subplot绘制多个子图
1 问题描述 matploglib 能够绘制出精美的图表, 有些时候, 我们希望把一组图放在一起进行比较, 有没有什么好的方法呢? matplotlib 中提供的 subplot 可以很好的解决这个问 ...
- php 5.4 windows2003 iis 安装 注意
php5.3 以上 不再支持ISAPI模式 只能用 FastCGI ....
- springcloud注册中心eureka
1.前提 springcloud的注册中心是以springboot为基础搭建起来的. 开发工具:IDEA 项目管理工具:maven 2.搭建步骤 创建一个web项目(建议使用IDEA工具构建项目) 修 ...
- LintCode 链表倒数第n个节点
找到单链表倒数第n个节点,保证链表中节点的最少数量为n. 样例 给出链表 3->2->1->5->null和n = 2,返回倒数第二个节点的值1. 分析:设两个指针 p1和p2 ...
- Jeecms网站直接访问html静态页面
jeecms网站维护,遇到了直接通过链接的方式访问静态页面,jeecms官网也做了详细的解答,但是没有得到满意的结果.但是通过自己的深入研究以及别人的帮助,发现了一个很好的解决方法. 首先说明一下je ...
- 【Scala学习笔记】一、函数式编程的思想
1. 函数是头等值. 在函数编程中,函数也是值,与整数和字符串处于同一地位.函数可以像变量一样被创建,修改,并当成变量一样传递,返回或是在函数中嵌套函数. 函数可以当做参数传递给其他函数. ...
- Slackware网卡配置文件和配置工具
Slackware 有关网卡的配置文件是/etc/rc.d/rc.inet1.conf , 这个文件包括乙太网接口的网卡和无线网卡的配置.Slackware 还是比较纯净的,网络配置也较简单:在Sla ...
- 怎么让一个不定宽高的div垂直水平居中?
方法一:使用CSS3 transform 父盒子设置:position:relative; div设置:position:absolute;transform:translate(-50%,-50%) ...
- 2019阿里云开年Hi购季基础云产品分会场全攻略!
2019阿里云云上Hi购季活动已经于2月25日正式开启,从已开放的活动页面来看,活动分为三个阶段: 2月25日-3月04日的活动报名阶段.3月04日-3月16日的新购满返+5折抢购阶段.3月16日-3 ...
- line-height的用法(一)
行高”顾名思意指一行文字的高度.具体来说是指两行文字间基线之间的距离. 从上到下四条线分别是顶线.中线.基线.底线,很像才学英语字母时的四线三格,我们知道vertical-align属性中有top.m ...