【Direct3D游戏开发】——DirectInput 让世界动起来

Direct3D基础:DirectInput和精灵动画技术 本文将介绍Direct3D中DirectInput的初始化及使用,以及如何实现精灵和动画。DirectInput是DirectX中的输入管理组件,负责管理键盘、鼠标等输入设备。文中详细讲解了获取DirectInput对象、初始化键盘和鼠标设备、设置数据格式、设置合作级别、获取设备等步骤。此外,文章还介绍了精灵动画的基础知识,包括如何使用ID3DXSprite接口来创建、动画化和绘制2D精灵。这些技术不仅限于2D图形,也适用于3D图形中图形对象的时间更新。 阅读详情

   其实我们是可以通过Windows消息和API取得键盘或者鼠标或者其他设备的输入信息,但这有个等待windows消息传送的延时,笔者试过直接在消息回调函数中相应键盘的上下左右消息去使场景中的模型进行旋转,感觉有明显的延时。这对于游戏玩家来说简直是噩梦,就好像我在玩lol,舍友都在用迅雷下AV一样的信息。而DirectX是直接与硬件进行交流,不需要去等待windows传送消息。DirectInput可以直接获得硬件的消息,立即响应。

  要用DirectInput获得一个硬件设备的信息和初始化Direct3D一样要经过几个步骤:

        1.创建DirectInput对象

        2.创建设备对象

        3.设定设备数据格式

        4.设定程序协调层级

        5.获得设备

        6.取得设备状态

  前面4步是初始化设备。

  1.创建DirectInput对象

        

//DirectInput8对象
	LPDIRECTINPUT8 pInputSystem;
//-1、创建DirectInput8对象
	hr = DirectInput8Create( hInst, DIRECTINPUT_VERSION, IID_IDirectInput8, 
							(VOID**)&pInputSystem, NULL );
	if( FAILED( hr ) )
	{
		MessageBox( NULL, L"DirectInput8Create()-FAILED!", NULL, MB_OK );
		return false;
	}
     首先声明一个DirectInput对象指针,然后调用DirectInput8Create()方法创建DirectInput对象,最后判断是否创建成功。具体参数含义可以查阅MSDN.

  2.创建设备对象 

     

//键盘设备
	LPDIRECTINPUTDEVICE8 pKeyboardDevice;
//-2、创建键盘DirectInput8Device
	hr = pInputSystem->CreateDevice( GUID_SysKeyboard, &pKeyboardDevice, NULL );
	if( FAILED(hr) )
	{
		MessageBox( NULL, L"pInputSystem->CreateDevice()-FAILED!", NULL, MB_OK );
		return false;
	}
   首先声明一个设备指针,然后调用DirectInput对象的成员函数CreateDevice()创建设备,这个创建的是键盘设备,具体由CreateDevice()的第一个参数决定,对于鼠标应为:GUID_SysMouse.


  3.设定设备数据格式

	//-3、设置键盘的数据格式
	hr = pKeyboardDevice->SetDataFormat( &c_dfDIKeyboard );
	if( FAILED( hr ) )
	{
		MessageBox( NULL, L"pKeyboardDevice->SetDataFormat()-FAILED!", NULL, MB_OK );
		return false;
	}

  由DirectInputDevice设备的SetDataFormat()成员函数完成,参数只有一个是一个关于数据格式的常量,对于鼠标有两种数据格式:c_dfDIMouse 、c_dfDIMouse2 用哪一个取决于先前声明的鼠标设备类型,但要保持前后一致。


  4.设定程序协同层级

