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

回顾“被动方式”开发

在C#对游戏手柄的编程开发-API篇(1)这篇文章中我们介绍了“被动方式”的开发。在此方式下,我们 的程序只扮演一个消息接收者。系统会定时告诉我们某个游戏手柄当前的状态,我们的程序接收到后再按 实际需要进行处理即可。但如果你是一个细心的人,你会发现如果直接按消息事件处理的话会存在一个问 题,如我们按下某个键(比如向上的方向键)然后放开时,对于我们“人”来说,我们按下与弹起的这两 个动作应该只是说明我们只点击这个按钮一次。但对于系统来说,它只是机械地定时通知我们的程序在某 个时间内游戏手柄的各个按钮的状态,而在我们按下到弹起这段时间内,系统有可能已经传递了N次的消 息通知(N值根据捕捉时设置的uPeriod值与你的按键速度来决定),通知手柄有按钮处于被按下状态,而 如果我们就根据消息包直接处理点击事件的话,就会导致问题出现(比如在某个游戏中,我们设计的是当 点击一次手柄的右键,就将角色向前移动一步。但从我们按下按钮到弹开此按钮这段时间,由于人的反应 速度远远慢于电脑的处理速度,所以这段很短的时间内,系统可能已通知了10次以上的消息包表明游戏手 柄右键已被按下,这就导致我们按一次右键,游戏中的角色却有可能已移动了十步之多,这可不是我们想 要的结果)。那我们要怎样处理这个“点击”事件才可以避免重复通知呢?这就是本篇最后要重点讲解的 内容了……

在讲解这个问题的解决方法之前我们再来讲解一下上文还提到的一种开发方式。

“主动方式”的开发

主动方式即我们不需要向系统申请注册捕捉某个游戏手柄,我们只是根据自己的需要按时去获取游戏 手柄的状态信息。

这时我们就要用到以下的API函数。

/// <summary>
            /// 获取操纵杆位置和按钮状态
            /// </summary>
            /// <param name="uJoyID"></param>
            /// <param name="pji"></param>
            /// <returns></returns>
            [DllImport("winmm.dll")]
            public static extern int joyGetPos(int uJoyID, ref JOYINFO pji);
            /// <summary>
            /// 获取操纵杆位置和按钮状态
            /// </summary>
            /// <param name="uJoyID"></param>
            /// <param name="pji"></param>
            /// <returns></returns>
            [DllImport("winmm.dll")]
            public static extern int joyGetPosEx(int uJoyID, ref JOYINFOEX pji);

时间: 2016-08-16

C#对游戏手柄的编程开发-API篇(2)的相关文章

艾伟:C#对游戏手柄的编程开发-API篇(2)

回顾"被动方式"开发 在C#对游戏手柄的编程开发-API篇(1)这篇文章中我们介绍了"被动方式"的开发.在此方式下,我们的程序只扮演一个消息接收者.系统会定时告诉我们某个游戏手柄当前的状态,我们的程序接收到后再按实际需要进行处理即可.但如果你是一个细心的人,你会发现如果直接按消息事件处理的话会存在一个问题,如我们按下某个键(比如向上的方向键)然后放开时,对于我们"人"来说,我们按下与弹起的这两个动作应该只是说明我们只点击这个按钮一次.但对于系统来

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

对游戏手柄的编程开发在上两篇中,已讲解完,在此篇中将讲解对键盘的模拟. 对键盘的模拟,系统已提供了非常多的API函数,在这里就不一一讲解了,只讲解其中一个最简单的 API函数 . /// <summary> /// 模拟键盘事件 /// </summary> /// <param name="bVk">虚拟键值</param> /// <param name="bScan"></param> /

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

前段时间花38元从网上买了一对北通的USB游戏手柄,这样周末与晚上的休闲时间就可以玩玩孩儿时的 SFC与街机模拟游戏了.开发-API篇(1)-c站"> 某日在某个网站上玩一个Flash游戏时,突然想到,如果也能使用手柄来玩Flash游戏,那该多爽 . 但可惜的是,目前的Flash都是不支持对游戏手柄进行编程,这不免是Flash中的一个遗憾.. 虽然Flash中不支持对游戏手柄进行编程,但我们可以换种方法,做一个辅助程序(外挂? ) ,将手柄中的操作事件转换为Flash中可接受的键盘与鼠标操

Visual C#.Net 网络程序开发-Socket篇第1/2页_C#教程

Visual C#.Net 网络程序开发-Socket篇   作者: 宋华  作者: www.ASPCool.com  Microsoft.Net Framework为应用程序访问Internet提供了分层的.可扩展的以及受管辖的网络服务,其名字空间System.Net和System.Net.Sockets包含丰富的类可以开发多种网络应用程序..Net类采用的分层结构允许应用程序在不同的控制级别上访问网络,开发人员可以根据需要选择针对不同的级别编制程序,这些级别几乎囊括了Internet的所有需

C#.Net网络程序开发-Tcp篇

程序|网络 前一篇<Visual C#.Net网络程序开发-Socket篇>中说到:支持Http.Tcp和Udp的类组成了TCP/IP三层模型(请求响应层.应用协议层.传输层)的中间层-应用协议层,该层的类比位于最底层的Socket类提供了更高层次的抽象,它们封装 TCP 和 UDP 套接字的创建,不需要处理连接的细节,这使得我们在编写套接字级别的协议时,可以更多地尝试使用 TCPClient . UDPClient和TcpListener,而不是直接向 Socket 中写.它们之间的这种层次

iOS开发网络篇—使用ASI框架进行文件下载

iOS开发网络篇-使用ASI框架进行文件下载 说明:本文介绍iOS网络编程中经常用到的框架ASI,如何使用该框架进行文件的下载. 一.简单介绍 代码示例: 1 #import "YYViewController.h" 2 #import "ASIHTTPRequest.h" 3 4 @interface YYViewController () 5 6 7 @end 8 9 @implementation YYViewController 10 11 - (void)

java微信开发API第一步 服务器接入_java

微信开发API如何接入服务器,下面就为大家进行介绍 一.说明 * 本示例根据微信开发文档:http://mp.weixin.qq.com/wiki/home/index.html最新版(4/3/2016 5:34:36 PM )进行开发演示. * 编辑平台:myeclipse10.7+win32+jdk1.7+tomcat7.0  * 服务器:阿里云 windows server 2008 64bits * 平台要求:servlet使用注解方式,平台要求:j2ee6.0+.jdk6.0+.tom

《Hadoop与大数据挖掘》——2.4 Hadoop编程开发

2.4 Hadoop编程开发 Hadoop框架最核心的设计就是HDFS和MapReduce.HDFS为海量的数据提供了存储,则MapReduce为海量的数据提供了计算.本节就MapReduce开发相关内容进行分析,包括HDFS Java API操作.MapReduce原理.MapReduce相关流程组件配置及编程等.最后将给出两个算法:Kmeans算法.Tf-idf算法的动手实践,加深对MapReduce编程的认识和理解. 2.4.1 HDFS Java API操作 Hadoop中关于文件操作类

《Hadoop与大数据挖掘》一2.4 Hadoop编程开发

2.4 Hadoop编程开发 Hadoop框架最核心的设计就是HDFS和MapReduce.HDFS为海量的数据提供了存储,则MapReduce为海量的数据提供了计算.本节就MapReduce开发相关内容进行分析,包括HDFS Java API操作.MapReduce原理.MapReduce相关流程组件配置及编程等.最后将给出两个算法:Kmeans算法.Tf-idf算法的动手实践,加深对MapReduce编程的认识和理解.