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 ...
随机推荐
- 查看cpu性能和磁盘空间
df -h查看当前磁盘空间 du -sh查看当前目录占用的磁盘空间 du -sh * 查看当前所有目录占用的磁盘空间 lscpu查看cpu信息 free查看空间总量
- vue 权限管理
核心想法: 登陆后获得用户角色,通过角色获得用户的权限,注入权限对应的路由.刷新页面,从localStorage用角色(更好的方式是通过token)再次获得所属权限,再次注入路由.在管理界面左端循环权 ...
- HttpRequest 工具
1.根据 url 和 encoding 获取当前url页面的 html 源代码 public static string GetHtml(string url, Encoding encoding) ...
- laravel--request类获取传值
request类获取传值 Request类的方法很多,常用的有如下几个: Request -> all() : 表示一次性获取所有的传值(包括get和post,但不能获取参数) Request ...
- 读书笔记--iBATIS in Action 目录
1.iBATIS的理念 2.iBATIS是什么 3.安装和配置iBATIS 4.使用以映射语句 5.执行非查询语句 6.使用高级查询技术 7.事务 8.使用动态SQL 9.使用高速缓存提高性能 10. ...
- []jnhs]日志套件log4j输出到控制台和文件
log4j的xml配置文件改为 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j: ...
- win10 系统同步时间出错
设置->时间和语言->区域和语言->其他日期,区域和时间设置->设置时间和日期->Internet时间->更改设置 应该会有两个服务器,分别更新下时间,哪个正确就用 ...
- linux之bc命令
当在脚本中要处理浮点数计算时,就可以使用bc计算器,先看下面的例子 [root@node2 tmp]# cat bc.sh #!/bin/bash # num1=`echo "scale=3 ...
- Django项目:CRM(客户关系管理系统)--12--05PerfectCRM实现King_admin注册功能获取内存01
#base_admin.py #Django admin 注册功能的形式 # sites = { # 'crm':{ # 'customers':CustomerAdmin, # 'customerf ...
- CSS(中)篇
1.1行高 行高属于文字的属性 行高=文字大小+上间距+下间距(默认行高=18px) 行高的作用: 设置文字垂直方向中有距离 文字垂直居中(行高=容器的高度) 影响行高的因素: 文字大小可以改变行高 ...