//-4、设置设备合作等级
	hr = pKeyboardDevice->SetCooperativeLevel( _hWnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE );
	if( FAILED(hr) )
	{
		MessageBox( NULL, L"pKeyboardDevice->SetCooperativeLevel()-FAILED!", NULL, MB_OK );
		return false;
	}

   所谓的协同层级就是手你的程序如何和其他程序共同使用此设备。相关参数:

   DISL_BACKGROUND 程序当前非活跃,取得设备信息

   DISL_EXCLUSIVE 独占模式,其他程序无法使用程序所建立与使用的输入装置,设置前应先检查当前设备的协同等级

   DISL_FORCGROUND 程序只有在活跃时,才取得设备信息

   DISL_NONEXCLUSIVE非独占模型,与其他程序共享设备

   DISL_NOWINKEY 无法使用Windows键,防止使用者按下中断键导致程序结束


  5.获取设备

  

//-5、获取设备
		hr = pKeyboardDevice->Acquire();
		if( FAILED(hr) )
		{
			MessageBox( NULL, L"pMouseDevice->Acquire()-FAILED!", NULL, MB_OK );
			return false;
		}
   十分简单,调用设备的成员函数Acquire(), 检查是否获取成功。


  6.取得设备状态

if( FAILED(pKeyboardDevice->GetDeviceState( sizeof(keysBuffer), (LPVOID)keysBuffer )) )
		{
			if( FAILED( pKeyboardDevice->Acquire() ) )
				return false;
			if( FAILED( pKeyboardDevice->GetDeviceState( sizeof(keysBuffer), (LPVOID)keysBuffer )) )
			{
				MessageBox( NULL, L" pKeyboardDevice->GetDeviceState()-FAILED!", NULL, MB_OK );
				return false;
			}
		}

 也非常简单,调用设备的GetDeviceState()成员函数,一般在获取状态失败一次后再请求一次设备,然后获取设备状态。


  经过以上步骤就已经取得设备的当前状态,剩下的问题就是如何响应

  一、对于键盘消息

           

char keyboardState[256];
//方向键上按下
if( keyboardState[DIK_UP] & 0x80)
       //响应操作
//方向键右按下
if( keyboardState[DIK_RIGHT] & 0x80)
       //响应操作
//方向键下按下
if( keyboardState[DIK_DOWN] & 0x80)
       //响应操作
//方向键左按下
if( keyboardState[DIK_LEFT] & 0x80)
       //响应操作
  首先定义了一个256大小的数组作为输入缓冲区,代表键盘上256个键的状态,对于每一个键的状态是一个8bit的内存,高位代表键的状态。所以与(0x80)作And运算,如果不为0则代表此键被按下,反之未被按下。DIK_UP之类的是Direct的枚举类型。具体可查阅MSDN.


  二、对于鼠标

  对于鼠标在调用GetDeviceState()时需要在此函数的第二个参数传入一个类型为DIMOUSESTATE或DIMOUSESTATE2的结构体,以下是该结构体的定义

typedef struct DIMOUSESTATE {
    LONG lX;
    LONG lY;
    LONG lZ;
    BYTE rgbButtons[4];
} DIMOUSESTATE, *LPDIMOUSESTATE;

两个结构的的区别只在于最后一项rgbButtons[]的大小有所不同。当我们要响应鼠标消息时要利用到rgbButtons[]数组,rgbButtons[0]代表鼠标左键的状态,rgbButtons[1]代表鼠标右键的状态,同样采用 and (0x80)的方法判断键的状态。


  三、对于游戏控制器,手柄呀什么的判断哪个键是否被按下的方法还是一样只是取得的状态保存的结构不一样,具体这里不想说,可以查阅MSDN.


        一个封装后的DirectInput类,支持响应鼠标和键盘输入。

/********************************************************************
*						  游戏输入类								*
*		  file:		CLDirectInput.h								*
*	      copyright   (C) 2013 by CoderLing							*
*         email       : coderling@gmail.com 						*
*		  blog:	http://blog.youkuaiyun.com/coderling					*
********************************************************************/


#ifndef CLDIRECTINPUT_H
#define CLDIRECTINPUT_H
#define DEBUG
#define DIM_LEFT 0
#define DIM_RIGHT 1
#define DIRECTINPUT_VERSION 0x0800
#define KEY_SIZE 256 //键盘数据大小

