51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 4407|回复: 0
打印 上一主题 下一主题

Kevin的DirectInput简明教程

[复制链接]
  • TA的每日心情
    慵懒
    2015-1-8 08:46
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]测试小兵

    跳转到指定楼层
    1#
    发表于 2007-12-13 11:06:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    使用DirectInput可分为以下5个步骤:
    1. 获得DirectInput接口IDirectInput8,可通过下面的全局函数获得:
    HRESULT DirectInput8Create(
      HINSTANCE hinst,   //应用程序的handle
      DWORD dwVersion,   //DirectInput的版本号IRECTINPUT_VERSION
      REFIID riidltf,    //DirectInput的GUID:IID_IDirectInput8
      LPVOID * ppvOut,   //指向LPDIRECTINPUT8的指针
      LPUNKNOWN pUnkOuter //NULL
    );

    2. 创建设备IDirectInputDevice8,使用IDirectInput8接口的方法:
    HRESULT CreateDevice(
      REFGUID rguid,    //设备的GUID
      LPDIRECTINPUTDEVICE * lplpDirectInputDevice, // 指向设备接口
      LPUNKNOWN pUnkOuter //NULL
    );

    键盘的GUID: GUID_SysKeyboard
    鼠标的GUID: GUID_SysMouse
    游戏控制器的GUID可以通过IDirectInput8的EnumDevices方法枚举出来
    3. 初始化设备
    a. 设置数据格式:
    使用IDirectInputDevice8的方法:
    HRESULT SetDataFormat(
      LPCDIDATAFORMAT lpdf //数据格式
    );

    DirectInput中定义了下面的3种设备的数据格式,可以直接使用
    c_dfDIKeyboard
    c_dfDIMouse
    c_dfDIJoystick
    b. 设置协作等级:
    使用IDirectInputDevice8的方法:
    HRESULT SetCooperativeLevel(
      HWND hwnd,   //窗口的handle
      DWORD dwFlags  //属性
    );

    协作等级的属性可以由下面的常量来定义:
    DISCL_BACKGROUND —— 允许窗口以后台方式访问设备
    DISCL_FOREGROUND —— 只能以前台方式访问设备
    DISCL_EXCLUSIVE  —— 独占模式
    DISCL_NONEXCLUSIVE —— 非独占模式
    DISCL_NOWINKEY  —— 不使用Windows键
    4. 获得使用权
    获得设备使用权,使用IDirectInputDevice8的方法:
    HRESULT Acquire();
    放弃使用权,使用IDirectInputDevice8的方法:
    HRESULT Unacquire();
    顺利完成以上工作以后我们就可以通过DirectInput来访问设备状态了!
    5. 访问设备状态
    访问设备状态通过IDirectInputDevice8的GetDeviceState()方法来实现
    HRESULT GetDeviceState(
      DWORD cbData,  //lvpData指向缓冲区的大小
      LPVOID lpvData  //指向用来存储设备状态的结构体
    );

    以下是3种设备所使用的状态存储结构
    a. 访问键盘
    使用一个包含256个字符的数组作为数据缓冲区
    每个按键的虚拟键值都在dinput.h中给出:DIK_*
    b. 访问鼠标
    使用DIMOUSESTATE类型作为缓冲区
    c. 访问游戏控制器
    使用DIJOYSTATE类型作为缓冲区
    游戏中只需在每一帧都调用GetDeviceState()方法来获取输入设备的状态,然后根据输入设备状态更新游戏逻辑即可。
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-16 07:46 , Processed in 0.068430 second(s), 27 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表