原文: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. 玩转vue的slot内容分发

    vue的内容分发非常适合"固定部分+动态部分"的组件的场景,固定部分可以是结构固定,也可以是逻辑固定,比如下拉loading,下拉loading只是中间内容是动态的,而拉到底部都会 ...

  2. Java正则表达式实例详解

    创建正则表达式 你可以从比较简单的东西入手学习正则表达式.要想全面地掌握怎样构建正则表达式,可以去看JDK 文档的java.util.regex 的Pattern 类的文档. 字符 B 字符B \xh ...

  3. 切换默认jdk版本执行

    Java代码 # cd /usr/bin # ln -s -f /usr/java/jdk1.6.0_24/jre/bin/java # ln -s -f /usr/java/jdk1.6.0_24/ ...

  4. Gym - 102163M

    Gym - 102163M https://vjudge.net/problem/2356949/origin取对数,然后特判特殊情况,就是0的那些情况 #include<iostream> ...

  5. 华为云DevCloud一枝独秀

    DevOps,是Development和Operations的组合词,是指一组过程.方法与系统的统称,用于促进开发.技术运营和质量保障部门之间的沟通.协作与整合.DevOps是一种重视“软件开发人员( ...

  6. Django项目:CRM(客户关系管理系统)--21--13PerfectCRM实现King_admin分页页数

    {#table_data_list.html#} {## ————————08PerfectCRM实现King_admin显示注册表的字段表头————————#} {% extends 'king_m ...

  7. 20190814-A Second

    一秒,或是,第二次? 这考试也太频繁了吧…… 考试过程: 看三道题. T1没思路. 然后去厕所清醒了一下. 在厕所的时候,突然想到可以离散化. 于是就这么搞了. 然后去写T2. T2好像是数学题. 于 ...

  8. Java处理正则验证手机号-详解

    参考博客:https://www.cnblogs.com/wangzn/p/7212587.html https://www.cnblogs.com/go4mi/p/6426215.html pack ...

  9. oracle-表空间-用户-角色-权限

    概要图 概要图 一 表空间 1.1创建表空间 --问题:创建一个名为hp的表空间,指定数据文件为hp.dbf,大小为10m. create tablespace hp datafile 'C:\app ...

  10. Oracle中Function学习2

    上一节说函数 这回聊一下 存储过程:有了上节知识点,对这个也许会一种小感觉.呵呵 过程(存储过程):与过程相比, 存储过程是存在数据库中的一个对象 我主要通过例子来了解 不做多解释 相信你也能明白: ...