C#对游戏手柄的编程开发-API篇(1)

2)LParam参数:

并且要注意!不管您有没有按游戏手柄上的按钮,系统也会定时发送MM_JOYXMOVE消息!!

        /// <summary>
        /// 向系统申请捕获某个游戏杆并定时将该设备的状态值通过消息发送到某个窗口
        /// </summary>
        /// <param name="hWnd">窗口句柄</param>
        /// <param name="uJoyID">指定游戏杆(0-15),它可以是JOYSTICKID1或JOYSTICKID2</param>
        /// <param name="uPeriod">每隔给定的轮询间隔就给应用程序发送有关游戏杆的信息。这个参数是以毫妙为单位的轮询频率。</param>
        /// <param name="fChanged">是否允许程序当操纵杆移动一定的距离后才接受消息</param>
        /// <returns></returns>
        [DllImport("winmm.dll")]
        public static extern int joySetCapture(IntPtr hWnd, int uJoyID, int uPeriod, bool fChanged);

函数名称 函数说明
joyGetNumDevs 获取当前系统支持的游戏设备数量
joyGetDevCaps 查询获取指定的游戏杆设备以确定其性能
joySetCapture 向系统申请捕获某个游戏设备并定时将该设备的状态值通过消息发送到某个窗口
joyReleaseCapture 释放对某个游戏设备的捕获
joyGetPos 获取游戏设备的坐标位置和按钮状态
joyGetPosEx 获取游戏设备的坐标位置和按钮状态
joyGetThreshold 查询指定的游戏杆设备的当前移动阈值
joySetThreshold 设置指定的游戏杆设备的移动阈值

 

 

而对于JOYSTICKID2
系统暴发的信息包分别为MM_JOY2MOVE、MM_JOY2BUTTONDOWN、MM_JOY2BUTTONUP!

操作游戏手柄(杆)的API有以下多少个

某日在某个网站上玩一个Flash游戏时,突然想到,虽然也能采用手柄来玩Flash游戏,这该多爽图片 1
。但心痛的是,近来的Flash都是不帮助对娱乐手柄举办编程,这难免是Flash中的一个不满。。

PS:如果各位有趣味的可考虑一下怎么落实游戏手柄的“主动形式”编程开发。

 

 

虽说Flash中不帮助对游乐手柄进行编程,但我们可以换种形式,做一个相助程序(外挂?图片 2
),将手柄中的操作事件转换为Flash中可承受的键盘与鼠标操作事件,这样不就可以运用游戏手柄来玩Flash游戏了呢?!于是,上网查了相关资料,但却发现只有C++方面的案例,而C#一个也找不,这不打紧,自己动手,丰衣足食图片 3

 

(注:类似这样的职能,网络已有现成的软件,是一个日本人付出的,叫乔伊ToKey)

哪些判断按了怎么样键?

 

1)被动模式:

而对此游戏手柄来说,判断上下左右五个趋势键有没有被按下就是经过此参数进行判定的。如若当三个方向键都并未被按下时,表示近日玩耍手柄处于要旨坐标中!也就是X,Y坐标都是在主导点地方上,而当一些方向键被按下时,X,Y坐标将基于所按的键向对应方向偏移。如当按了向右键,则X坐标向右偏移,Y坐标保持在着力点地点,而只要按了右、上多个方向键同时按下,则X坐标向右偏移,Y坐标向上偏移。所以我们可以按照LParam参数取得X,Y坐标的值,然后再遵照其中央点来判定。参考代码如下:

而在本篇中,我们要上课的只是“被动情势”。

/Files/kingthy/JoyKeys.rar

内部,遵照调用不同的法子又可分为二种艺术。

运用系统API是一种最简便的法门,因为系统已帮我们封装好了具备细节,我们只要在先后中定时收获游戏手柄设备的景色就可以了(轮循)。

同时依照不同的u乔伊(Joy)ID值,系统发送的音信号又会并行不悖,如对于JOYSTICKID1系统将会独家发送以下信息包:

在消息包中,游戏手柄的状态音信(按钮状态)分别存储在信息包中的WParam与LParam参数。

joySetCapture方法的C#概念原型如下:

假诺申请成功,系统将会定时(遵照uPeriod的值决定时间的长度)将游乐手柄的图景以音讯包情势发送到hWnd对应的窗口界面。所以我们务必要在先后中处理相应的信息(如重写WndProc方法进行拍卖)。

 

消息号 说明
MM_JOY1MOVE 当手柄的位置已变动或按了某些按钮时,将会发送此消息包。
MM_JOY1BUTTONDOWN 当手柄的A,B,C,D四个按钮中的一个或多个正被按下时,将会发送此消息包。
MM_JOY1BUTTONUP 当手柄的A,B,C,D四个按钮中的一个或多个正被弹起时,将会发送此消息包。

前段时间花38元从网上买了一对北通的USB游戏手柄,这样周末与夜晚的赏月时光就足以玩玩孩儿时的SFC与街机模拟游戏了。图片 4

对娱乐手柄举行操作,大概有几种模式:接纳系统API或者选取DirectInput操作游戏手柄设备。(也许还有另外格局,但自己的学识范围有限,此外方法就不得而知了)

此参数存储的是玩玩手柄的坐标参数,并且此参数的高16位存储的是Y坐标值,低16位存储的是X坐标值。

 

    
即是按照我们团结一心的急需,按需调用joyGetPos或joyGetPosEx方法查询拿到某个游戏手柄的当前状态。

好了,对娱乐手柄的“被动情势”编程就讲解完成了,剩下的就是要怎么利用游玩手柄来实现模拟键盘或鼠标的操作了……

示范代码下载:

1)WParam参数:

2)主动格局:

对于游戏手柄来说WParam存储的是了上下左右六个方向键之外的享有按钮中当前被按下的按钮值,它的值是一个复合值。如它的值为JOY_BUTTON1
| JOY_BUTTON2时,就标明按下的按键是1号和2号按钮。

 

    
调用joySetCapture方法,向系统报名对某个游戏手柄的捕捉,即便成功申请,系统将会定时将此娱乐手柄的情事音信透过音讯模式通知到我们的某部窗口上。

当大家调用此办法向系统报名捕获某个游戏手柄后,假诺成功,则赶回JOYERR_NOERROR(值为0),否则重返其余值的话代表报名破产。并且在不再需要捕获游戏手柄时要记得调用joyReleaseCapture方法释放捕捉。

注意:对于MM_JOYXBUTTONDOWN与MM_JOYXBUTTONUP多少个信息,用于判断的按钮值是不同于MM_JOYXMOVE的按钮值!!

 

 

       /// <summary>
        /// 获取X,Y轴的状态
        /// </summary>
        /// <param name="lParam"></param>
        /// <param name="buttons"></param>
        private void GetXYButtonsStateFromLParam(int lParam, ref JoystickButtons buttons)
        {
            //处理X,Y轴
            int x = lParam & 0x0000FFFF;                //低16位存储X轴坐标
            int y = (int)((lParam & 0xFFFF0000) >> 16); //高16位存储Y轴坐标(不直接移位是为避免0xFFFFFF时的情况)
            int m = 0x7EFF;                             //中心点的值
            if (x > m)
            {
                buttons |= JoystickButtons.Right;
            }
            else if (x < m)
            {
                buttons |= JoystickButtons.Left;
            }
            if (y > m)
            {
                buttons |= JoystickButtons.Down;
            }
            else if (y < m)
            {
                buttons |= JoystickButtons.UP;
            }
        }

 

 

 

相关文章