#include <dinput.h>


struct POINT3
{
	int x, y, z;
	POINT3( int _x, int _y, int _z)
	{
		x = _x; y = _y; z = _z;
	}
};

class CLDirectInput
{
	//---------------------------------------------
	//-1.处理键盘消息
	//----上下左右,字符消息
	//-2.处理鼠标消息
	//----鼠标左右键,中建
	//---------------------------------------------
	
public:
	CLDirectInput();
	~CLDirectInput();
public:
	//初始化directInput
	bool Initialize( HWND, HINSTANCE ); 
	//更新设备当前状态
	bool UpdateDevices();
	//响应应键盘消息
	bool IsKeyDown( unsigned int );
	bool IsKeyUp( unsigned int );
	//响应鼠标消息
	bool IsMouseButtonDown( unsigned int );
	bool IsMouseButtonUp( unsigned int );
	long GetMouseWheelDir();
	POINT GetMousePos();
	POINT GetMousePosRel();
protected:
	//由析构函数调用,释放资源
	void ShutDown();

	//DirectInput8对象
	LPDIRECTINPUT8 pInputSystem;

	//键盘设备
	LPDIRECTINPUTDEVICE8 pKeyboardDevice;
	char keysBuffer[KEY_SIZE];
	char keysBufferOld[KEY_SIZE];

	//鼠标设备
	LPDIRECTINPUTDEVICE8 pMouseDevice;
	DIMOUSESTATE mouseState;
	DIMOUSESTATE mouseStateOld;

	//鼠标位置信息,为移动量
	long xMousePos;
	long yMousePos;

private:

};

#endif

/********************************************************************
*						  游戏输入类								*
*		  file:		CLDirectInput.cpp									*
*	      copyright   (C) 2013 by CoderLing							*
*         email       : coderling@gmail.com 						*
*		  blog:	http://blog.youkuaiyun.com/coderling					*
********************************************************************/

#include "CLDirectInput.h"
#include <Windows.h>
#include <iostream>
#include <fstream>

//g构造函数
CLDirectInput::CLDirectInput()
	:pInputSystem( NULL ), pKeyboardDevice( NULL ),
	  pMouseDevice( NULL ), xMousePos( 0 ), yMousePos( 0 )
{
	memset( keysBuffer, 0, sizeof(char)*KEY_SIZE );
	memset( keysBufferOld, 0, sizeof(char)*KEY_SIZE );
	memset( &mouseState, 0, sizeof( mouseState ) );
	memset( &mouseStateOld, 0, sizeof( mouseStateOld ) );
}

//析构函数
CLDirectInput::~CLDirectInput()
{
	ShutDown();
}

