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 ...
随机推荐
- eureka添加security验证之后,client注册失败
高版本,以下配置已弃用 security: basic: enabled: true 所以需要自定义security配置开启basic认证,参考我的配置类 @Configuration @Enable ...
- (精简)Spring框架的IoC(替代工厂类实现方法)和AOP(定义规则,约定大于配置)
Spring的核心框架主要包含两个技术,分别用来处理工厂类,以及事务处理和连接管理的. 两大核心概念 1) IoC:控制反转,在现在的开发中,如果想建立对象并设置属性,是需要先new对象,再通过se ...
- Odoo 中的widget
many2many_tags one2many_list selection progressbar selection statusbar handle monetary mail_thread s ...
- Docx 生成word文档二
/// <summary> /// 生产word 文档 /// </summary> public class GenerateWord { /// <summary&g ...
- 没有ORM库的时候,通过PDO连接MySQL的方法
$pdo = new PDO("mysql:host=localhost;dbname=eq","root","root"); $pdo-& ...
- WPF:数据绑定--PropertyChangeNotification属性更改通知
PropertyChangeNotification属性更改通知 实现效果:1.拍卖金额自动随属性值变化而通知界面绑定的值变化. 关键词 : INotifyPropertyChanged Obse ...
- Python发送QQ消息
一.需求背景 每天早上取一批数据,数据文件经过压缩加密之后用邮箱发送,而解压密码通过QQ发送给运营.使用Python进行取数.文件加密在已经实现的情况下,需要实现通过QQ发送密码的功能. 在进 ...
- 学习线程池源码--ScheduledThreadPoolExecutor
1. 创建ScheduledThreadPoolExecutor ScheduledThreadPoolExecutor继承自ThreadPoolExecutor,实现了Schedule ...
- db link的查看创建与删除 1
1.查看dblink select owner,object_name from dba_objects where object_type='DATABASE LINK'; 或者 select * ...
- Javaweb项目中出现java.sql.SQLException: The server time zone value '�й���ʱ��' is unrecognized or represents more than one time zone.异常
javaweb项目中java.sql.SQLException: The server time zone value '�й���ʱ��' is unrecognized or represent ...