教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 文库大全 > 专业资料 >

Windows下对游戏杆编程

来源:网络收集 时间:2026-09-12
导读: 介绍游戏杆的编程 我现在所知道的获取游戏杆输入的方法有4种,第4种才是我要说的正题。 1.用DDK通过USB接口直接访问游戏杆 2.通过汇编访问游戏杆 据说在NT下不能这么用了 3.用Direct Input 也许会很方便,但我对之不感兴趣也不了解,这里只是提一下。不过

介绍游戏杆的编程

我现在所知道的获取游戏杆输入的方法有4种,第4种才是我要说的正题。

1.用DDK通过USB接口直接访问游戏杆

2.通过汇编访问游戏杆

据说在NT下不能这么用了

3.用Direct Input

也许会很方便,但我对之不感兴趣也不了解,这里只是提一下。不过这个方法似乎比其他的都完善些,以后有空再研究。

4.用Windows API

在DDK的文档中,查到几个关于joystick的API,在winmm.dll中(受我查到的第一份资料误导,我还以为只能用DDK来做,早知道就去查MSDN了)。要使用这几个API,VC下编程时,需要连接winmm.lib,包含mmsystem.h头文件;Delphi下编程时需在uses子句中加上mmsystem单元。这几个API的作用:

joyGetDevCaps 查询指定的游戏杆设备以确定其性能

joyGetNumDevs 返回系统支持的游戏杆设备的数量

joyGetPos 查询指定的游戏杆设备的位置和活动性

joyGetPosEx 查询一个游戏杆设备的位置和它的按扭状态

joyGetThreshold 查询指定的游戏杆设备的当前移动阈值

joyReleaseCapture 释放由JoySetCapture函数设置的在指定游戏杆设备上的捕获

joySetCapture 发送一个游戏杆消息到指定的窗口

joySetThreshold 设置指定的游戏杆设备的移动阈值

用这些API访问游戏杆,主要有两种方式:消息和轮询。

介绍游戏杆的编程

消息:

使用joySetCapture函数,使指定的窗口接受游戏杆的消息。

JoySetCapture定义:

MMRESULT joySetCapture(HWND hwnd, UINT uJoyID, UINT uPeriod,BOOL fChanged);

[1] hwnd -----父窗口句柄。

[2] uJoyID ----指定游戏杆,它可以是JOYSTICKID1或JOYSTICKID2,即第一、第二个游戏杆。

[3] uPeriod ----每隔给定的轮询间隔就给应用程序发送有关游戏杆的信息。这个参数是以毫秒为单位的轮询间隔时间。

[4] fChanged ----改变位置标识,可设为false。

返回值:

/* joystick error return values */

#define JOYERR_NOERROR (0) /* no error */

#define JOYERR_PARMS (JOYERR_BASE+5) /* bad parameters */

#define JOYERR_NOCANDO (JOYERR_BASE+6) /*request not completed */

#define JOYERR_UNPLUGGED (JOYERR_BASE+7) /*joystick is unplugged */

然后就可以通过接受游戏杆消息来响应游戏杆了。

游戏杆消息:

#define MM_JOY1MOVE 0x3A0 /* joystick */

#define MM_JOY2MOVE 0x3A1

#define MM_JOY1ZMOVE 0x3A2

#define MM_JOY2ZMOVE 0x3A3

#define MM_JOY1BUTTONDOWN 0x3B5

介绍游戏杆的编程

#define MM_JOY2BUTTONDOWN 0x3B6

#define MM_JOY1BUTTONUP 0x3B7

#define MM_JOY2BUTTONUP 0x3B8

要释放游戏杆的捕获时,使用joyReleaseCapture函数。它只有一个参数,就是游戏杆的标识JOYSTICKID1或JOYSTICKID2。

注意:

1.我们一般喜欢在游戏的大循环中自己轮询输入信息,而不是监视消息队列。实际上,接受消息的方式比下面要讲到的直接轮询的效率低一些,对游戏杆的反应有明显的延迟。

2.我用两个手柄来测试,一个北通,一个酷豹。酷豹总是被识别为JOYSTICKID1,而北通总是被识别为JOYSTICKID2。然后我改用两个完全相同的北通手柄来测试,则其中 一个被识别为JOYSTICKID2,另一个不被识别,而JOYSTICKID1则被认为未插入。这个问题我现在还不知道原因和解决方法。另一个问题:倘若我只插入酷豹手柄,或者插入一个北通和一个酷豹,则窗口可以正确接收手柄消息。但是只插入一个北通的话,可以正确检测到手柄的存在,但是接受不到手柄的消息。莫非还缺少了什么步骤?还望高人指点。

轮询:

主要是利用joyGetPosEx函数主动取得游戏杆信息。这样我们就可以在游戏循环中对手柄状态进行轮询。joyGetPosEx定义如下:

MMRESULT joyGetPosEx(UINT uJoyID, LPJOYINFOEX pji);

[1] uJoyID ----指定游戏杆,它可以是JOYSTICKID1或JOYSTICKID2,即第一、第二个游戏杆。

[2] pji ---- 函数通过这个参数返回游戏杆的信息。参数的类型定义如下:

typedef struct joyinfoex_tag {

DWORD dwSize; /* size of structure */

DWORD dwFlags; /* flags to indicate what to return */

DWORD dwXpos; /* x position */

DWORD dwYpos; /* y position */

介绍游戏杆的编程

DWORD dwZpos; /* z position */

DWORD dwRpos; /* rudder/4th axis position */

DWORD dwUpos; /* 5th axis position */

DWORD dwVpos; /* 6th axis position */

DWORD dwButtons; /* button states */

DWORD dwButtonNumber; /* current button number pressed */

DWORD dwPOV; /* point of view state */

DWORD dwReserved1;

DWORD dwReserved2;

} JOYINFOEX, *PJOYINFOEX, NEAR *NPJOYINFOEX, FAR *LPJOYINFOEX;

使用此函数前要先通过设置pji->dwFlags的值来指定要返回的值,否则很可能会得不到想要的信息,我因为没注意这点而郁闷了很久。dwFlags的值可用下列预定义常数来设置:

#define JOY_RETURNX 0x00000001l

#define JOY_RETURNY 0x00000002l

#define JOY_RETURNZ 0x00000004l

#define JOY_RETURNR 0x00000008l

#define JOY_RETURNU 0x00000010l /* axis 5 */

#define JOY_RETURNV 0x00000020l /* axis 6 */

#define JOY_RETURNPOV 0x00000040l

#define JOY_RETURNBUTTONS 0x00000080l

#define JOY_RETURNRAWDATA 0x00000100l

#define JOY_RETURNPOVCTS 0x00000200l

#define JOY_RETURNCENTERED 0x00000400l

介绍游戏杆的编程

#define JOY_USEDEADZONE 0x00000800l

#define JOY_RETURNALL (JOY_RETURNX | JOY_RETURNY | JOY_RETURNZ | \

JOY_RETURNR | JOY_RETURNU | JOY_RETURNV | \

JOY_RETURNPOV | JOY_RETURNBUTTONS)

函数返回值与joySetCaptur …… 此处隐藏:2861字,全部文档内容请下载后查看。喜欢就下载吧 ……

Windows下对游戏杆编程.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wenku/1759803.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)