//---------------------------------------------
//-name: Initialize()
//初始化DirectInput
//-1、创建DirectInput8对象
//-2、创建DirectInputDevice设备
//-3、设置设备数据格式,取决于何种设别
//-4、设置设备合作等级
//----------------------------------------------
bool CLDirectInput::Initialize(HWND hWnd, HINSTANCE hInst)
{
	HRESULT hr;
	HWND _hWnd = hWnd;

	//-1、创建DirectInput8对象
	hr = DirectInput8Create( hInst, DIRECTINPUT_VERSION, IID_IDirectInput8, 
							(VOID**)&pInputSystem, NULL );
	if( FAILED( hr ) )
	{
		MessageBox( NULL, L"DirectInput8Create()-FAILED!", NULL, MB_OK );
		return false;
	}
	//---------键盘初始化---------------begin//
	//-2、创建键盘DirectInput8Device
	hr = pInputSystem->CreateDevice( GUID_SysKeyboard, &pKeyboardDevice, NULL );
	if( FAILED(hr) )
	{
		MessageBox( NULL, L"pInputSystem->CreateDevice()-FAILED!", NULL, MB_OK );
		return false;
	}

	//-3、设置键盘的数据格式
	hr = pKeyboardDevice->SetDataFormat( &c_dfDIKeyboard );
	if( FAILED( hr ) )
	{
		MessageBox( NULL, L"pKeyboardDevice->SetDataFormat()-FAILED!", NULL, MB_OK );
		return false;
	}

	//-4、设置设备合作等级
	hr = pKeyboardDevice->SetCooperativeLevel( _hWnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE );
	if( FAILED(hr) )
	{
		MessageBox( NULL, L"pKeyboardDevice->SetCooperativeLevel()-FAILED!", NULL, MB_OK );
		return false;
	}

	//清空缓冲区
	memset( keysBuffer, 0, sizeof(char)*KEY_SIZE );
	//------键盘初始化----------end//

	//------鼠标初始化----------begin//
	//-2、创建鼠标设备
	hr = pInputSystem->CreateDevice( GUID_SysMouse, &pMouseDevice, NULL );
	if( FAILED(hr) )
	{
		MessageBox( NULL, L"pInputSystem->CreateDevice()-FAILED!", NULL, MB_OK );
		return false;
	}

	//-3、设置鼠标数据格式
	hr = pMouseDevice->SetDataFormat( &c_dfDIMouse );
	if( FAILED(hr) )
	{
		MessageBox( NULL, L"pMouseDevice->SetDataFormat()-FAILED!", NULL, MB_OK );
		return false;
	}

	//-4、设置设备合作等级
	hr = pMouseDevice->SetCooperativeLevel( _hWnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE );
	if( FAILED(hr) )
	{
		MessageBox( NULL, L"pMouseDevice->SetCooperativeLevel()-FAILED!", NULL, MB_OK );
		return false;
	}
	//-----鼠标初始化--------end//

	return true;
}

//----------------------------------------------
//-name:UpdateDevice()
//-更新设备状态
//-GetDeviceState()
//----------------------------------------------
bool CLDirectInput::UpdateDevices()
{
	HRESULT hr;

	//-更新鼠标信息
	if( pMouseDevice )
	{
		//-5、获取设备
		hr = pMouseDevice->Acquire();
		if( FAILED(hr) )
		{
			MessageBox( NULL, L"pMouseDevice->Acquire()-FAILED!", NULL, MB_OK );
			return false;
		}
		memcpy( &mouseStateOld, &mouseState, sizeof(mouseState) );
		if( FAILED(pMouseDevice->GetDeviceState( sizeof(DIMOUSESTATE), (LPVOID)&mouseState )) )
		{
			if( FAILED(pMouseDevice->Acquire()) )
				return false;
			if( FAILED(pMouseDevice->GetDeviceState( sizeof(DIMOUSESTATE), (LPVOID)&mouseState )) )
			{
				MessageBox( NULL, L"pMouseDevice->GetDeviceState()-FAILED!", NULL, MB_OK );
				return false;
			}
		}
		xMousePos += mouseState.lX;
		yMousePos += mouseState.lY;
	}

	//-更新键盘信息
	if( pKeyboardDevice )
	{
		//-5、获取设备
		hr = pKeyboardDevice->Acquire();

		if( FAILED(hr) )
		{
			MessageBox( NULL, L"pKeyboardDevice->Acquire()-FAILED!", NULL, MB_OK );
			return false;
		}
		//保留信息用于比较
		memcpy( keysBufferOld, keysBuffer, sizeof(char)*KEY_SIZE );
		if( FAILED(pKeyboardDevice->GetDeviceState( sizeof(keysBuffer), (LPVOID)keysBuffer )) )
		{
			if( FAILED( pKeyboardDevice->Acquire() ) )
				return false;
			if( FAILED( pKeyboardDevice->GetDeviceState( sizeof(keysBuffer), (LPVOID)keysBuffer )) )
			{
				MessageBox( NULL, L" pKeyboardDevice->GetDeviceState()-FAILED!", NULL, MB_OK );
				return false;
			}
		}
	}
#ifndef DEBUG
	std::ofstream out;
	out.open("text.txt");
	for(int i = 0;i < 256;i++)
	{
		if(keysBuffer[i] != 0)
		out<<"dfadf"<<' ';
	}
	out<<std::endl <<std::endl;
	out.close();
#endif
	return true;
}

