界面模式
登录
注册
会员
帮助
加入收藏夹
客服微信
瑞星卡卡安全论坛
技术交流区
系统软件
【原创】游戏制作新手晋级 之 DirectInput封装
企业产品讨论区
瑞星安全云终端软件
瑞星ESM防病毒终端安全防护系统
瑞星杀毒软件网络版(含Linux)
瑞星智能沙箱分析/恶意代码威胁监测分析/上网行为管理
瑞星防毒墙5.0、瑞星下一代防火墙
瑞星虚拟化恶意代码防护系统
个人产品讨论区
瑞星之剑
瑞星防病毒安全软件
瑞星杀毒软件
瑞星个人防火墙V16
瑞星AI网络威胁检测引擎、威胁情报及网安知识图谱
瑞星其他产品
技术交流区
反病毒/反流氓软件论坛
可疑文件交流
恶意网站交流
入侵防御(HIPS)
系统软件
硬件交流
综合娱乐区
影音贴图
瑞星安全游戏
活动专区
本站站务区
站务
瑞星“1+2”全新解决方案巡展在广州画上圆满句号
叶院长揭秘:瑞星如何运用AI技术革新网络安全
俄乌冲突加剧网络攻击风险 白俄罗斯政府遭APT攻击
瑞星ESM防病毒系统助力矿业大学筑牢网络安全防线
实力拉满 瑞星第四十七次通过VB100测评
携手老友,拥抱新精彩 —— 新论坛新活动,感谢你的陪伴
护航司法,瑞星助力山西省高院构建安全防线
人工智能在网络安全领域的风险和机遇
1
1
/ 1 页
跳转
页
【原创】游戏制作新手晋级 之 DirectInput封装
收藏
我是天心飞仙
初生襁褓狮
帖子:
33
注册:
2006-08-13
来自:
发表于: 2006-08-16 12:53
|
只看楼主
短消息
资料
字号:
小
中
大
1楼
【原创】游戏制作新手晋级 之 DirectInput封装
获取外部设备的状态是游戏中必不可少的部分,但是看到很多初学者并不能很好的组织DirectInput,以至于被那些复杂的接口搞得晕头转向。故有此文。
封装要做的工作就是,把那些复杂的接口,做成你自己“看得惯”的东西:)
DI的封装主要有以下几个部分:
[1]Initialize 初始化DI控制组件
[2]GetDevices 获取输入设备状态
[3]SetMousePos 设置鼠标位置
[4]Release 释放DI控制组件
2006-08-17 11:58:16
分享到:
短消息
资料
加为好友
全部帖子
性别:
精华:
0
威望:
39
贡献:
0
金钱:
0
状态:
离线
等级:
我是天心飞仙
初生襁褓狮
帖子:
33
注册:
2006-08-13
来自:
发表于: 2006-08-16 12:54
|
只看楼主
短消息
资料
字号:
小
中
大
2楼
先来看看封装的头文件 MyDirectInput.h
///////////////////////////////////////////////////////////////////////////////
//MyDirectInput.h
//DirectInput封装
///////////////////////////////////////////////////////////////////////////////
#pragma once
#pragma message("MyDirectInput.h --> Linking with dinput8.lib")
#pragma comment(lib,"dinput8.lib")
#include <windows.h>
#include <windowsx.h>
#include <dinput.h>
//DI对象
extern LPDIRECTINPUT8 lpDInput = NULL;
extern LPDIRECTINPUTDEVICE8 lpDIKey = NULL;
extern LPDIRECTINPUTDEVICE8 lpDIMouse = NULL;
//数据缓冲
extern UCHAR key[256];
extern DIMOUSESTATE mouse_state;
//封装接口
extern BOOL Initialize(void ); //初始化
extern BOOL GetDevices(void ); //获取设备
extern BOOL SetMousePos(POINT ); //设置鼠标位置
extern BOOL SetMousePos(long ,long );
extern BOOL Release(void ); //释放
//封装变量
extern BOOL mleft,mright,mcenter; //鼠标按键状态
extern POINT mpt; //鼠标指针位置
短消息
资料
加为好友
全部帖子
性别:
精华:
0
威望:
39
贡献:
0
金钱:
0
状态:
离线
等级:
我是天心飞仙
初生襁褓狮
帖子:
33
注册:
2006-08-13
来自:
发表于: 2006-08-16 12:55
|
只看楼主
短消息
资料
字号:
小
中
大
3楼
再来看实现部分 MyDirectInput.cpp :
///////////////////////////////////////////////////////////////////////////////
//MyDirectInput.cpp
///////////////////////////////////////////////////////////////////////////////
#include "MyDirectInput.h"
#include <windows.h>
#include <windowsx.h>
#include <dinput.h>
///////////////////////////////////////////////////////////////////////////////
extern HWND hWnd;
extern HINSTANCE hInstance;
extern char buffer[80];
//DI对象
LPDIRECTINPUT8 lpDInput = NULL;
LPDIRECTINPUTDEVICE8 lpDIKey = NULL;
LPDIRECTINPUTDEVICE8 lpDIMouse = NULL;
//数据缓冲
UCHAR key[256];
DIMOUSESTATE mouse_state;
BOOL mleft,mright,mcenter;
POINT mpt;
///////////////////////////////////////////////////////////////////////////////
//[1]Initialize 初始化DI控制组件
//分析:游戏中最常用的两个输入设备就是鼠标和键盘,我们的这个封装就是要完成这对两个设备状态的操作。
// 初始化部分,首先要创建DirectInput对象,再创建设备对象。
///////////////////////////////////////////////////////////////////////////////
BOOL Initialize(void )
{
//DirectInput Interface
if(FAILED(DirectInput8Create(hInstance,DIRECTINPUT_VERSION,IID_IDirectInput8,(VOID**)&lpDInput,NULL)))
{
ShowError("DirectInput8Create ERROR");
return FALSE;
}
//Keyboard
if(lpDI->CreateDevice(GUID_SysKeyboard,&lpDIKey,NULL)!=DI_OK)
{
ShowError("lpDI->CreateDevice Keyboard ERROR");
return FALSE;
}
if(lpDIKey->SetCooperativeLevel(hWnd,DISCL_BACKGROUND|DISCL_NONEXCLUSIVE|DISCL_NOWINKEY)!==DI_OK)
{
ShowError("lpDIKeyboard->SetCooperativeLevel ERROR");
return False;
}
if(lpDIKey->SetDataFormat(&c_dfDIKeyboard)!=DI_OK)
{
ShowError("lpDIKeyboard->SetDataFormat ERROR");
return False;
}
if(lpDIKey->Aquire()!=DI_OK)
{
ShowError("lpDIKeyboard->Acquire ERROR");
return False;
}
//Mouse
if(lpDI->CreateDevice(GUID_SysKeyboard,&lpDIMouse,NULL)!=DI_OK)
{
ShowError("lpDI->CreateDevice Mouse ERROR");
return FALSE;
}
if(lpDIMouse->SetCooperativeLevel(hWnd,DISCL_BACKGROUND|DISCL_EXCLUSIVE|DISCL_NOWINKEY)!==DI_OK)
{
ShowError("lpDIMouse->SetCooperativeLevel ERROR");
return False;
}
if(lpDIMouse->SetDataFormat(&c_dfDIMouse)!=DI_OK)
{
ShowError("lpDIMouse->SetDataFormat ERROR");
return False;
}
if(lpDIMouse->Aquire()!=DI_OK)
{
ShowError("lpDIMouse->Acquire ERROR");
return False;
}
return TRUE;
}
///////////////////////////////////////////////////////////////////////////////
//[2]GetDevices 获取输入设备状态
//分析:未经封装的设备状态使用十分不便,这个函数统一获取了有用的状态,以便集中调用
///////////////////////////////////////////////////////////////////////////////
BOOL GetDevices(void )
{
//获取设备信息
lpDIKey->GetDeviceState(256,(LPVOID)key);
lpDIMouse->GetDeviceState(sizeof(DIMOUSESTATE)),(LPVOID)&mouse);
//调整按键状态
if(mouse.rgbButtons[0]&0x80) mleft = TRUE; //左键
if(mouse.rgbButtons[1]&0x80) mright = TRUE; //右键
if(mouse.rgbButtons[2]&0x80) mcenter = TRUE; //中键
//调整鼠标位置
//注意,mouse.lX 和 mouse.lY 都是相对于上一次的偏移量!
mpt.x += mouse.lX;
mpt.y += mouse.lY;
return TRUE;
}
///////////////////////////////////////////////////////////////////////////////
//[3]SetMousePos 设置鼠标位置
//分析:由于mouse状态中的lX和lY都是偏移量,所以可以通过直接修改mpt的方法设置鼠标位置
//注意:这个函数有多态性
///////////////////////////////////////////////////////////////////////////////
BOOL SetMousePos(POINT pt )
{
mpt = pt;
return TRUE;
}
BOOL SetMousePos(long x ,long y )
{
mpt.x = x;
mpt.y = y;
return TRUE;
}
///////////////////////////////////////////////////////////////////////////////
//[4]Release 释放DI控制组件
//注意:由于初始化时创建的顺序不同,所以要相对应的一次释放对象
///////////////////////////////////////////////////////////////////////////////
BOOL Release(void )
{
if(lpDIMouse){
lpDIMouse->Unacquire();
lpDIMouse->Release();
}
if(lpDIKey){
lpDIKeyboardboard->Unacquire();
lpDIKeyboardboard->Release();
}
if(lpDInput){
lpDI->Release();
}
return TRUE;
}
///////////////////////////////////////////////////////////////////////////////
短消息
资料
加为好友
全部帖子
性别:
精华:
0
威望:
39
贡献:
0
金钱:
0
状态:
离线
等级:
我是天心飞仙
初生襁褓狮
帖子:
33
注册:
2006-08-13
来自:
发表于: 2006-08-16 12:59
|
只看楼主
短消息
资料
字号:
小
中
大
4楼
注意:实现部分的错误处理我用了 ShowError这个函数,它不是标准的函数,只是我自己创建的一个便于输入的函数。内容如下:
void ShowError(const char * msg)
{
MessageBox(NULL,msg,"Error!",MB_OK);
}
(本文结)
短消息
资料
加为好友
全部帖子
性别:
精华:
0
威望:
39
贡献:
0
金钱:
0
状态:
离线
等级:
我是天心飞仙
初生襁褓狮
帖子:
33
注册:
2006-08-13
来自:
发表于: 2006-08-17 12:06
|
只看楼主
短消息
资料
字号:
小
中
大
5楼
无人区?
郁闷ing...
短消息
资料
加为好友
全部帖子
性别:
精华:
0
威望:
39
贡献:
0
金钱:
0
状态:
离线
等级:
<<
上一主题
|
下一主题
>>
1
1
/ 1 页
跳转
页
论坛跳转...
企业产品讨论区
瑞星安全云终端软件
瑞星ESM防病毒终端安全防护系统
瑞星杀毒软件网络版(含Linux)
北方区
华东区
华南区
木马入侵拦截有奖体验专区
瑞星2009版查杀引擎测试
瑞星2009测试版问题反馈
瑞星杀毒软件2009公测
瑞星个人防火墙2009公测
瑞星全功能安全软件2009公测
瑞星智能沙箱分析/恶意代码威胁监测分析/上网行为管理
瑞星防毒墙5.0、瑞星下一代防火墙
瑞星虚拟化恶意代码防护系统
个人产品讨论区
瑞星之剑
瑞星防病毒安全软件
瑞星杀毒软件
瑞星安全联盟论坛
瑞星杀毒软件V16+
V16+新引擎测试专区
瑞星全功能安全软件
瑞星杀毒软件2011
瑞星个人防火墙V16
广告过滤
瑞星个人防火墙2011
瑞星AI网络威胁检测引擎、威胁情报及网安知识图谱
瑞星其他产品
瑞星手机安全助手
瑞星路由安全卫士
路由系统内核漏洞
APP保镖
瑞星安全浏览器
瑞星安全助手
卡卡上网安全助手
瑞星软件管家
瑞星加密盘
账号保险柜5.0
瑞星专业数据恢复
技术交流区
反病毒/反流氓软件论坛
菜鸟学堂
安全技术讨论
可疑文件交流
恶意网站交流
瑞星云安全网站联盟专版
每日网马播报
入侵防御(HIPS)
系统软件
硬件交流
综合娱乐区
Rising茶馆
影音贴图
瑞星安全游戏
凡人修真
华人德州扑克
一球成名
星际世界
神仙道
赢家竞技
梦幻飞仙
三国演义
仙落凡尘
秦美人
攻城掠地
女神联盟
风云无双
傲视九重天
深渊
魅影传说
热血屠龙
雷霆之怒
大天使之剑
传奇霸业
无上神兵
斗破沙城
全民裁决
蛮荒之怒2
活动专区
瑞星积分商城
实习生专区
实习生交流区
实习生签到区
实习生考核区
“安全之狮”校园行活动专版
历史活动
论坛9周年活动专区
关注灾情 同心抗灾
本站站务区
站务
版主之家[限]
禁言禁访记录
待审核
瑞星客户俱乐部[限]
2022网民网络安全感满意度调查活动,诚邀您的参与!
卡卡论坛新手入门
瑞星杀毒软件V17的个人介绍 by dg1vg4
在高分屏电脑运行Photoshop CS6,程序界面字体过小的问题有解啦~~~by baohe
iMac一体机装MAC/WIN10双系统的亲身体验 by baohe
我的主题
我的帖子
我的精华
我的好友
文本模式