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

日期:2019-10-15编辑作者:金沙棋牌游戏官方网站

目前花38元从英特网买了一对北通的USB游戏手柄,那样礼拜日与晚上的闲雅时光就足以嬉戏孩儿时的SFC与街机模拟游戏了。图片 1

 

某日在有些网址上玩一个Flash游戏时,突然想到,假如也能采用手柄来玩Flash游戏,那该多爽图片 2 。但缺憾的是,近日的Flash都以不帮衬对游戏手柄举办编程,那难免是Flash中的贰个可惜。。

虽说Flash中不帮忙对游戏手柄实行编制程序,但大家能够换种办法,做二个帮衬程序(外挂?图片 3 ),将手柄中的操作事件调换为Flash中可承受的键盘与鼠标操作事件,那样不就足以行使游戏手柄来玩Flash游戏了吧?!于是,上网查了有关材料,但却发现独有C++方面包车型大巴案例,而C#C#对游戏手柄的编程开发-API篇(1)。二个也找不,那不打紧,自身出手,男耕女织图片 4

 

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

(注:类似那样的效能,网络已有现有的软件,是四个印尼人支付的,叫JoyToKey)

 

对游戏手柄进行操作,大约有三种情势:选择系统API可能应用DirectInput操作游戏手柄设备。(可能还会有别的格局,但作者的文化范围有限,其它措施就一无所知了)

C#对游戏手柄的编程开发-API篇(1)。使用系统API是一种最简便的不二秘籍,因为系统已帮大家封装好了有着细节,大家假使在程序中按时获得游戏手柄设备的动静就可以了(轮循)。

 

操作游戏手柄(杆)的API有以下多少个C#对游戏手柄的编程开发-API篇(1)。:

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

 

在那之中,依照调用差别的主意又可分为三种情势。

1)被动方式:

C#对游戏手柄的编程开发-API篇(1)。     调用joySetCapture方法,向系统报名对某些游戏手柄的捕捉,若是成功申请,系统将会定时将此游玩手柄的景色音讯经过音信情势公告到我们的某部窗口上。

2)主动格局:

     正是依据大家和好的需求,按需调用joyGetPos或joyGetPosEx方法查询获得有些游戏手柄的当前状态。

 

而在本篇中,大家要上课的只是“被动格局”。

 

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

        /// <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);

当大家调用此格局向系统报名捕获某些游戏手柄后,假若成功,则赶回JOYESportageHighlander_NOE奔驰G级RO汉兰达(值为0),否则再次回到此外值的话代表报名倒闭。何况在不再须求捕获游戏手柄时要记得调用joyReleaseCapture方法释放捕捉。

 

若果申请成功,系统将会定期(遵照uPeriod的值决定时间的尺寸)将游乐手柄的事态以音信包格局发送到hWnd对应的窗口分界面。所以我们必须求在前后相继中管理相应的新闻(如重写WndProc方法开展管理)。

再者依据不相同的u乔伊ID值,系统发送的新闻号又会迥然不一致,如对于JOYSTICKID1连串将会独家发送以下音信包:

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

 

而对此JOYSTICKID2 系统爆发的新闻包分别为MM_JOY2MOVE、MM_JOY2BUTTONDOWN、MM_JOY2BUTTONUP!

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

 

什么推断按了什么键?

在新闻包中,游戏手柄的地方音信(按键状态)分别存款和储蓄在消息包中的WParam与LParam参数。

1)WParam参数:

对于游戏手柄来讲WParam存款和储蓄的是了内外左右四个方向键之外的具有按键中当前被按下的开关值,它的值是二个复合值。如它的值为JOY_BUTTON1 | JOY_BUTTON2时,就标注按下的按钮是1号和2号开关。

注意:对于MM_JOYXBUTTONDOWN与MM_JOYXBUTTONUP三个消息,用于推断的按键值是分裂于MM_JOYXMOVE的开关值!!

 

2)LParam参数:

此参数存款和储蓄的是娱乐手柄的坐标参数,何况此参数的高14位存款和储蓄的是Y坐标值,低十多少人存款和储蓄的是X坐标值。

而对于游戏手柄来讲,剖断上下左右多个方向键有未有被按下就是透过此参数举办推断的。倘诺当多少个方向键都未曾被按下时,表示近期游乐手柄处于核心坐标中!也便是X,Y坐标都是在核心点地点上,而当某个方向键被按下时,X,Y坐标将基于所按的键向对应方向偏移。如当按了向右键,则X坐标向右偏移,Y坐标保持在基本点地点,而只要按了右、上四个方向键同时按下,则X坐标向右偏移,Y坐标向上偏移。所以我们得以依据LParam参数获得X,Y坐标的值,然后再依靠当中央点来决断。参谋代码如下:

       /// <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;
            }
        }

 

好了,对娱乐手柄的“被动方式”编制程序就解说完结了,剩下的便是要怎么选用游玩手柄来兑现模拟键盘或鼠标的操作了……

PS:假若各位风野趣的可思虑一下怎么落到实处休闲游手柄的“主动格局”编制程序开辟。

 

身体力行代码下载:

/Files/kingthy/JoyKeys.rar

本文由新金沙国际手机版发布于金沙棋牌游戏官方网站,转载请注明出处:C#对游戏手柄的编程开发-API篇(1)

关键词:

XCodeGhost表明:为了安全,开发工具应该从官方网

今天的热门话题就是XCode编译器,这个神器在火热的移动互联网浪潮下也被人利用了,据文章分析(XCode编译器里有鬼...

详细>>

CacheManager:–个通用缓存接口抽象类库

CacheManager:–个通用缓存接口抽象类库。CacheManager是–个缓存通用接口抽象类库,它支持各种高速缓存提供者,例如Me...

详细>>

大脑如同编程,bug如何修复?

再看“Right” 一旦记住“No.Right.Now.”多个单词,并以此来辅导和调节你的生存。你就会轻轻巧松订正大脑的bug,并养...

详细>>

前端 Mac 工具集

整理了我开发和日常使用环境中一些十分棒,能提升mac使用满足感的一些玩意儿 输入法 搜狗输入法 浏览器 Chrome Ch...

详细>>