//----------------------------------------------
//-name:IsKyeDown()
//-判断键盘是否有键被按下
//----------------------------------------------
bool CLDirectInput::IsKeyDown( unsigned int keyNum )
{
	return keysBuffer[keyNum] & 0x80;
}

//----------------------------------------------
//-name:IsKeyUp()
//-判断键盘的键是否处于一般状态
//----------------------------------------------
bool CLDirectInput::IsKeyUp( unsigned int keyNum )
{
	//-如果此键没被按下,而且之前被按下
	return !(keysBuffer[keyNum] & 0x80) && (keysBuffer[keyNum] != keysBufferOld[keyNum]);
}

//----------------------------------------
//-name:IsMouseButtonDown()
//-判断鼠标是否被按下
//----------------------------------------
bool CLDirectInput::IsMouseButtonDown( unsigned int buttonId )
{
	return mouseState.rgbButtons[buttonId] & 0x80;
}

//---------------------------------------
//-name:IsMouseButtonUp()
//-判断按下的某键是否松开
//---------------------------------------
bool CLDirectInput::IsMouseButtonUp( unsigned int buttonId )
{
	return !(mouseState.rgbButtons[buttonId] & 0x80) &&
		   (mouseState.rgbButtons[buttonId] != mouseStateOld.rgbButtons[buttonId]);
}

//----------------------------------------
//-GetMouseRelative()
//-返回鼠标滚轮滚动方向,true代表向前
//----------------------------------------
long CLDirectInput::GetMouseWheelDir()
{
	return mouseState.lZ;
}

//------------------------------------------
//-GetMousePos()
//-返回鼠标坐标
//-------------------------------------------
POINT CLDirectInput::GetMousePos()
{
	POINT pos;
	pos.x = xMousePos;
	pos.y = yMousePos;
	return pos;
}

POINT CLDirectInput::GetMousePosRel()
{
	POINT rel;
	rel.x = mouseState.lX;
	rel.y = mouseState.lY;
	return rel;
}
//------------------------------------------
//-name:ShutDown()
//-释放相应资源
//------------------------------------------
void CLDirectInput::ShutDown()
{
	if( pInputSystem )
	{
		pInputSystem->Release();
		pInputSystem = NULL;
	}

	if( pKeyboardDevice )
	{
		pKeyboardDevice->Unacquire();
		pKeyboardDevice->Release();
		pKeyboardDevice = NULL;
	}

	if( pMouseDevice )
	{
		pMouseDevice->Unacquire();
		pMouseDevice->Release();
		pMouseDevice = NULL;
	}
}

           

          今天写的一个输入DEMO,其实主要为了学习Direct3D的字体,然后就顺便把input类完善了下,并应用在上面。传送门

             The End~~~~~~~~~~~~

          昨天WG说他在琴房遇到了一个漂亮的师妹,长的像loli一般,回来和我说太久没经过妹子了,紧张的一B。然后我在想真是青春啊,然后又想到的是,IT男呀,推得了方程式,推不倒妹子,唉o(╯□╰)o

深入理解Direct3D和DirectInput编程接口 本文详细解读了Direct3D和DirectInput在游戏编程中的应用,通过分析Direct3D的设备创建、场景管理、渲染等核心函数,以及DirectInput的设备获取、状态获取等关键操作,帮助读者更好地理解和运用这些接口进行高效的游戏开发。 阅读详情

相关推荐

基于DirectX的3D游戏开发项目实战

DirectX是微软公司为游戏和多媒体应用提供的API集合,它包含了多个子组件,每个组件都致力于处理不同类型的任务。例如,Direct3D负责3D图形渲染,而DirectSound和DirectMusic分别负责处理声音和音乐。DirectInput则是负责处理用户输入,包括键盘、鼠标和游戏手柄等。这些组件协作运行,为游戏开发者提供一套完整的工具集,以便构建丰富和高效的多媒体应用。

weixin_35307279的博客 948

DX9 DirectX鼠标控制程序 代码

代码实例1: // @time: 2012.3.26 // @author: jadeshu // des: DirectX鼠标控制程序 #include &lt;Windows.h&gt; #include &lt;d3d9.h&gt; #include &lt;d3dx9.h&gt; #include &lt;atlstr.h&gt; #define DIRECTINPUT_VERSIO...

jadeshu的博客 1438

DirectX游戏开发终极指南 - 两部分完整版

本文还有配套的精品资源,点击获取 简介:DirectX是为Windows多媒体和图形开发设计的应用程序接口套件。该指南分为两部分,介绍DirectX的各组件如Direct3D、DirectDraw、DirectInput、DirectSound和DirectPlay,及其在游戏开发中的应用。用户需下载完整才能获取全部内容,内容可能包括3D图形渲染、2D图形加速、输入设备支持...

weixin_26850469的博客 2068

第九章 DirectX 输入和声音(上)

在Windows程序中,用户通过键盘或者鼠标输入的消息并不是应用程序直接处理的,而是通过Windows的消息机制转发给Windows操作系统。Windows操作系统对这些消息进行响应后,在通过回调应用程序的窗口过程函数进行相应的消息处理。在DirectX中,微软为我们提供了名为DirectInput接口对象来实现用户的输入。DirectInput直接和硬件驱动打交道,处理用户的输入要比消息机制快的多。 DirectInput这套API自DirectX8更新以来,功能已经足够完善了。因此我们使用Dire

konkon2012的博客 1114

C++实现的DirectX9.0东方永夜抄游戏开发项目

DirectX 9.0是微软公司发布的一套用于Windows平台上的多媒体应用程序接口集合,它专门为游戏和视频处理等多媒体应用提供了丰富的功能。DirectX 9.0引入了高级着色器语言(HLSL),大幅提高了图形渲染的质量和效率,这使得游戏开发者能够创建更加逼真的视觉效果。同时,DirectX 9.0还包括了Direct3D、DirectSound、DirectInput等多个子API,分别对应图形渲染、音频处理、用户输入等方面的管理。这一代API还支持大量的硬件加速,确保了游戏运行的流畅性。

weixin_36304957的博客 1142

DirectX游戏开发实践指南:电子书与源码剖析

DirectX 是微软公司开发的一组应用程序接口(APIs),为程序与计算机硬件之间的交互提供了一条快速通道。DirectX 旨在实现高质量的多媒体处理,尤其是为游戏和视频播放提供优秀的图形渲染、音频处理以及网络通信能力。本章详细介绍了DirectInput在用户输入处理方面的作用和实现方式。首先,我们从基础的输入设备分类和特性讲起,了解了如何处理键盘和鼠标的事件。接着,我们深入探讨了DirectInput的高级技术,比如手柄的力反馈和多点触控的支持,这些都是现代游戏不可或缺的交互元素。

weixin_34520664的博客 854

VC6捕获鼠标事件(移动、单击等)的一些总结(MFC消息、DriectInput、钩子)

近日要实现远程控制,需要捕获本地鼠标信息,传输到远程计算机。 鼠标事件,无非是WM_LBUTTONDOWN、WM_LBUTTONUP、WM_MOUSEMOVE(就说这基本的三个命令吧),开始以为很容易获取这些事件,但在实现过程中,并不是想象中的那么简单: ① 在基于MFC中的对话框应用程序中,可以在 PreTranslateMessage 中获取(【主对话框】的或者是【CWin

dijkstar的专栏 3万+

C# 基于 directinput 操控手柄

基于 directinput 手柄操控、包含震动 源码

【Direct3D】DirectInput

//-----------------------------------【程序说明】---------------------------------------------- //------------------------------------------------------------------------------------------------ //------

Naruto_Hinata_的博客 1376

复用浏览器之跳过扫码登录

复用浏览器 1、通过命令启动浏览器:chrome --remote-debugging-port=9222(前提是退出所有的chrome浏览器) 2、启动浏览器之后,在地址栏输入127.0.01:9222,成功复用如下图所示:

qq_43911915的博客 2033

STM32外部中断与事件机制深度解析:从硬件触发到软件响应

本文深入解析STM32外部中断与事件机制,从硬件触发到软件响应的完整流程。通过对比中断和事件的应用场景、响应速度及配置方法,帮助开发者优化嵌入式系统设计,特别适合需要低功耗或高实时性的项目。

weixin_29175469的博客 407

[Direct3D 学习笔记]DirectInput

转自:http://blog.youkuaiyun.com/zhmxy555/article/details/8547531 一、引言 众所周知,在普通的Windows程序中,用户通过键盘或者鼠标输入的消息并不是应用程序直接处理的,而是通过Windows的消息机制转发给Windows操作系统的。Windows操作系统对这些消息进行响应后,在通过回调应用程序的窗口过程函数进行相应的...

WO125654193的博客 415

200SMART PLC时间不准?手把手教你用MCGS触摸屏实现自动校时(附完整代码)

本文针对西门子200SMART PLC时钟不准的常见问题,提供了一套基于MCGS触摸屏的自动校时解决方案。文章详细阐述了时钟偏差的根源、时间同步方案的技术选型,并手把手指导如何配置MCGS与PLC的通信,以及编写完整的PLC时间读取、转换与设置代码,最终实现稳定可靠的自动时间同步功能。

jupyter5notebook的博客 452

【Visual C++】游戏开发笔记四十二 浅墨DirectX教程之十 游戏输入控制利器:DirectInput专场

本系列文章由zhmxy555(毛星云)编写,转载请注明出处。  文章链接: http://blog.youkuaiyun.com/zhmxy555/article/details/8547531作者:毛星云(浅墨)    邮箱: happylifemxy@163.com    在本篇文章中,我们一起详细探索了DirectInput这套在PC游戏即时控制方面一手遮天的API。下面先来看一下这篇一万多字文章的大体

【浅墨的游戏编程Blog】毛星云(浅墨)的专栏 4万+

数字IC后端时序违例修复:setup/hold冲突与时钟树优化实战

时序收敛是数字IC后端设计中最关键的环节之一,直接影响芯片能否在目标频率下稳定工作。建立时间与保持时间的本质是寄存器对数据稳定性的物理约束,而实际工程中,setup违例和hold违例往往此消彼长,冲突的根源在于数据路径与时钟路径的延迟匹配。时钟树综合(CTS)作为连接逻辑与物理的关键步骤,其skew、insertion delay和transition的优化直接决定了时序修复的成败。通过useful skew技术、合理的单元替换和路径结构调整,可以系统性地解决setup/hold冲突,实现时序收敛。本文结合

weixin_28292761的博客 220

Windows摄像头错误0xA00F4240根因与注册表修复指南

Windows摄像头错误码0xA00F4240常被误判为硬件故障,实则源于UWP应用模型下权限调用链断裂——核心是COM组件调用失败(HRESULT 0x80004003),本质反映Windows Runtime API对注册表策略键值(如CapabilityAccessManager\ConsentStore\webcam)的强依赖。该机制涉及服务状态、DWORD权限配置、ACL继承控制等多层校验,任一环节异常(如ValueLastModified时间戳损坏或ALL APPLICATION PACKAGE

weixin_31742871的博客 384

【Direct3D游戏开发】——重温Direct3D游戏开发详解 1、2、4章

由于此前已经看过一下,但没坚持看下去,这次重新浏览了下。         第一章:认识Directx与Directx SDK             Directx SDK包含:                         a.Direct3D:3D图形包  b.DirectDraw:2D图形包   c.DirectInput:为游戏输入提供各方面的支持

所学、所思、所悟——coderling 893

AutoCAD矢量数据导出全攻略:GIS4CAD插件一键转shp/mdb/kml(附安装包)

本文详细介绍了GIS4CAD插件如何高效解决AutoCAD矢量数据向GIS格式转换的难题。通过一键操作,用户可将CAD中的规划图、地形图等无损转换为行业标准的shp、mdb、kml等多种格式,并确保属性完整与坐标准确。文章提供了从插件安装、数据准备到实战导出的全流程指南,是城市规划、测绘等领域专业人士提升数据互操作效率的必备攻略。

a2b3c4d5e的博客 282

【Visual C++】游戏开发笔记四十三 浅墨DirectX教程十一 为三维世界添彩:纹理映射技术(二)

本系列文章由zhmxy555(毛星云)编写,转载请注明出处。  文章链接: http://blog.youkuaiyun.com/zhmxy555/article/details/8567848作者:毛星云(浅墨)    邮箱: happylifemxy@163.com     本篇文章里,我们首先对Direct3D之中固定功能流水线中的纹理映射相关的知识进行了详尽的剖析,然后我们将DirectInput这套

【浅墨的游戏编程Blog】毛星云(浅墨)的专栏 2万+

Python 爬虫实战:爬取微博热搜与用户评论数据

本文系统讲解微博热搜榜单与用户评论数据的爬取技术方案。针对微博热搜榜采用Requests+BeautifulSoup解析静态HTML结构,实现高效爬取;对于动态加载的评论数据,使用Selenium模拟浏览器行为规避反爬机制。详细阐述技术选型、反爬策略、数据清洗及存储方法,提供完整代码实现和输出示例。同时强调合规要求,提示开发者需在遵守平台规则的前提下进行数据采集。该方案为舆情分析和热点研究提供了可落地的技术实现路径。

2503_91057718的博客 1712

基于STM32单片机的智能分拣系统

基于STM32单片机的智能分拣系统是一种高效、精准的自动化分拣解决方案,适用于物流、仓储、制造业等领域。该系统利用STM32单片机作为核心控制器,结合传感器技术、电机控制算法和通信模块,实现对物品的自动识别、分类和分拣。通过智能化的设计,该系统能够大幅提高分拣效率,降低人工成本,并减少错误率。基于STM32单片机的智能分拣系统是一种高效、精准、低成本的自动化解决方案,能够广泛应用于物流、制造、环保等领域。

qq_62634009的博客 1939

DirectInput---输入输出控制利器

D3DUtil.h //============================================================================= // Desc: D3DUtil.h头文件,用于公共辅助宏的定义 // 2013年 2月03日 Create by 浅墨 //==============================================

新博客:https://aping-dev.com/ 4011

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Direct3D-封装DirectInput

这里我主要将的是怎么对Direct

Kaven的专栏 1024

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

DirectX 9 UI设计学习笔记之三:第4章Introducing DirectInput+第5章Wrapping Direct3D

此文由哈利_蜘蛛侠原创,转载请注明出处!有问题欢迎联系本人!        邮箱:2024958085@qq.com          上一期的地址: DX 9 UI设计学习笔记之二   第4章 Introducing DirectInput =====================================================================

哈利_蜘蛛侠的专栏 1983

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

上一篇: 【Directx3D游戏开发】——网格模型(mesh .x)
下一篇: 【Direct3D游戏开发】——蒙皮骨骼动画学习笔记
CoderLing
博客等级 码龄15年 40粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值